Эффективное тестирование программного обеспечения

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

В этой книге представлены основы систематического эффективного тестирования программного обеспечения. Показаны способы автоматизировать часть этого процесса, приводятся шаблоны проектирования, которые помогут писать легко контролируемый и простой для наблюдения код. Обсуждаются модульные, интеграционные и системные тесты; рассматривается передовой опыт работы с тестовым кодом. Издание адресовано разработчикам с разным уровнем знаний: начинающие детально изучат процесс тестирования на конкретных примерах, опытные познакомятся с новыми практическими приемами и отточат имеющиеся навыки. Сайт книги https://www.efficient-software-testing.com https://www.manning.com/books/Effective-software-test-ing https://github.com/efficient-software-testing/code

Author(s): Маурисио Аниче
Publisher: ДМК Пресс
Year: 2022

Language: Russian
Pages: 370
City: М.
Tags: testing

Оглавление
Содержание
Предисловие
Вступление
Благодарности
О книге
Кому адресована книга
Организация книги
О чем не рассказывается в книге
О примерах программного кода
Живое обсуждение книги
Отзывы и пожелания
Список опечаток
Нарушение авторских прав
Об авторе
Об иллюстрации на обложке
Глава 1. Эффективное и систематическое тестирование программного обеспечения
1.1. Разница между разработчиками, тестирующими и не тестирующими свой код
1.2. Эффективное тестирование программного обеспечения для разработчиков
1.2.1. Эффективное тестирование в процессе разработки
1.2.2. Эффективное тестирование как итеративный процесс
1.2.3. Сосредоточение внимания на разработке, а затем на тестировании
1.2.4. Миф о «правильности по замыслу»
1.2.5. Стоимость тестирования
1.2.6. Что подразумевается под словами «эффективный» и «систематический»
1.2.7. Роль автоматизации тестирования
1.3. Принципы тестирования программного обеспечения (или Почему тестирование такое сложное)
1.3.1. Всеобъемлющее тестирование невозможно
1.3.2. Своевременное прекращение тестирования
1.3.3. Изменчивость важна (парадокс пестицидов)
1.3.4. В одних частях ошибок больше, чем в других
1.3.5. Никакой объем тестирования не будет идеальным или достаточным
1.3.6. Контекст имеет решающее значение
1.3.7. Верификация не валидация
1.4. Пирамида тестирования и на чем следует сосредоточиться
1.4.1. Модульное тестирование
1.4.2. Интеграционное тестирование
1.4.3. Системное тестирование
1.4.4. Когда использовать каждый уровень тестирования
1.4.5. Почему я предпочитаю модульные тесты?
1.4.6. Что я тестирую на разных уровнях?
1.4.7. Что делать, если вы не согласны с пирамидой тестирования
Размеры тестов, а не их охват
1.4.8. Поможет ли эта книга найти все ошибки?
Упражнения
Итоги
Глава 2. Тестирование на основе спецификаций
2.1. Требования говорят сами за себя
2.1.1. Шаг 1: изучение требований, входных и выходных данных
2.1.2. Шаг 2: исследование, что делает программа для различных входных данных
2.1.3. Шаг 3: изучение возможных входных и выходных данных и определение разделов
2.1.4. Шаг 4: анализ границ
2.1.5. Шаг 5: определение списка тестов
2.1.6. Шаг 6: автоматизация тестирования
2.1.7. Шаг 7: расширение набора тестов с применением творческой смекалки и опыта
2.2. Коротко о тестировании на основе спецификаций
2.3. Поиск ошибок с помощью тестирования на основе спецификаций
2.4. Тестирование на основе спецификаций в реальных условиях
2.4.1. Процесс тестирования должен быть итеративным, а не последовательным
2.4.2. Как далеко следует заходить при тестировании на основе спецификаций?
2.4.3. Раздел или граница? Не имеет значения!
2.4.4. Точек включения и исключения достаточно, но не стесняйтесь добавлять точки входа и выхода
2.4.5. Используйте варианты одних и тех же входных данных для более полного понимания
2.4.6. Когда количество комбинаций резко возрастает, оставайтесь прагматичными
2.4.7. Если сомневаетесь, используйте самые простые входные данные
2.4.8. Выбирайте разумные значения входных данных, которые вас не беспокоят
2.4.9. Проверяйте на null и исключительные случаи, только когда это имеет смысл
2.4.10. Используйте параметризованные тесты, когда тесты имеют одну и ту же структуру
2.4.11. Требования могут иметь любую степень детализации
2.4.12. Применима ли предложенная методика для тестирования классов и состояний?
2.4.13. Роль опыта и творчества
Упражнения
Итоги
Глава 3. Структурное тестирование и охват кода
3.1. Охват кода, правильный способ
3.2. Кратко о структурном тестировании
3.3. Критерии охвата кода
3.3.1. Охват строк
3.3.2. Охват ветвей
3.3.3. Охват условий + ветвей
3.3.4. Охват путей
3.4. Сложные условия и критерий охвата MC/DC
3.4.1. Абстрактный пример
3.4.2. Создание набора тестов по критерию MC/DC
3.5. Тестирование циклов и других подобных конструкций
3.6. Классификация и выбор критериев
3.7. Тестирование на основе спецификаций и структурное тестирование: практический пример
3.8. Граничное и структурное тестирование
3.9. Одного структурного тестирования часто недостаточно
3.10. Структурное тестирование в реальном мире
3.10.1. Почему некоторые испытывают неприязнь к оценке охвата кода?
Эмпирические свидетельства в пользу охвата кода
3.10.2. Что означает достижение 100 % охвата?
3.10.3. Какой критерий охвата использовать
3.10.4. MC/DC для слишком сложных выражений, которые нельзя упростить
3.10.5. Другие критерии охвата
3.10.6. Когда полный охват нежелателен?
3.11. Мутационное тестирование
Упражнения
Итоги
Глава 4. Проектирование по контрактам
4.1. Пред- и постусловия
4.1.1. Ключевое слово assert
4.1.2. Строгие и слабые пред- и постусловия
4.2. Инварианты
4.3. Изменение контрактов и принцип подстановки Лисков
4.3.1. Наследование и контракты
4.4. Как проектирование по контрактам связано с тестированием?
4.5. Проектирование по контрактам в реальном мире
4.5.1. Слабые или строгие предусловия?
4.5.2. Проверка допустимости входных данных, контракты или и то и другое?
4.5.3. Утверждения и исключения: когда использовать то или другое
4.5.4. Исключение или возврат специального значения?
4.5.5. Когда не следует использовать проектирование по контрактам
4.5.6. Следует ли писать тесты для предусловий, постусловий и инвариантов?
4.5.7. Инструментальная поддержка
Упражнения
Итоги
Глава 5. Тестирование на основе свойств
5.1. Пример 1: программа проверки оценок за экзамены
5.2. Пример 2: тестирование метода unique
5.3. Пример 3: тестирование метода indexOf
5.4. Пример 4: тестирование класса Basket
5.5. Пример 5: создание сложных объектов предметной области
5.6. Тестирование на основе свойств в реальном мире
5.6.1. Тестирование на основе примеров и на основе свойств
5.6.2. Общие проблемы в тестах на основе свойств
5.6.3. Творческая смекалка имеет решающее значение
Упражнения
Итоги
Глава 6. Дублеры и имитации для тестирования
6.1. Пустышки, фиктивные объекты, заглушки, шпионы и имитации
6.1.1. Объекты-пустышки
6.1.2. Фиктивные объекты
6.1.3. Заглушки
6.1.4. Имитации
6.1.5. Шпионы
6.2. Введение в фреймворки имитаций
6.2.1. Заглушки
6.2.2. Имитации и ожидания
6.2.3. Захват аргументов
6.2.4. Моделирование исключений
6.3. Имитации в реальном мире
6.3.1. Недостатки имитаций
6.3.2. Что следует и не следует имитировать
6.3.3. Обертки для даты и времени
6.3.4. Имитация типов, которыми вы не владеете
6.3.5. Что другие говорят об имитациях?
Упражнения
Итоги
Глава 7. Проектирование с учетом простоты тестирования
7.1. Отделение инфраструктурного кода от предметного
7.2. Внедрение зависимостей и управляемость
7.3. Улучшение наблюдаемости классов и методов
7.3.1. Пример 1: добавление методов для упрощения проверок
7.3.2. Пример 2: наблюдение за поведением методов void
7.4. Передача зависимостей через конструктор класса и значений через параметры методов
7.5. Проектирование с учетом простоты тестирования на практике
7.5.1. Связность тестируемого класса
7.5.2. Тесная связь с тестируемым классом
7.5.3. Сложные условия и тестируемость
7.5.4. Приватные методы и тестируемость
7.5.5. Статические методы, синглтоны и тестируемость
7.5.6. Гексагональная архитектура и имитации как метод проектирования
7.5.7. Дополнительная информация о проектировании с учетом тестируемости
Упражнения
Итоги
Глава 8. Разработка через тестирование
8.1. Наш первый сеанс TDD
8.2. Размышления о первом опыте применения TDD
8.3. TDD в реальном мире
8.3.1. Использовать или не использовать TDD?
8.3.2. TDD следует использовать постоянно?
8.3.3. Подходит ли TDD для всех типов приложений?
8.3.4. Что говорят исследования о TDD?
8.3.5. Другие школы TDD
8.3.6. TDD и правильное тестирование
Упражнения
Итоги
Глава 9. Большие тесты
9.1. Когда использовать большие тесты
9.1.1. Тестирование больших компонентов
9.1.2. Тестирование больших компонентов, взаимодействующих с внешним кодом
Тестирование инструмента CK
Тестирование инструмента Andy
9.2. База данных и тестирование SQL
9.2.1. Что тестировать в SQL-запросе
9.2.2. Автоматизированные тесты для SQL-запросов
9.2.3. Настройка инфраструктуры для тестирования SQL
Открывает соединение с базой данных
Открывает и подтверждает транзакции
Сбрасывает состояние базы данных
Определяют вспомогательные методы, уменьшающие объем кода в тестах
9.2.4. Рекомендации
Используйте построители тестовых данных
Используйте надежные и многоразовые API утверждений
Минимизируйте объем необходимых данных
Учитывайте развитие схемы
Используйте (или не используйте) базу данных в памяти
9.3. Системные тесты
9.3.1. Введение в Selenium
9.3.2. Проектирование объектов страниц
9.3.3. Шаблоны и лучшие практики
Инициализируйте начальное состояние системы
Выполняйте каждый тест в чистом окружении
Давайте значимые названия элементам HTML
Тестируя сценарий использования, проверяйте каждый его этап
Используйте в проверках данные, поступающие от объектов страниц
Передавайте важные настройки в набор тестов извне
Выполняйте тестирование в нескольких браузерах
9.4. Заключительные замечания по большим тестам
9.4.1. Как сочетаются методы тестирования в больших тестах?
9.4.2. Анализ затрат/выгод
9.4.3. Будьте осторожны с методами, охваченными, но не проверенными тестами
9.4.4. Инфраструктурный код имеет большое значение
9.4.5. DSL и инструменты для разработки тестов клиентами
9.4.6. Тестирование веб-систем других типов
Системное тестирование программного обеспечения, отличного от веб-приложений
Упражнения
Итоги
Глава 10. Качество тестового кода
10.1. Отличительные черты поддерживаемого тестового кода
10.1.1. Тесты должны быть быстрыми
10.1.2. Тесты должны быть связными, независимыми и изолированными
10.1.3. Тесты должны иметь причину для существования
10.1.4. Тесты должны быть воспроизводимыми и надежными
10.1.5. Тесты должны иметь строгие утверждения
10.1.6. Тесты должны терпеть неудачу при изменении поведения
10.1.7. Тесты должны иметь единственную и четкую причину неудачи
10.1.8. Тесты должны быть простыми в разработке
10.1.9. Тесты должны легко читаться
10.1.10. Тесты должны позволять легко изменять и развивать их
10.2. Дурно пахнущие тесты
10.2.1. Чрезмерное дублирование
10.2.2. Нечеткие утверждения
10.2.3. Неправильное обращение со сложными или внешними ресурсами
10.2.4. Слишком обобщенные наборы тестовых данных
10.2.5. Чувствительные утверждения
Упражнения
Итоги
Глава 11. Заключение
11.1. Хотя модель выглядит линейной, итерации имеют фундаментальное значение
11.2. Разработка программного обеспечения без ошибок: миф или реальность?
11.3. Вовлекайте в процесс тестирования конечных пользователей
11.4. Модульное тестирование – сложная задача
11.5. Уделяйте внимание мониторингу
11.6. Что дальше?
Приложение A. Решения упражнений
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Глава 8
Глава 9
Глава 10
Ссылки
Предметный указатель