Учебник Тестирование ПО для начинающих
Концептуальный курс о культуре и стратегиях тестирования программного обеспечения — для разработчиков и начинающих QA-инженеров. Мы разбираем не инструменты, а мышление: зачем тестировать, почему ошибку дешевле найти рано, как устроена пирамида тестирования, как проектировать тест-кейсы, что такое TDD и как отличить хороший тест от плохого. Идеи показаны на запускаемых примерах Python с обычным assert. После курса вы будете понимать, что, как и зачем проверять, и сможете начать тестировать реальный проект.
Курс «Тестирование ПО: основы» состоит из 6 разделов и 23 уроков: Зачем тестировать, Уровни и виды тестирования, Проектирование тест-кейсов, Автоматизация и TDD, Качество тестов и метрики и Процесс и практика. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Зачем тестировать
- Цель тестирования: находить дефекты и давать уверенность
Зачем нужно тестирование: находить дефекты до пользователя и давать команде уверенность в изменениях. Главные цели простыми словами.
- Стоимость ошибки: почему раньше — дешевле
Почему дефект, найденный на этапе требований, стоит в разы дешевле, чем найденный в продакшене. Кривая роста стоимости ошибки.
- Верификация и валидация
Чем верификация (делаем продукт правильно) отличается от валидации (делаем правильный продукт). Простое объяснение и примеры.
- Ручное и автоматизированное тестирование. Мифы
Когда уместно ручное тестирование, а когда автоматизация. Сильные стороны каждого подхода и главные мифы о тестировании.
- Цель тестирования: находить дефекты и давать уверенность
2 Уровни и виды тестирования
- Пирамида тестирования
Пирамида тестирования: много быстрых unit-тестов, меньше интеграционных, ещё меньше медленных e2e. Почему именно такое соотношение.
- Уровни: модульное, интеграционное, системное, приёмочное
Четыре уровня тестирования: unit, integration, system, acceptance. Что проверяет каждый и в каком порядке они применяются.
- Функциональное и нефункциональное тестирование
Функциональное тестирование проверяет ЧТО делает система, нефункциональное — КАК: нагрузка, безопасность, юзабилити, производительность.
- Регрессионное, smoke и sanity
Регрессионное тестирование защищает от поломки старого; smoke — быстрая проверка «вообще запускается»; sanity — точечная проверка фикса.
- Пирамида тестирования
3 Проектирование тест-кейсов
- Что такое тест-кейс и его структура
Структура тест-кейса: предусловия, шаги, ожидаемый результат. Чем тест-кейс отличается от тестового сценария.
- Чёрный и белый ящик
Тестирование чёрного ящика (по поведению, без знания кода) и белого ящика (по структуре кода). Когда какой подход уместен.
- Таблицы решений, попарное и баг-репорт
Таблицы решений для комбинаций условий, попарное тестирование против комбинаторного взрыва и как написать полезный баг-репорт.
- Что такое тест-кейс и его структура
4 Автоматизация и TDD
- Что и зачем автоматизировать
Какие тесты стоит автоматизировать, а какие нет. ROI автоматизации, стабильные требования и частота повторения как критерии.
- TDD: red-green-refactor
Разработка через тестирование: сначала падающий тест (red), потом минимальный код (green), потом улучшение (refactor). Живой пример на Python.
- Паттерн AAA: Arrange-Act-Assert
Структура хорошего теста: Arrange (подготовка), Act (действие), Assert (проверка). Почему один тест должен проверять одну вещь.
- Тест-дублёры и хрупкие тесты
Mock, stub, fake — зачем подменять зависимости в тестах. Идея тест-дублёров и почему тесты на детали реализации становятся хрупкими.
- Что и зачем автоматизировать
5 Качество тестов и метрики
- Покрытие кода: что показывает и чего НЕ показывает
Code coverage измеряет, какой код выполнился во время тестов. Почему 100% покрытия не означает отсутствия багов.
- Признаки хорошего теста
Хороший тест быстрый, изолированный, детерминированный и читаемый (свойства FIRST). Что делает тест надёжным помощником.
- Антипаттерны: тесты на реализацию и флаки
Главные антипаттерны тестов: проверка деталей реализации вместо поведения и флаки-тесты (нестабильные). Почему они опасны.
- Сколько тестов нужно
Как понять, что тестов достаточно: риск, ценность, а не процент покрытия. Тестируем важное и опасное, а не всё подряд.
- Покрытие кода: что показывает и чего НЕ показывает
6 Процесс и практика
- Тестирование в жизненном цикле и Agile
Где тестирование в жизненном цикле разработки. Почему в Agile QA участвует с самого начала, а не только в конце спринта.
- Shift-left и непрерывное тестирование
Сдвиг тестирования влево по времени и непрерывное тестирование. Чем раньше проверяем, тем дешевле и быстрее обратная связь.
- CI и автозапуск тестов
Непрерывная интеграция (CI) автоматически прогоняет тесты на каждый push. Идея пайплайна и связь с GitHub Actions.
- Инструменты и как начать тестировать проект
Обзор тест-инструментов по экосистемам (pytest, JUnit, Jest, Playwright) и пошаговый план, как начать тестировать существующий проект.
- Тестирование в жизненном цикле и Agile