1. Введение в плейбук тестировщика
Этот плейбук — полный справочник по теории и практике тестирования программного обеспечения. Он охватывает все виды и типы тестирования, техники тест-дизайна и методы расчёта количества тест-кейсов. Материал структурирован для быстрого поиска и практического применения.
Плейбук будет полезен как начинающим тестировщикам, так и опытным инженерам, желающим систематизировать знания или использовать материал как шпаргалку на проекте.
2. Классификация видов и типов тестирования
Тестирование ПО классифицируется по множеству признаков. Ниже приведены основные классификации с подробными таблицами.
2.1 По уровню тестирования (Test Levels)
| Уровень | Объект | Кто выполняет | Основная цель | Инструменты |
|---|---|---|---|---|
| Модульное (Unit) | Отдельные функции, методы, классы | Разработчики | Проверка корректности изолированных компонентов | Pytest, JUnit, NUnit, Jest, Mocha |
| Интеграционное (Integration) | Взаимодействие между модулями | Разработчики, QA | Проверка API-контрактов, протоколов обмена | Postman, REST Assured, WireMock |
| Системное (System) | Система в целом | QA-инженеры | Проверка функциональных и нефункциональных требований | Selenium, Cypress, Playwright |
| Приемочное (Acceptance) | Готовый продукт | Заказчик, UAT-команда | Подтверждение готовности к релизу | Cucumber, FitNesse, ручное |
Подвиды по уровню:
- Component testing: тестирование больших компонентов (модулей), состоящих из множества классов
- Integration testing: может быть Big Bang (все сразу) или Incremental (постепенно: Top-Down, Bottom-Up)
- System Integration: взаимодействие с внешними системами (Third-party API, DB, legacy)
- Alpha / Beta testing: подвид приемочного — на стороне разработчика / у ограниченного круга пользователей
2.2 По знанию внутреннего устройства (Test Approaches)
| Подход | Знание внутреннего кода | Доступ к архитектуре | Когда применяется |
|---|---|---|---|
| Black Box (Чёрный ящик) | Нет | Нет | Функциональное тестирование, UI, API, приёмочные тесты |
| White Box (Белый ящик) | Полное | Да | Unit-тесты, покрытие кода, оптимизация, security |
| Grey Box (Серый ящик) | Частичное | Частичный (API, DB) | Интеграционные тесты, API-тесты, пентест |
White Box техники:
- Statement Coverage: каждая строка кода выполнена хотя бы раз
- Branch Coverage: каждое условие (if/else) было true и false
- Path Coverage: каждый возможный путь в коде пройден
- Condition Coverage: каждый атомарный булевый подвыражение — true и false
- MC/DC (Modified Condition/Decision Coverage): каждое условие независимо влияет на решение — стандарт для DO-178C (авиация)
2.3 По степени автоматизации
| Тип | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное (Manual) | Тестировщик вручную выполняет тест-кейсы | Гибкость, исследовательский подход, UX-оценка | Медленно, дорого на регрессии, human error |
| Автоматизированное (Automated) | Скрипты выполняют тесты автоматически | Быстро, регрессия за минуты, CI/CD | Разработка скриптов, поддержка, ложно-позитивные |
| Полуавтоматическое | Комбинация ручных и автоматических шагов | Баланс гибкости и скорости | Сложность в поддержке сценариев |
Что стоит автоматизировать:
- Регрессионные тесты (Core functionality)
- Smoke-тесты при каждом деплое
- API-тесты (быстрые, стабильные)
- Тесты производительности (нагрузка)
- Data-driven тесты (много данных)
2.4 По целям и задачам
| Тип | Цель | Когда выполняется | Продолжительность |
|---|---|---|---|
| Smoke | Проверить критическую функциональность (дымовое) | После каждого билда | 5-15 мин |
| Sanity | Проверить конкретные исправления | После фикса бага | 10-30 мин |
| Regression | Проверить, что изменения не сломали existing functionality | Перед релизом, в CI/CD | От 1 часа до дней |
| Re-testing | Проверить, что конкретный баг исправлен | После фикса бага | 5-20 мин |
| Confirmation | Подтвердить, что исправление работает корректно | После деплоя фикса | 10-30 мин |
| End-to-End (E2E) | Проверить полный пользовательский сценарий | Перед релизом | От 30 мин |
| Exploratory | Исследовать продукт без сценариев, найти неочевидные проблемы | На любом этапе | От 1 часа |
| Ad-hoc | Спонтанное тестирование без документации | При необходимости | От 10 мин |
| GUI / UI | Проверка пользовательского интерфейса | На всех этапах | Зависит от объёма |
| Usability (Юзабилити) | Проверка удобства использования | Перед релизом UI | 1-3 дня |
| Accessibility (Доступность) | Проверка доступа для людей с ограничениями | Перед релизом | 1-2 дня |
2.5 Функциональное тестирование (Functional Testing)
Проверка, что система выполняет заявленные функции в соответствии с требованиями.
| Подвид | Что проверяет | Пример |
|---|---|---|
| Functional | Базовые функции: авторизация, CRUD, расчёты | Проверка входа в систему с правильным паролем |
| Security | Безопасность: аутентификация, авторизация, шифрование | Проверка SQL-инъекций, XSS |
| Interoperability | Взаимодействие с другими системами | Проверка экспорта в PDF, интеграция с CRM |
| Data Integrity | Целостность данных | Проверка, что после ошибки данные не повреждены |
| Installation | Установка, обновление, удаление | Проверка чистой установки, обновления с предыдущей версии |
| Compliance | Соответствие стандартам и регуляциям | GDPR, PCI DSS, HIPAA, SOX |
| Localization | Перевод и адаптация для региона | Проверка языков, валют, форматов дат |
2.6 Нефункциональное тестирование (Non-Functional Testing)
| Тип | Что проверяет | Метрики | Инструменты |
|---|---|---|---|
| Performance | Скорость работы системы | Latency, Throughput, Response Time | JMeter, k6, Locust, Gatling |
| Load | Поведение под ожидаемой нагрузкой | RPS, Concurrent Users, CPU/RAM usage | JMeter, Yandex.Tank |
| Stress | Поведение при превышении нагрузки | Точка отказа, восстановление | JMeter, Chaos Monkey |
| Soak (Endurance) | Стабильность в течение длительного времени | Memory leak, degradation over time | JMeter, Locust |
| Scalability | Способность масштабироваться | Cost per RPS, speed of scale-up | k6, custom scripts |
| Reliability | Вероятность безотказной работы | MTBF, MTTR, Availability % | Prometheus, Grafana |
| Usability | Удобство использования | Task success rate, Time on task, SUS score | UserTesting, Hotjar, Maze |
| Security | Защищённость от атак | Количество уязвимостей, CVSS score | OWASP ZAP, Burp Suite, Nessus |
| Portability | Переносимость между средами | Количество совместимых платформ | Cross-browser testing, Docker |
| Maintainability | Лёгкость поддержки кода | Cyclomatic complexity, Code churn | SonarQube, CodeClimate |
| Recoverability | Способность восстанавливаться после сбоев | RTO, RPO | Chaos Engineering, Disaster Recovery drills |
Подвиды Performance тестирования:
- Spike testing: резкий скачок нагрузки (например, Black Friday)
- Volume testing: обработка большого объёма данных
- Capacity testing: определение максимальной ёмкости системы
- Latency testing: задержка при передаче данных
- Throughput testing: пропускная способность (транзакций/сек)
2.7 По времени выполнения тестов
| Тип | Описание | Пример |
|---|---|---|
| Static (Статическое) | Без запуска кода. Анализ кода, документации, требований | Code review, статический анализ (SonarQube), linting, review спецификации |
| Dynamic (Динамическое) | С запуском кода. Выполнение тестов в runtime | Любой запуск программы с тестовыми данными |
Методы статического тестирования:
- Informal review: неформальное обсуждение кода/документации
- Walkthrough: автор ведёт участников по материалу
- Technical review: техническая экспертиза коллегами
- Inspection: формальная проверка с ролями (автор, чтец, секретарь)
- Static analysis: автоматическая проверка кода без запуска
3. Техники тест-дизайна (Test Design Techniques)
Техники тест-дизайна — это методы создания тестов, обеспечивающие максимальное покрытие при минимальном количестве тест-кейсов. Каждая техника имеет свою формулу расчёта количества тестов.
3.1 Эквивалентное разделение (Equivalence Partitioning / EP)
Суть: Разбиение входных данных на классы эквивалентности, внутри которых система ведёт себя одинаково. Из каждого класса выбирается один представитель.
Правила выделения классов:
- Корректные (валидные) классы: данные, которые система должна успешно обработать
- Некорректные (невалидные) классы: данные, которые система должна отклонить
- Каждый класс содержит бесконечное количество значений, эквивалентных в поведении
- Если один представитель класса проходит — весь класс считается пройденным
- Один дефект может покрывать целый класс (bug masking)
Пример:
Поле «Возраст» принимает значения от 18 до 60:
| Класс | Тип | Представитель |
|---|---|---|
| < 18 | Невалидный | 15 |
| 18 - 60 | Валидный | 30 |
| > 60 | Невалидный | 70 |
Количество тестов: 3 (по одному на каждый класс)
3.2 Анализ граничных значений (Boundary Value Analysis / BVA)
Суть: На границах классов эквивалентности система наиболее склонна к ошибкам. Проверяются значения на границе, чуть выше и чуть ниже.
N = Количество границ × 3 (при использовании 3-value)
Варианты:
- 2-value BVA: граничное значение и следующее за границей (min, min+1), (max-1, max)
- 3-value BVA: граничное значение, предыдущее и следующее (min-1, min, min+1)
- Robust BVA: учитывает выход за пределы допустимого диапазона
- Worst-case BVA: все комбинации границ всех параметров
Пример для поля «Возраст» (18-60) — 2-value BVA:
| Граница | Значения |
|---|---|
| Нижняя (18) | 18 (OK), 19 (OK), 17 (невалид) |
| Верхняя (60) | 60 (OK), 59 (OK), 61 (невалид) |
Количество тестов: 2-value = 5 тестов; 3-value = 7 тестов (17,18,19,59,60,61 + 1 граничный)
3.3 Таблица принятия решений (Decision Table Testing)
Суть: Систематизация комбинаций условий (Causes) и соответствующих действий (Effects). Каждая комбинация — отдельный тест.
Структура таблицы:
- Conditions (Условия): бинарные входные данные (True/False)
- Actions (Действия): ожидаемый результат
- Rules (Правила): каждая колонка — одна комбинация
- Culling: удаление невозможных комбинаций
Пример: логин в систему
| Условие \ Правило | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| Логин верный | Да | Да | Нет | Нет |
| Пароль верный | Да | Нет | Да | Нет |
| Результат | Успех | Ошибка пароля | Ошибка логина | Ошибка логина |
Количество тестов: 2² = 4 (полный перебор) → после culling: 3 (правила 3 и 4 могут быть объединены)
3.4 Тестирование состояний и переходов (State Transition Testing)
Суть: Система рассматривается как конечный автомат. Тесты покрывают переходы между состояниями и проверяют недопустимые переходы.
Элементы:
- States (Состояния): режимы системы (LoggedOut, LoggedIn, Error, Locked)
- Transitions (Переходы): события, меняющие состояние (Login, Logout, Error)
- Events (События): триггеры переходов
- Invalid transitions: события, которые не должны срабатывать в данном состоянии
Пример: банковское приложение
| Состояние | Событие | Новое состояние |
|---|---|---|
| Idle | Insert Card | CardInserted |
| CardInserted | Enter PIN | PINEntered |
| PINEntered | Select Amount | AmountSelected |
| AmountSelected | Dispense Cash | Idle |
| Idle | Enter PIN (invalid) | — (без карты — недопустимо) |
Количество тестов = 4 (состояния) + 4 (валидных перехода) + 2 (недопустимых) = 10 тестов
Разновидности:
- 0-switch (State Coverage): каждое состояние посещено хотя бы раз
- 1-switch (Transition Coverage): каждый переход проверен
- N-switch: последовательности из N переходов — полное покрытие путей
3.5 Попарное тестирование (Pairwise / All-Pairs)
Суть: Комбинаторная техника, при которой проверяются все возможные пары значений параметров. Основана на том, что большинство дефектов вызывается комбинацией двух значений.
Vᵢ — количество значений i-го параметра
Алгоритм:
- Определить параметры и их значения
- Построить all-pairs таблицу
- Проверить, что каждая пара значений встретилась хотя бы один раз
- Добавить «подозрительные» комбинации (приоритетные)
Пример:
| Параметр | Значения |
|---|---|
| ОС | Windows, macOS, Linux |
| Браузер | Chrome, Firefox, Safari |
| Разрешение | 1920×1080, 1366×768 |
Полный перебор: 3×3×2 = 18 тестов. Pairwise: 6-9 тестов (экономия 50-70%).
3.6 Ортогональные массивы (Orthogonal Arrays / OATS)
Суть: Математический метод комбинаторного тестирования, использующий ортогональные массивы для минимизации количества тестов при сохранении равномерного покрытия.
k — количество параметров, V — количество уровней значений
Примеры массивов:
| Обозначение | Параметры | Значений | Тестов |
|---|---|---|---|
| L₉(3⁴) | 4 | 3 | 9 |
| L₈(2⁷) | 7 | 2 | 8 |
| L₁₆(4⁵) | 5 | 4 | 16 |
Для 4 параметров по 3 значения: полный перебор = 3⁴ = 81; ортогональный массив L₉ = 9 тестов.
Отличие от Pairwise:
- Pairwise покрывает все пары — OATS покрывает равномерно
- OATS жёстче математически, но иногда даёт больше тестов
- OATS требует таблицы массивов, Pairwise — алгоритм
3.7 Тестирование на основе сценариев использования (Use Case Testing)
Суть: Тесты создаются на основе реальных сценариев использования системы, описанных в Use Case или User Story.
Структура Use Case теста:
| Элемент | Описание |
|---|---|
| Use Case ID | Уникальный идентификатор |
| Название | Краткое описание сценария |
| Предусловия | Что должно быть выполнено перед тестом |
| Основной поток | Шаги успешного сценария (Happy Path) |
| Альтернативные потоки | Вариации успешного сценария |
| Исключительные потоки | Ошибочные ситуации |
| Постусловия | Ожидаемое состояние системы после теста |
Пример расчёта:
Use Case «Оформление заказа»:
- Основной поток: 1 тест (успешный заказ)
- Альтернативные: 3 (разные способы оплаты)
- Исключительные: 4 (недостаточно средств, товар закончился, ошибка платёжного шлюза, превышение лимита)
Итого: 1 + 3 + 4 = 8 тест-кейсов
3.8 Error Guessing (Угадывание ошибок)
Суть: Основана на интуиции и опыте тестировщика. Тесты создаются на основе типовых ошибок, ранее найденных дефектов и известных «болевых точек».
Типовые сценарии Error Guessing:
- Пустые значения: submit пустой формы
- Нулевые значения: деление на 0, скидка 0%
- Отрицательные значения: количество товара -1
- Граничные значения имён: 1 символ, 256 символов, пробелы, спецсимволы
- Одновременный доступ: два пользователя редактируют одну запись
- Прерывания: обрыв соединения, потеря питания
- Кэш: устаревшие данные в кэше
- Race conditions: одновременный вызов API несколько раз
- SQL-инъекции: «' OR 1=1; --»
- XSS: «<script>alert('XSS')</script>»
3.9 Исследовательское тестирование (Exploratory Testing)
Суть: Одновременное изучение, проектирование и выполнение тестов. Тестировщик самостоятельно исследует продукт, принимая решения на основе полученных результатов.
Подходы:
- Freestyle: без ограничений, полная свобода
- Session-based: тайм-бокс (45-90 мин), чартер (цель сессии), отчёт
- Scenario-based: сценарии от реальных пользователей
- Tour-based: «экскурсии» — тестирование по определённому маршруту (Подвал, Квартал красных фонарей, Аллея супермена)
Структура сессии (Session-Based Test Management — SBTM):
| Элемент | Описание |
|---|---|
| Чартер (Charter) | Цель сессии: «Исследовать регистрацию нового пользователя» |
| Timebox | 45-90 минут (не больше) |
| Notes | Заметки о найденных дефектах, вопросах, наблюдениях |
| Debrief | Краткий отчёт после сессии: что хорошего, что плохого, что нужно изменить |
3.10 Classification Tree Method (CTM) / Метод классификационных деревьев
Суть: Графическая техника для систематического разбиения входных данных на классификационные классы. Каждый класс разбивается на подклассы, формируя иерархическое дерево.
После сокращения: N = количество комбинаций классов (по одному из каждой ветви)
Пример: тестирование банковского перевода
Банковский перевод
├── Валюта
│ ├── RUB
│ ├── USD
│ └── EUR
├── Сумма
│ ├── Меньше лимита (<100k)
│ ├── На лимите (100k)
│ └── Больше лимита (>100k)
├── Получатель
│ ├── Свой счёт
│ └── Чужой счёт
└── Комиссия
├── Включена в сумму
└── Добавлена сверху
Полный перебор: 3×3×2×2 = 36 комбинаций. После pairwise-сокращения: ~8-12 тестов.
3.11 Доменный анализ (Domain Testing / Domain Analysis)
Суть: Расширение EP + BVA на многомерные домены. Каждый параметр рассматривается как измерение, а набор параметров — как многомерное пространство.
Термины:
- Domain (Домен): множество возможных значений параметра
- ON-point: значение, принадлежащее классу, на границе
- OFF-point: значение, не принадлежащее классу, ближайшее к границе
- IN-point: значение внутри класса (произвольное)
- OUT-point: значение вне класса (произвольное)
Пример для функции расчета доставки:
Параметры: Вес (W: 0-30 кг) и Расстояние (D: 0-500 км). Каждый — по 3 класса.
- ON-points: W=0, W=30, D=0, D=500
- OFF-points: W=-0.01 (или отрицательный), W=30.01, D=-0.01, D=500.01
- IN-points: W=15, D=250
- Всего: (4 ON + 4 OFF + 2 IN) × 2 (для W и D) = 20 тестов
4. Методы расчёта количества тест-кейсов
Правильная оценка количества тест-кейсов критически важна для планирования ресурсов, времени и бюджета тестирования.
4.1 Общие формулы оценки
Метрики на основе размера:
| Метрика | Формула | Описание |
|---|---|---|
| Test Case Density | TC / FP | Количество тестов на функциональную точку (обычно 3-10) |
| Test Case per Story | TC / User Story | В среднем 5-15 тестов на User Story |
| Test Case per KLOC | TC / тысяч строк кода | 10-30 тестов на 1000 LOC |
| Test Case per Hour | TC / чел-час | 1-2 тест-кейса в час (создание + выполнение) |
Estimation техники:
| Техника | Суть | Формула |
|---|---|---|
| PERT (Three-point) | Оптимистичная, пессимистичная и наиболее вероятная оценки | (O + 4M + P) / 6 |
| Wideband Delphi | Эксперты независимо оценивают, затем обсуждают | Итеративное усреднение |
| Analogy (По аналогу) | Сравнение с аналогичными проектами/модулями | N = Nаналог × CorrectionFactor |
| Work Breakdown | Декомпозиция до атомарных задач | N = Σ nз для каждой подзадачи |
SD = (P - O) / 6
где O — оптимистичная, M — наиболее вероятная, P — пессимистичная оценка
4.2 Расчёт количества тестов для Equivalence Partitioning
Для каждого параметра: NEP param = количество классов эквивалентности
Пошаговый расчёт:
- Определить все входные параметры
- Для каждого параметра выделить валидные и невалидные классы
- Суммировать общее количество классов
Пример: форма регистрации
| Поле | Валидные классы | Невалидные классы |
|---|---|---|
| Имя | 1 (2-50 символов, буквы) | 3 (пустое, <2 символов, >50 символов, цифры) |
| 1 (корректный формат) | 4 (без @, без домена, пустой, со спецсимволами) | |
| Пароль | 1 (8+ символов, буквы+цифры) | 3 (пустой, <8 символов, без цифр) |
| Возраст | 1 (18-120) | 3 (<18, >120, не число) |
| Итого | 4 | 13 |
N = 4 + 13 = 17 тест-кейсов
4.3 Расчёт для Boundary Value Analysis
NBVA = Σ (количество границ × 3) (для 3-value)
Пример для полей с разными диапазонами:
| Поле | Диапазон | Границ | 2-value BVA | 3-value BVA |
|---|---|---|---|---|
| Возраст | 18-120 | 2 | 5 | 7 |
| Cумма заказа | 0.01-999999.99 | 2 | 5 | 7 |
| Количество товаров | 1-99 | 2 | 5 | 7 |
| Дата рождения | 01.01.1900 — 31.12.2026 | 2 | 5 | 7 |
| Итого | 8 | 20 | 28 |
Robust BVA (с выходом за границы):
Для возраста (18-120): -1, 0, 17, 18, 19, 119, 120, 121, 150 = 9 тестов
4.4 Расчёт для Decision Table
n — количество условий, k — невозможные комбинации, a — добавленные приоритетные
Примеры:
| Условий | Полный перебор (2n) | После culling | Экономия |
|---|---|---|---|
| 3 | 8 | 4-6 | 25-50% |
| 4 | 16 | 6-10 | 37-62% |
| 5 | 32 | 10-16 | 50-69% |
| 6 | 64 | 14-24 | 62-78% |
| 7 | 128 | 20-35 | 72-84% |
4.5 Расчёт для State Transition
S — количество состояний, T — количество валидных переходов, I — количество недопустимых переходов
По уровням покрытия:
| Уровень покрытия | Формула | Описание |
|---|---|---|
| State coverage (0-switch) | S | Каждое состояние посещено |
| Transition coverage (1-switch) | T | Каждый переход выполнен |
| N-switch coverage | S × EN | Все последовательности из N переходов |
| Invalid transition | + I | Каждый недопустимый переход проверен |
| Round-trip (cycle) | + C | Возвраты в исходное состояние |
Пример: система с 5 состояниями, 8 переходами, 3 недопустимыми:
N = 5 + 8 + 3 = 16 тестов (transition coverage)
4.6 Расчёт для Pairwise / All-Pairs
Где Vmax — максимальное количество значений, V2nd — второе по величине
Эмпирические правила оценки:
| Параметров | Значений | Полный перебор | Pairwise (оценка) | Экономия |
|---|---|---|---|---|
| 3 | 3, 3, 3 | 27 | 9-12 | 56-67% |
| 4 | 3, 3, 3, 3 | 81 | 12-18 | 78-85% |
| 5 | 3, 3, 3, 3, 3 | 243 | 15-24 | 90-94% |
| 6 | 2, 2, 3, 3, 4, 4 | 576 | 16-24 | 96-97% |
| 7 | 2, 2, 2, 3, 3, 4, 5 | 1440 | 20-30 | 98% |
| 10 | 3 каждого | 59049 | 30-50 | ~99.9% |
4.7 Практические советы по расчёту общего количества тестов
Итоговая формула для одного модуля/функции:
complexity_factor = 1.0 (Simple), 1.5 (Medium), 2.0 (Complex)
Коэффициенты сложности:
| Уровень сложности | Критерии | Factor |
|---|---|---|
| Simple | CRUD, 1-3 параметра, нет логики | 1.0 |
| Medium | Бизнес-логика, 3-7 параметров, состояния | 1.5 |
| Complex | Распределённые системы, интеграции, RAG, ML | 2.0-3.0 |
Коэффициенты на этапы тестирования:
| Этап | Коэффициент к базовому набору | Пояснение |
|---|---|---|
| Smoke | 5-10% | Только критический путь |
| Sanity | 10-20% | Проверка конкретного изменения |
| Functional | 100% | Весь набор тест-дизайна |
| Regression | 80-100% | Весь набор + старые кейсы |
| E2E | 30-50% | Сквозные сценарии |
5. Примеры расчёта тест-кейсов
Пример 1: Форма авторизации
Параметры: Логин (строка, 3-50 символов), Пароль (строка, 6-128 символов), Запомнить меня (чекбокс), Captcha (да/нет)
| Техника | Расчёт | Кол-во |
|---|---|---|
| EP | Логин: 4 класса; Пароль: 4 класса; Captcha: 2 класса | 10 |
| BVA (2-value) | Логин: 2 границы × 2 = 5; Пароль: 2 границы × 2 = 5 | 10 |
| Decision Table | 3 условия (логин, пароль, captcha) = 8 правил → 6 после culling | 6 |
| Error Guessing | Пустая форма, спецсимволы, SQL-инъекция, XSS | 5 |
| Итого (Simple) | (10 + 10 + 6 + 5) × 1.0 | 31 |
Пример 2: Калькулятор доставки
Параметры: Вес (0-30 кг), Расстояние (0-500 км), Тип доставки (Стандарт/Экспресс/Международная), Страхование (да/нет), Подарочная упаковка (да/нет)
| Техника | Расчёт | Кол-во |
|---|---|---|
| EP | Вес: 3 класса; Расстояние: 3; Тип: 3; Страхование: 2; Упаковка: 2 | 13 |
| BVA (3-value) | Вес: 2 границы × 3 = 7; Расстояние: 2×3 = 7 | 14 |
| Decision Table | 5 условий — 32 полных, ~12 после culling | 12 |
| Pairwise | 5 параметров (3,3,3,2,2) → ~16 тестов | 16 |
| State Transition | 4 состояния × 6 переходов = 10 | 10 |
| Error Guessing | Отрицательный вес, расстояние 0, тип null | 5 |
| Итого (Medium) | (13 + 14 + 12 + 16 + 10 + 5) × 1.5 | 105 |
Пример 3: Обработка заказа (REST API)
Параметры: ID заказа (int, >0), Статус (New/Processing/Shipped/Delivered/Cancelled), Тип оплаты (Card/Cash/Transfer), Сумма (decimal, 0.01-1M), Промокод (string, опционально)
| Техника | Расчёт | Кол-во |
|---|---|---|
| EP | ID: 3; Статус: 5; Оплата: 3; Сумма: 4; Промокод: 3 | 18 |
| BVA | ID: 3; Сумма: 4 границы | 15 |
| Decision Table | 5 условий → ~16 после culling | 16 |
| State Transition | 5 статусов, 8 переходов, 4 недопустимых | 17 |
| Pairwise | 5 параметров (3,5,3,4,3) → ~25 | 25 |
| Error Guessing | ID=0, ID=-1, несуществующий статус, SQL-инъекция | 8 |
| Итого (Complex) | (18 + 15 + 16 + 17 + 25 + 8) × 2.0 | 198 |
6. Тестирование API
API-тестирование — проверка программных интерфейсов (REST, GraphQL, gRPC, SOAP). Это самый эффективный вид тестирования по соотношению скорость/покрытие: API-тесты стабильны, быстры и не зависят от UI.
Уровни API-тестирования
| Уровень | Что проверяем | Пример |
|---|---|---|
| Functional | Корректность ответов, статус-коды, заголовки | GET /users возвращает 200 и список |
| Contract / Schema | Соответствие OpenAPI/Swagger спецификации | Response body валидирован по JSON Schema |
| Negative / Error | Обработка ошибок, невалидные запросы | POST /users без тела → 400 |
| Security | Аутентификация, авторизация, rate limiting | Доступ без токена → 401 |
| Performance | Latency, throughput под нагрузкой | 100 RPS с P99 < 500ms |
| Idempotency | Повторный запрос даёт тот же результат | PUT /users/1 дважды → одинаковый ответ |
| Compatibility | Версионирование, обратная совместимость | v1 эндпоинт работает после обновления |
Что проверять в REST API
| Метод | Успех | Типичные ошибки |
|---|---|---|
| GET | 200 OK + тело ответа | 404 (не найден), 400 (неверный запрос) |
| POST | 201 Created + Location header | 400 (валидация), 409 (конфликт) |
| PUT | 200 OK | 404, 400, 409 |
| PATCH | 200 OK | 404, 400, 422 (необрабатываемая сущность) |
| DELETE | 204 No Content или 200 OK | 404, 405 (не разрешено) |
Техники API-тест-дизайна
- Parameter variation: query/path/header параметры — валидные, невалидные, отсутствующие
- Body mutation: изменение типов полей, пропуск обязательных, лишние поля, null, пустые строки
- Auth testing: без токена, с истёкшим, с невалидным, с правами readonly
- Pagination: page=1&size=0, page=-1, size=10000, cursor-based пагинация
- Filter/Sort: некорректные поля, SQL-инъекции через фильтры
- File upload: пустой файл, очень большой, неверный MIME type, вредоносный
- Rate limiting: превышение лимита, headers X-RateLimit-Remaining, Retry-After
Contract Testing (Consumer-Driven Contracts)
- Provider contract: сервис гарантирует определённый формат ответа
- Consumer contract: клиент ожидает определённый формат
- Инструменты: Pact, Spring Cloud Contract, Postman Collections
- Проверка: breaking changes — изменение поля, удаление эндпоинта, новый required field
7. Баг-репорты (Bug Reports)
Баг-репорт — документ, описывающий дефект в программном обеспечении. Качественный баг-репорт — основа эффективной коммуникации между QA и разработкой.
Структура идеального баг-репорта
| Поле | Описание | Пример |
|---|---|---|
| ID | Уникальный номер | BUG-12345 |
| Заголовок (Summary) | Краткое, чёткое описание проблемы | «Не работает кнопка «Войти» при пустом поле пароля» |
| Проект / Компонент | Какая часть системы | Web App / Auth Module |
| Версия / Окружение | Где воспроизводится | v2.4.1, Chrome 120, macOS 14 |
| Severity (Серьёзность) | Влияние на систему | Critical / Major / Minor / Trivial |
| Priority (Приоритет) | Срочность исправления | P0 / P1 / P2 / P3 |
| Шаги воспроизведения (Steps to Reproduce) | Последовательность действий | 1. Открыть сайт 2. Нажать «Войти» 3. Оставить пароль пустым |
| Фактический результат (Actual Result) | Что произошло | Кнопка неактивна, нет сообщения об ошибке |
| Ожидаемый результат (Expected Result) | Что должно было произойти | Показать сообщение «Пароль обязателен для заполнения» |
| Приложения (Attachments) | Скриншот, видео, лог, HAR | screenshot.png, console.log |
| Дополнительно | Workaround, частота, заметки | Работает на Safari, не работает на Chrome |
Severity vs Priority
| Severity | Описание | Priority | Описание |
|---|---|---|---|
| Critical | Система недоступна, потеря данных, security breach | P0 — Critical | Исправить немедленно (блокирует релиз) |
| Major | Значительная функция не работает, нет workaround | P1 — High | Исправить в текущем спринте |
| Minor | Функция работает с ограничениями, есть workaround | P2 — Medium | Исправить в следующем спринте |
| Trivial | Косметическая проблема, опечатка, не влияет на использование | P3 — Low | Исправить при возможности |
Жизненный цикл бага
- New (Открыт): баг заведён в трекере
- Assigned (Назначен): назначен разработчику
- In Progress (В работе): разработчик начал исправление
- Fixed (Исправлен): код изменён, ждёт тестирования
- Ready for Test (На тестировании): билд с фиксом готов
- Verified (Проверен): QA подтвердил исправление
- Closed (Закрыт): баг закрыт
- Reopened (Переоткрыт): баг воспроизвёлся снова после фикса
- Duplicate (Дубликат): такой баг уже существует
- Won't Fix (Не будет исправлен): решение не исправлять (де-факто фича)
8. Тестовая документация
Тестовая документация — совокупность артефактов, описывающих стратегию, план, процесс и результаты тестирования.
Основные документы
| Документ | Содержание | Кто создаёт | Когда |
|---|---|---|---|
| Test Plan (План тестирования) | Стратегия, scope, ресурсы, расписание, риски | QA Lead / Test Manager | На старте проекта или спринта |
| Test Strategy (Стратегия тестирования) | Высокоуровневый подход: виды тестов, инструменты, метрики | QA Lead / Test Manager | Один раз на проект (обновляется) |
| Test Suite (Тестовый набор) | Группа тест-кейсов по модулю или функционалу | QA Engineer | Во время разработки |
| Test Case (Тест-кейс) | Шаги, предусловия, ожидаемый результат | QA Engineer | Во время разработки |
| Checklist (Чек-лист) | Список проверок без шагов (быстрее, чем ТС) | QA Engineer | Smoke/Sanity/Regression |
| Bug Report (Отчёт о дефекте) | Описание найденной ошибки | QA Engineer | Во время выполнения тестов |
| Test Report (Отчёт о тестировании) | Итоги: пройдено/упало/заблокировано, coverage, риски | QA Engineer / Lead | После завершения тестирования |
| Release Notes (Релизные заметки) | Что нового, что исправлено, известные проблемы | PM / Tech Writer | Перед релизом |
Чек-лист vs Тест-кейс: когда что использовать
| Критерий | Чек-лист | Тест-кейс |
|---|---|---|
| Детализация | Низкая (пункт = проверка) | Высокая (пошаговые инструкции) |
| Время создания | Быстро (5-15 мин) | Долго (15-60 мин) |
| Время выполнения | Быстро (опытный тестировщик) | Медленно (точное следование шагам) |
| Воспроизводимость | Зависит от тестировщика | Высокая (шаги детальны) |
| Автоматизация | Сложнее | Проще (шаги → код) |
| Когда использовать | Smoke, Sanity, Exploratory | Critical path, Regression, Compliance |
Test Report — структура
- Executive Summary: одно предложение о состоянии качества
- Statistics: Passed/Failed/Blocked/Skipped, всего тестов, % прохождения
- Coverage: requirements coverage, code coverage, risk coverage
- Defects: открыто/закрыто, по severity, по компонентам
- Risks: что не протестировано, известные проблемы
- Metrics: DRE, defect density, testing velocity
- Recommendation: релиз разрешён / условно / запрещён
9. Метрики тестирования (KPI)
Метрики позволяют объективно оценить качество продукта и эффективность процесса тестирования.
Основные метрики
| Метрика | Формула | Целевое значение | Что показывает |
|---|---|---|---|
| Defect Detection Rate (DDR) | Багв тесте / (Багв тесте + Багв проде) | > 95% | Эффективность выявления багов на тестировании |
| Defect Removal Efficiency (DRE) | Багисправлено / Багвсего | > 80% | Скорость закрытия багов |
| Defect Density | Баг / KLOC или Баг / FP | < 5/KLOC | Плотность дефектов в модуле |
| Test Case Pass Rate | Passed / Total × 100% | > 95% | Стабильность сборки |
| Requirements Coverage | Covered / Total × 100% | > 95% | Покрытие требований тестами |
| Test Execution Velocity | TCexec / час | > 10 TC/час | Скорость выполнения тестов |
| Mean Time to Detect (MTTD) | Время от деплоя до первого баг-репорта | < 2 часа | Быстрота реакции QA |
| Mean Time to Repair (MTTR) | Время от баг-репорта до фикса | < 24 часа (Crit) | Скорость фикса разработчиками |
| Automation Coverage | TCauto / TCtotal × 100% | > 50% | Доля автоматизации |
| False Positive Rate | FPauto / TCauto × 100% | < 5% | Стабильность автотестов |
| Escape Defect Rate | Багв проде / Багвсего × 100% | < 5% | Количество багов, ушедших в продакшен |
Пример отчёта по метрикам
| Метрика | Спринт 1 | Спринт 2 | Спринт 3 | Тренд |
|---|---|---|---|---|
| DRE | 72% | 81% | 88% | 🟢 Рост |
| Test Pass Rate | 88% | 93% | 96% | 🟢 Рост |
| Escape Defect Rate | 9% | 6% | 3% | 🟢 Снижение |
| Automation Coverage | 35% | 42% | 51% | 🟢 Рост |
| Defect Density (per KLOC) | 7.2 | 5.1 | 3.8 | 🟢 Снижение |
10. Работа с требованиями (Requirements Testing)
Качество тестирования напрямую зависит от качества требований. Плохие требования → плохие тесты → плохой продукт.
Характеристики хорошего требования (SMART)
| Критерий | Описание | Плохой пример | Хороший пример |
|---|---|---|---|
| Specific (Конкретное) | Однозначное, без двусмысленности | «Быстрый поиск» | «Поиск возвращает результаты < 500 мс» |
| Measurable (Измеримое) | Можно проверить метрикой | «Удобный интерфейс» | «Таргет достигается за 3 клика» |
| Achievable (Достижимое) | Реалистично для реализации | «99.999% uptime» (на MVP) | «99.9% uptime на старте» |
| Relevant (Релевантное) | Соответствует целям продукта | «Поддержка IE6» (в 2026) | «Поддержка последних 3 версий Chrome, Firefox, Safari» |
| Time-bound (Ограниченное по времени) | Срок выполнения | «Интеграция с PayPal» | «Интеграция с PayPal к Q2 2026» |
BDD и Gherkin (Given / When / Then)
Behavior-Driven Development — подход, при котором тесты пишутся на естественном языке по шаблону Gherkin:
Функция: Авторизация пользователя
Как зарегистрированный пользователь
Я хочу войти в систему
Чтобы получить доступ к личному кабинету
Сценарий: Успешный вход
Дано я нахожусь на странице входа
И я ввожу "test@example.com" в поле email
И я ввожу "password123" в поле пароля
Когда я нажимаю кнопку "Войти"
Тогда я вижу сообщение "Добро пожаловать!"
И я перенаправлен на страницу профиля
Сценарий: Неверный пароль
Дано я нахожусь на странице входа
И я ввожу "test@example.com" в поле email
И я ввожу "wrong" в поле пароля
Когда я нажимаю кнопку "Войти"
Тогда я вижу сообщение "Неверный email или пароль"
Acceptance Criteria (Критерии приёмки)
- Functional: «API возвращает 200 с корректным телом»
- Non-functional: «Время ответа < 300 мс при 50 RPS»
- UI: «Форма центрирована, кнопка синяя (#3B82F6)»
- Error: «При пустом поле показать красную рамку и текст ошибки»
Review требований: чеклист
- Требование однозначно (нет «как правило», «обычно», «удобный»)
- Требование тестируемо (можно написать тест)
- Требование непротиворечиво (не конфликтует с другими)
- Требование полное (не нужно додумывать)
- Требование атомарно (описывает одну вещь)
- Приоритет указан (Must / Should / Could / Won't)
11. Mobile тестирование
Мобильное тестирование имеет множество особенностей по сравнению с веб-тестированием: жесты, прерывания, сетевые условия, ограниченные ресурсы.
Виды мобильного тестирования
| Вид | Что проверяем |
|---|---|
| Functional | Работа функций приложения: навигация, ввод, отображение |
| UI / UX | Размеры элементов, отступы, адаптация под экраны, жесты |
| Installation | Установка, обновление, downgrade, удаление |
| Interruption | Звонок, SMS, уведомление, будильник, переключение приложений |
| Network | WiFi, 4G/5G, 3G, Edge, потеря сети, переключение, airplane mode |
| Background / Foreground | Свёртывание/развёртывание, сохранение состояния |
| Battery / Performance | Потребление энергии, CPU, RAM при длительном использовании |
| Memory | Утечки памяти, потребление RAM, OOM-ошибки |
| Localization | Языки, RTL, форматы дат/валют |
| Accessibility | TalkBack (Android), VoiceOver (iOS), контрастность, размер текста |
| Security | Хранение данных на устройстве, SSL pinning, root detection |
| Compatibility | Разные устройства, версии ОС, размеры и плотности экранов |
Тестирование прерываний (Interruption Testing)
- Входящий звонок: приложение должно свёрнуться, после звонка — восстановиться
- SMS / Push: уведомление не должно сбрасывать состояние
- Будильник: системный алерт не должен ломать UI
- Переключение приложений: состояние сохраняется (app switcher)
- Screen rotation: портрет → лендскейп — данные не теряются
- Low battery: приложение не перегружает CPU при 5% заряда
- Charging: поведение при подключении/отключении зарядки
Эмуляторы vs Реальные устройства
| Критерий | Эмулятор | Реальное устройство |
|---|---|---|
| Скорость | Быстро | Медленно (сборка, деплой) |
| Стоимость | Бесплатно | Дорого (лаборатория устройств) |
| Сеть | Симуляция | Реальные условия (4G, слабый сигнал) |
| Сенсоры | Симуляция | Реальные (GPS, акселерометр, камера) |
| Производительность | Не репрезентативна | Точные показатели |
| Батарея | Не тестируется | Только на реальном |
12. Database тестирование
Тестирование базы данных — проверка целостности, производительности и корректности обработки данных.
Что тестировать в БД
| Аспект | Что проверяем | Пример |
|---|---|---|
| Data Integrity | Constraints (PK, FK, UNIQUE, CHECK), cascading, triggers | INSERT с дубликатом PK → error |
| CRUD Operations | SELECT, INSERT, UPDATE, DELETE — корректность данных | UPDATE баланса → корректное новое значение |
| Stored Procedures | Логика процедур, обработка ошибок | sp_transfer(100 от A к B) → балансы изменились |
| Transactions | ACID: атомарность, изоляция, durable | Откат транзакции → данные не изменились |
| Migrations | Up/down миграции, schema changes | Добавление колонки → старые данные корректны |
| Performance | Индексы, query plan, explain analyze | SELECT с индексом vs без — разница в скорости |
| Concurrency | Race conditions, deadlocks, row locking | Два UPDATE одновременно → deadlock? |
| Data Validation | Типы данных, длины, форматы, NULL vs NOT NULL | Вставка слишком длинной строки → truncate или error |
| ETL / Data Pipeline | Трансформация, качество данных, duplicate handling | Импорт CSV → записи в БД без потери |
SQL-инъекции — тестирование
- «' OR 1=1; --» — обход аутентификации
- «admin' --» — логин без пароля
- «; DROP TABLE users; --» — деструктивные операции
- «' UNION SELECT * FROM passwords; --» — кража данных
- «' OR '1'='1' — то же самое, другой синтаксис
13. Security тестирование (детально)
Тестирование безопасности — проверка системы на устойчивость к атакам и утечкам данных.
OWASP Top 10 — 2021
| # | Уязвимость | Метод тестирования |
|---|---|---|
| A01 | Broken Access Control | Попытка доступа к ресурсам без прав (IDOR, privilege escalation) |
| A02 | Cryptographic Failures | Проверка шифрования, HTTP vs HTTPS, слабые протоколы |
| A03 | Injection | SQL, NoSQL, OS command, LDAP, XSS инъекции |
| A04 | Insecure Design | Архитектурные проблемы: отсутствие rate limiting, слабая аутентификация |
| A05 | Security Misconfiguration | Default credentials, открытые порты, verbose error messages |
| A06 | Vulnerable Components | Устаревшие библиотеки, известные CVE |
| A07 | Auth Failures | Слабые пароли, отсутствие MFA, session fixation |
| A08 | Data Integrity Failures | Проверка подписей, CSP, небезопасные десериализации |
| A09 | Logging & Monitoring | Отсутствие логирования атак, слабый SIEM |
| A10 | SSRF | Server-Side Request Forgery — запросы к внутренним ресурсам |
Инструменты security-тестирования
| Категория | Инструменты | Что делают |
|---|---|---|
| SAST (Static Analysis) | SonarQube, Semgrep, Checkmarx | Анализ исходного кода на уязвимости |
| DAST (Dynamic Analysis) | OWASP ZAP, Burp Suite, Acunetix | Сканирование запущенного приложения |
| SCA (Software Composition) | Dependabot, Snyk, Black Duck | Проверка зависимостей на CVE |
| Pentest frameworks | Metasploit, Kali Linux, Nmap | Ручной пентест специалистом |
| Secrets scanning | GitLeaks, TruffleHog, GitGuardian | Поиск ключей и токенов в репозиториях |
Security чеклист для QA
- Все входные данные экранируются (XSS, SQL-инъекции)
- Аутентификация обязательна для защищённых ресурсов
- Сессии истекают, токены рефрешатся
- HTTPS включён, HSTS настроен
- Ошибки не содержат stack trace (production mode)
- Зависимости обновлены, нет известных CVE
- Rate limiting на login/register/API
- File upload — валидация типа, размера, антивирус
- CORS настроен (не '*')
- Security headers: CSP, X-Frame-Options, X-Content-Type-Options
14. Глоссарий терминов тестирования
| Термин | Определение |
|---|---|
| Acceptance Testing (Приёмочное тестирование) | Тестирование, проводимое заказчиком для принятия решения о готовности продукта к эксплуатации |
| Accessibility Testing | Проверка доступности продукта для людей с ограниченными возможностями |
| Ad-hoc Testing | Спонтанное тестирование без документации и подготовки |
| Automation Coverage | Процент тест-кейсов, покрытых автотестами |
| Backward Compatibility | Способность новой версии работать с данными старой версии |
| Black Box Testing | Тестирование без знания внутреннего устройства системы |
| Boundary Value Analysis (BVA) | Техника тест-дизайна, фокусирующаяся на граничных значениях |
| Bug / Defect | Отклонение фактического результата от ожидаемого |
| Bug Report | Документ, описывающий дефект |
| Checklist (Чек-лист) | Список проверок для быстрого тестирования |
| Code Coverage | Процент кода, выполненного во время тестирования |
| Compatibility Testing | Проверка работы в разных средах (ОС, браузеры, устройства) |
| Component Testing | Тестирование крупного модуля системы |
| CRUD | Create, Read, Update, Delete — базовые операции с данными |
| Data-Driven Testing | Тестирование с параметризацией тестовыми данными |
| Decision Table Testing | Техника тест-дизайна на основе комбинаций условий |
| Defect Density | Количество дефектов на единицу размера (KLOC, FP) |
| Dynamic Testing | Тестирование с запуском кода |
| E2E (End-to-End) Testing | Сквозное тестирование полного пользовательского сценария |
| EP (Equivalence Partitioning) | Разбиение входных данных на классы эквивалентности |
| Error Guessing | Техника тест-дизайна на основе опыта и интуиции |
| Exploratory Testing | Исследовательское тестирование без заранее написанных сценариев |
| Functional Testing | Проверка функциональных требований |
| Gherkin | Язык описания сценариев в BDD (Given/When/Then) |
| Grey Box Testing | Тестирование с частичным знанием внутреннего устройства |
| Integration Testing | Тестирование взаимодействия между модулями |
| Latency | Время от запроса до получения ответа |
| Load Testing | Тестирование под ожидаемой нагрузкой |
| Localization Testing | Проверка перевода и адаптации для региона |
| MTBF | Mean Time Between Failures — среднее время между отказами |
| MTTR | Mean Time To Repair — среднее время восстановления |
| Negative Testing | Тестирование с невалидными данными |
| Non-Functional Testing | Проверка нефункциональных характеристик (производительность, безопасность) |
| Pairwise Testing | Комбинаторная техника, проверяющая все пары значений |
| Performance Testing | Тестирование скорости, отзывчивости, стабильности |
| Regression Testing | Проверка, что изменения не сломали существующую функциональность |
| Reliability | Способность системы работать без отказов в течение заданного времени |
| Re-testing | Проверка, что конкретный баг исправлен |
| Sanity Testing | Узкая проверка конкретных изменений/исправлений |
| Scalability | Способность системы обрабатывать растущую нагрузку |
| Smoke Testing | Быстрая проверка критической функциональности |
| Soak Testing (Endurance) | Длительное тестирование под нагрузкой для выявления утечек |
| State Transition Testing | Техника тест-дизайна на основе конечных автоматов |
| Static Testing | Анализ кода, документации, требований без запуска |
| Stress Testing | Тестирование при нагрузке, превышающей норму |
| System Testing | Тестирование системы в целом |
| Test Case | Набор шагов, условий и ожидаемых результатов для проверки |
| Test Plan / Test Strategy | Документы, описывающие подход к тестированию |
| Throughput | Количество запросов/транзакций в единицу времени |
| Unit Testing | Тестирование отдельных функций/методов/классов |
| Usability Testing | Проверка удобства использования |
| UAT (User Acceptance Testing) | Приёмочное тестирование пользователями |
| White Box Testing | Тестирование с полным знанием внутреннего устройства |
15. CI/CD и DevOps для QA
CI/CD (Continuous Integration / Continuous Delivery) — практика автоматической сборки, тестирования и доставки кода. QA-инженер должен понимать pipeline, уметь читать логи и настраивать тесты в пайплайне.
Pipeline тестирования
| Stage | Что происходит | QA involvement |
|---|---|---|
| Commit / Push | Линтер, unit-тесты, security scan (SAST) | Написание unit-тестов, настройка линтеров |
| Build | Компиляция, сборка артефакта, проверка зависимостей (SCA) | Проверка CVE в зависимостях |
| Deploy to Staging | Деплой на тестовое окружение | Smoke-тесты, API-тесты, integration tests |
| E2E Tests | End-to-end тесты в staging | Playwright/Cypress/Selenium, visual regression |
| Security Scan | DAST, пентест, dependency check | OWASP ZAP, настройка правил |
| Quality Gate | Проверка метрик: coverage > 80%, pass rate > 95% | Настройка gate, анализ результатов |
| Deploy to Production | Canary / Blue-Green / Rolling | Мониторинг метрик в проде |
Deploy стратегии
| Стратегия | Описание | QA проверка |
|---|---|---|
| Blue-Green | Два идентичных окружения, переключение трафика | Проверить оба окружения, session drain |
| Canary | Постепенное перенаправление трафика на новую версию (5% → 50% → 100%) | Мониторинг ошибок и метрик на canary |
| Rolling | Поэтапная замена инстансов | Нет downtime, проверка health checks |
| Feature Toggle | Скрытие новой функциональности под флагом | Toggle on/off тесты, A/B тесты |
Quality Gates в CI/CD
- Code Coverage: минимальный порог (80%+) — ниже gate не пропускает
- Test Pass Rate: 100% обязательных, >95% всех тестов
- Security Vulnerabilities: 0 critical/high CVE
- Performance Regression: latency не выросла более чем на 5%
- Lint Errors: 0 errors
16. UI / Web тестирование (детально)
UI-тестирование — проверка пользовательского интерфейса и взаимодействия пользователя с приложением.
Инструменты UI-тестирования
| Инструмент | Язык | Ключевая особенность | Когда выбрать |
|---|---|---|---|
| Playwright | JS/TS, Python, Java, .NET | Auto-wait, multi-browser, network interceptor, trace viewer | Современные проекты, нужна скорость |
| Cypress | JS/TS | Time travel, real-time reload, network stubbing | Frontend-only, React/Vue/Angular |
| Selenium WebDriver | Все популярные | Стандарт индустрии, огромное комьюнити | Legacy проекты, кросс-браузерность |
| Puppeteer | JS/TS | Только Chrome, полный контроль над браузером | Скрапинг, PDF, Chrome-only тесты |
Locators: стратегии
| Стратегия | Playwright | Приоритет | Стабильность |
|---|---|---|---|
| Text content | page.getByText() | 1 | Высокая (не зависит от структуры) |
| ARIA role | page.getByRole() | 2 | Высокая (accessibility-first) |
| Label | page.getByLabel() | 3 | Высокая (для форм) |
| Test ID | page.getByTestId() | 4 | Максимальная (data-testid) |
| CSS / XPath | page.locator() | 5 | Низкая (хрупкие) |
Visual Regression Testing
- Pixel-by-pixel: сравнение скриншотов попиксельно (Percy, Applitools, Playwright Screenshot)
- Snapshot testing: сохранение эталонного скриншота и сравнение с новым
- Layout comparison: проверка структуры, а не пикселей (Storybook test)
- Что проверять: все страницы, все viewport (mobile/tablet/desktop), все локали, тёмная/светлая тема
- Threshold: допуск на изменение (0.1% пикселей) — фильтрация шума (antialiasing)
Waits и стабильность UI-тестов
- Auto-wait: Playwright ждёт элемент перед действием (visible, enabled, stable)
- Explicit wait:
waitForSelector,waitForNavigationдля специфических случаев - Network idle:
waitForLoadState('networkidle')— ждать пока сеть успокоится - Flaky tests: random timeouts → добавить retries, улучшить локаторы, убрать sleep()
17. Тестирование производительности (детально)
Расширенное руководство по нагрузочному тестированию, выходящее за рамки базовой классификации.
Виды performance-тестов
| Вид | Цель | Профиль нагрузки | Длительность |
|---|---|---|---|
| Baseline | Установить базовые метрики | 1-5 RPS, 1-10 concurrent | 5-10 мин |
| Load | Проверить под ожидаемой нагрузкой | Средняя нагрузка + 20% | 30-60 мин |
| Stress | Найти точку отказа | Плавный рост до 200-500% от нормы | 15-30 мин |
| Spike | Реакция на резкий скачок | Резкий рост ×10 за 1 сек | 5-10 мин |
| Soak | Стабильность во времени | Средняя нагрузка ×1 | 4-24 часа |
| Volume | Обработка большого объёма данных | Большие payloads, много записей в БД | 30-60 мин |
| Scalability | Проверить масштабирование | Постепенное увеличение + добавление node | 1-2 часа |
Bottleneck Analysis
- CPU: 90%+ user time → алгоритмические проблемы, отсутствие кэширования
- Memory: рост потребления → утечки (memory leak), неоптимальные структуры
- Disk I/O: высокий await → медленная БД, неоптимальные запросы, отсутствие индексов
- Network: высокая latency → CDN, DNS, TLS handshake, большие payloads
- Database: slow queries → missing indexes, N+1, lock contention
- External APIs: медленные ответы → добавить timeout, circuit breaker, fallback
Инструменты performance-тестирования
| Инструмент | Язык скриптов | Протоколы | Особенность |
|---|---|---|---|
| k6 | JavaScript (ES6) | HTTP/1.1, HTTP/2, WebSocket, gRPC | Современный, Grafana dashboard, облачный |
| JMeter | GUI / XML / Groovy | HTTP, FTP, JDBC, JMS, SOAP, TCP | Стандарт, огромное комьюнити, плагины |
| Locust | Python | HTTP, WebSocket (кастомные) | Кодом, распределённый, events |
| Gatling | Scala / Java / Kotlin | HTTP, WebSocket, JMS, SSE | High performance, Akka-based |
| Yandex.Tank | YAML + Python | HTTP, HTTPS | Интеграция с JMeter, Pandora, готовые report |
18. Тестирование микросервисов
Микросервисная архитектура требует особого подхода к тестированию из-за распределённой природы, сетевых задержек и независимости сервисов.
Пирамида тестирования микросервисов
| Уровень | Что тестируем | Инструменты |
|---|---|---|
| Unit | Отдельные функции внутри сервиса | Jest, Pytest, JUnit |
| Contract | Контракты между сервисами (CDC) | Pact, Spring Cloud Contract |
| Integration | Взаимодействие с БД, очередью, кэшем | Testcontainers, WireMock, LocalStack |
| Component | Сервис в изоляции (с моками) | WireMock, MockServer, Hoverfly |
| End-to-End | Цепочка из нескольких сервисов | Playwright + Docker Compose, Kubernetes (kind) |
| Chaos | Устойчивость к отказам | Chaos Monkey, Litmus, Gremlin |
Contract Testing (Consumer-Driven Contracts)
- Provider: сервис А гарантирует API
- Consumer: сервис Б использует этот API
- Pact flow: Consumer пишет тест → генерирует Pact файл → Provider верифицирует
- Что проверять: статус-коды, тело ответа, заголовки, новые поля (breaking change)
Service Virtualization (WireMock)
- Создание стабов для внешних сервисов
- Симуляция ответов: success, error, timeout, slow response
- Record/Playback: запись реальных ответов и воспроизведение в тестах
- Stateful stubs: разные ответы в зависимости от состояния
19. Тестирование в Agile/Scrum
QA в Agile — не отдельная фаза, а непрерывный процесс на протяжении всего спринта.
QA в Scrum-церемониях
| Церемония | Что делает QA |
|---|---|
| Planning | Оценка тестовых усилий, уточнение acceptance criteria, выявление risks |
| Daily Standup | Статус тестирования, блокеры, найденные баги |
| Grooming | Review требований, написание тест-кейсов, уточнение сценариев |
| Review | Демо новой функциональности, фидбек по UX |
| Retrospective | Анализ багов, улучшение процессов, определение action items |
Definition of Ready (DoR) — чеклист для QA
- User Story имеет acceptance criteria
- Acceptance criteria тестируемы и однозначны
- Дизайн-макеты есть (для UI)
- Тестовые данные определены
- Окружение доступно
- Зависимости от других команд/сервисов учтены
Definition of Done (DoD) — чеклист для QA
- Все acceptance criteria выполнены
- Тест-кейсы написаны и выполнены
- Критические баги отсутствуют
- Автотесты добавлены в регрессию
- Проверено на staging окружении
- Негативные сценарии покрыты
Оценка тестовых усилий (Estimation)
- Planning Poker: команда оценивает сложность в story points
- T-shirt sizes: S (1-2 часа), M (до 4 часов), L (до 8 часов), XL (до 2 дней)
- Test point analysis: количество тест-кейсов × сложность × длительность
- Affinity estimation: группировка и быстрая оценка похожих задач
20. Mutation Testing (Мутационное тестирование)
Мутационное тестирование — метод оценки качества самих тестов. В код вносятся намеренные ошибки (мутации), и проверяется, упадут ли на них тесты.
Цель: > 80% mutation score
Типы мутаций (PITest / MutPy)
| Тип мутации | Оригинал | Мутация |
|---|---|---|
| Change operator | a + b | a - b |
| Change condition | a > b | a >= b, a < b |
| Remove call | validate() | Удаление вызова |
| Change return | return a | return null |
| Negate boolean | if(ok) | if(!ok) |
| Change constant | 100 | 0, -1, 101 |
Инструменты:
- PITest — Java (стандарт индустрии)
- MutPy — Python
- Stryker — JS/TS, C#, Scala
- Humbug — PHP
Когда применять:
- Критические модули (авторизация, платежи, безопасность)
- После увеличения coverage — проверить, что тесты реально работают
- При code review — мутации подтверждают качество тестов
21. Risk-Based Testing (RBT)
Тестирование, основанное на рисках. Тесты приоритезируются по вероятности и влиянию дефекта. Ресурсы направляются на наиболее рискованные области.
Risk Priority Number (RPN) = P × I × D (Detectability)
Матрица рисков
| Вероятность \\ Влияние | Низкое (1) | Среднее (2) | Высокое (3) |
|---|---|---|---|
| Высокая (3) | 5 — Medium | 7 — High | 9 — Critical |
| Средняя (2) | 3 — Low | 5 — Medium | 7 — High |
| Низкая (1) | 1 — Low | 3 — Low | 5 — Medium |
Приоритизация тестов по RPN
| RPN | Действие | Пример |
|---|---|---|
| 8-9 (Critical) | Обязательное тестирование, автоматизация, несколько раундов | Авторизация, платёжный шлюз |
| 5-7 (High) | Полное тестирование, автоматизация критических сценариев | Корзина, оформление заказа |
| 3-4 (Medium) | Основные сценарии + error guessing | Поиск, фильтры, профиль |
| 1-2 (Low) | Smoke-тесты, exploratory по остатку времени | Промо-блоки, футер, about page |
Пример RBT-анализа для интернет-магазина
| Функция | Вероятность | Влияние | RPN | Приоритет тестирования |
|---|---|---|---|---|
| Оплата | 3 | 3 | 9 | Critical — полный набор тестов, chaos |
| Корзина | 3 | 2 | 6 | High — functional + regression |
| Регистрация | 2 | 3 | 6 | High — functional + security |
| Каталог | 2 | 2 | 4 | Medium — основные сценарии |
| Блог | 1 | 1 | 1 | Low — smoke только |
22. Root Cause Analysis (RCA)
Анализ корневых причин — метод поиска первопричины проблемы, а не её симптомов. Применяется после критических багов или инцидентов в проде.
Методы RCA
| Метод | Описание | Когда использовать |
|---|---|---|
| 5 Whys | Последовательные вопросы «Почему?» до нахождения первопричины | Простые проблемы, когда причина неочевидна |
| Fishbone (Ishikawa) | Диаграмма «рыбья кость»: категории причин (People, Process, Technology, Data, Environment) | Сложные проблемы с множеством факторов |
| Fault Tree Analysis (FTA) | Дерево отказов — логическая схема причин | High-risk системы (атомная, авиация) |
| Pareto Analysis | 80% проблем — от 20% причин | Приоритизация исправлений |
Пример: 5 Whys
Проблема: Пользователи не могут оформить заказ
- Почему? → API возвращает 500 ошибку
- Почему? → Запрос к БД падает с timeout
- Почему? → Таблица заказов заблокирована долгой транзакцией
- Почему? → Нет индекса на статусе заказа, полное сканирование таблицы
- Почему? → Отсутствует review миграций перед деплоем (корневая причина ⇐ процесс)
23. Test Environment Management
Управление тестовыми окружениями — одна из самых недооценённых, но критически важных областей QA.
Проблемы тестовых окружений
| Проблема | Влияние | Решение |
|---|---|---|
| Грязные данные | Ложные баги, нестабильные тесты | Автоматический seeding / reset БД перед тестами |
| Конфликты параллельных тестов | Гонки данных, flaky тесты | Изоляция: отдельные схемы/контейнеры на каждый поток |
| Недоступность окружения | Блокировка тестирования | Health checks, SLA, уведомления при падении |
| Различие с продушеном | Баги, найденные только в проде | Синхронизация конфигов, версий, данных |
| Flaky тесты | Потеря доверия к тестам | Quarantine, анализ причин, исправление |
Типы окружений
- Local / Dev: окружение разработчика, быстрые итерации
- Feature / PR: поднимается на каждый PR (Preview Environments, ephemeral)
- Integration / Staging: общее окружение команды, интеграционные тесты
- Pre-production / Staging: копия продакшена, регрессия, performance-тесты
- Production: smoke-тесты после деплоя, canary
Containerized тестовые окружения (Testcontainers / Docker Compose)
- Testcontainers: поднятие БД/брокеров/кэша в Docker контейнерах для тестов
- Docker Compose: полный стек сервисов для E2E тестов
- Ephemeral environments: автоматическое создание и удаление окружения на каждый PR
24. Тестирование интеграций, ETL и Kafka
Современные системы всё чаще используют event-driven архитектуру с message brokers (Kafka, RabbitMQ) и ETL-пайплайны. Тестирование таких систем требует особого подхода.
Тестирование Kafka
| Аспект | Что проверяем | Метод |
|---|---|---|
| Produce | Сообщение отправлено в правильный topic с корректным ключом и значением | Testcontainers + Kafka, verify message on consumer side |
| Consume | Сообщения корректно обрабатываются при получении | Mock producer, проверка логики обработки |
| Schema evolution | Avro/Protobuf schema совместимость при изменении | Schema Registry, compatibility check (BACKWARD, FORWARD) |
| Partitioning | Сообщения с одинаковым ключом попадают в один partition | Проверка порядка сообщений для ключа |
| Retry / DLQ | Ошибочные сообщения уходят в DLQ после N retries | Отправить невалидное сообщение, проверить DLQ |
| Consumer group | Rebalance при добавлении/удалении consumer | Kill consumer, проверить восстановление |
| Latency | Время от produce до consume | Мониторинг end-to-end latency |
Тестирование ETL-пайплайнов
| Этап ETL | Что тестировать | Техники |
|---|---|---|
| Extract | Извлечение данных из источника (API, DB, файл) | Source schema, фильтры, incremental load, null handling |
| Transform | Преобразование данных (маппинг, агрегация, очистка) | Data quality, duplicate removal, business logic correctness |
| Load | Загрузка в целевую систему | Target schema, type casting, constraints (PK, FK), idempotency |
Dead Letter Queue (DLQ) тестирование
- Невалидные данные: отправка сообщения с неправильным форматом → проверка DLQ
- Ошибки обработки: бизнес-логика выбрасывает exception → сообщение в DLQ после N retries
- Мониторинг DLQ: алерты при появлении сообщений в DLQ
- Re-drive: исправление сообщения и повторная отправка из DLQ
25. Чеклист тестировщика
Планирование и анализ
- Определены виды тестирования для проекта
- Выбраны техники тест-дизайна
- Выделены классы эквивалентности
- Определены граничные значения
- Построены таблицы решений
- Проанализированы состояния и переходы
- Рассчитано примерное количество тест-кейсов
- Оценены временные и ресурсные затраты
Создание тест-кейсов
- Каждый тест-кейс имеет уникальный ID
- Тест-кейс содержит: предусловия, шаги, ожидаемый результат
- Тест-кейсы атомарны (один тест — одна проверка)
- Тест-кейсы независимы (порядок выполнения не важен)
- Покрыты валидные и невалидные классы
- Покрыты положительные и негативные сценарии
- Приоритеты расставлены (Critical / High / Medium / Low)
Coverage (покрытие)
- Requirements coverage > 95%
- Code coverage > 80%
- Branch coverage > 75%
- State coverage (все состояния)
- Transition coverage (все переходы)
- Pairwise покрытие (все пары значений)
Регрессия
- Smoke-тесты выделены и автоматизированы
- Critical path тесты стабильны
- Тесты на граничные значения включены в регрессию
- Проверка старых багов (re-testing)
- Автоматизированные тесты интегрированы в CI/CD
- Время выполнения регрессии < 30 минут
API тестирование
- Все эндпоинты покрыты тестами (200, 4xx, 5xx)
- Contract tests (OpenAPI schema validation)
- Аутентификация/авторизация на каждом эндпоинте
- Rate limiting работает корректно
- Пагинация, фильтры, сортировка
- Idempotency для PUT/DELETE
Баг-репорты
- Заголовок чётко описывает проблему
- Шаги воспроизведения полные и однозначные
- Указана среда (ОС, браузер, версия)
- Приложены скриншоты/видео/логи
- Severity и Priority проставлены
- Нет дубликатов (проверка перед созданием)
Тестовая документация
- Test Plan существует и актуален
- Test Suite структурирован по модулям
- Тест-кейсы атомарны и независимы
- Test Report формируется после каждого цикла
- Метрики собираются и отслеживаются в динамике
Mobile тестирование
- Прерывания (звонок, SMS, уведомления)
- Background/Foreground — сохранение состояния
- Сетевые условия: потеря, переключение, airplane mode
- Разные размеры и плотности экранов
- Батарея и потребление ресурсов
- Установка, обновление, downgrade
Database тестирование
- Constraints (PK, FK, UNIQUE) работают
- CRUD операции корректны
- Транзакции ACID-совместимы
- Миграции протестированы (up/down)
- Нет SQL-инъекций
- Индексы оптимизированы
Security тестирование
- OWASP Top 10 проверен
- SAST/DAST сканирование выполнено
- Зависимости проверены на CVE
- Secrets не хранятся в репозитории
- HTTPS, HSTS, security headers настроены
- Rate limiting на чувствительные эндпоинты
Нефункциональное тестирование
- Performance тесты для критических сценариев
- Load тесты с ожидаемой нагрузкой x2
- Stress тесты до точки отказа
- Security: OWASP Top 10 проверен
- Usability: основные сценарии протестированы
- Accessibility: WCAG 2.1 AA
26. Заключение
Этот плейбук охватывает ключевые аспекты тестирования ПО — от классификации видов и типов до конкретных техник тест-дизайна и методов расчёта количества тест-кейсов. Основные выводы:
- Не существует универсальной техники — комбинируйте EP, BVA, Decision Table, State Transition и Pairwise
- Расчёт количества тестов — не точная наука, а оценка. Используйте формулы как базовую линию, корректируйте под проект
- Покрытие ≠ качество — 100% coverage не гарантирует отсутствие багов. Важна осмысленность тестов
- Автоматизация — серебряная пуля? Нет. Автоматизируйте то, что стабильно, часто выполняется и даёт ценность
- Контекст решает — нет «правильного» набора техник для всех проектов. Адаптируйте подrisks, бюджет и сроки
Плейбук подготовлен для проекта qasdet.github.io • 2026