Зачем комбинировать техники?
У каждой техники есть слепые зоны. EP пропускает граничные дефекты. BVA пропускает зависимые от состояния баги. State transition testing пропускает ошибки расчётов. Ни одна техника не обеспечивает полного покрытия.
При стратегическом комбинировании сильные стороны одной техники компенсируют слабости другой.
Трёхслойная модель
Слой 1: На основе спецификации (Black-Box)
Формируют основу. Проверяют соответствие системы требованиям.
- EP, BVA, таблицы решений, переходы состояний
Слой 2: На основе структуры (White-Box)
Заполняют пробелы Слоя 1, анализируя непокрытые пути кода.
- Покрытие операторов/решений, путей, MC/DC, потоков данных
Слой 3: На основе опыта
Ловят дефекты, которые формальные техники пропускают.
- Предугадывание ошибок, исследовательское тестирование, чек-листы
Процесс комбинирования
Шаг 1: Начать с тестов на основе спецификации
Фича: Регистрация пользователя
├── Поле email → EP + BVA
├── Поле пароля → EP + BVA
├── Поле возраста → EP + BVA
├── Правила регистрации → Таблица решений
└── Жизненный цикл аккаунта → Переходы состояний
Шаг 2: Измерить структурное покрытие
Запустить тесты Слоя 1, проанализировать пробелы.
Шаг 3: Добавить тесты на основе структуры
Для каждого непокрытого блока определить, нужно ли тестирование.
Шаг 4: Применить техники на основе опыта
Кейс: Обработка платежей
Слой 1 (~45 тестов)
| Подфича | Техника | Ключевые тесты |
|---|---|---|
| Тип оплаты | EP | 3 валидных + 1 невалидный |
| Номер карты | EP + BVA | Visa/MC/Amex + невалидные форматы |
| Дата истечения | BVA | Сегодня, завтра, вчера |
| Конвертация валют | BVA + EP | Та же валюта, поддерживаемые пары |
| Правила платежей | Таблица решений | тип x сумма x валюта x fraud_score |
| Цикл транзакции | Переходы состояний | Pending → Authorized → Captured → Refunded |
| Окно возврата | BVA | День 0, 1, 29, 30, 31 |
Слой 2 (~15 дополнительных тестов)
Анализ покрытия показывает FraudDetector с 52% decision coverage. Добавить тесты для путей обнаружения фрода.
Слой 3 (~10 тестов + сессии)
Предугадывание: двойная отправка, таймаут, 3D Secure. Исследовательское тестирование при медленной сети.
Итого: ~70 тест-кейсов + 2 исследовательские сессии.
Упражнение: Комбинированный тест-дизайн
Задача 1
Спроектируйте комбинированную стратегию для бронирования авиабилетов:
- Поиск по городам, датам, пассажирам (1-9), классу
- Результаты с фильтрами и сортировкой
- Бронирование с данными пассажира и оплатой
- Изменение (платно) и отмена
Решение
Слой 1 (~50 тестов)
| Подфича | Техника | Ключевые тесты |
|---|---|---|
| Входы поиска | EP + BVA | Валидные/невалидные города, диапазоны дат |
| Логика дат | BVA | Тот же день, обратный до вылета |
| Пассажир x класс | Попарное | 3 класса x количества |
| Правила бронирования | Таблица решений | Класс x изменение x отмена |
| Цикл билета | Переходы состояний | Найден → Забронирован → Изменён → Отменён |
Слой 2 (~15 тестов): Пути расчёта цен, логика доступности, обработка ошибок.
Слой 3 (~10 тестов + сессии): Edge cases пассажиров, доступность, локализация.
Задача 2
После EP и BVA для калькулятора скидок: покрытие операторов 68%, решений 55%.
Непокрытый код:
- Строки 34-40: Расчёт уровня лояльности для platinum
- Строки 55-62: Специальные цены на праздничные выходные
- Строки 78-85: Переопределение скидки для сотрудников
- Строки 92-98: Обработка отрицательных сумм
- Строки 105-110: Проверка устаревшего feature flag
Решение
| Непокрытый код | Анализ | Действие |
|---|---|---|
| Loyalty tier platinum | Пропущенный класс EP | Добавить класс EP + BVA для границ уровней |
| Праздничные цены | Временная логика | Добавить тесты: обычный день, праздник, выходной |
| Скидка сотрудника | Спец. тип пользователя | Добавить класс EP + таблицу решений |
| Отрицательные суммы | Защитный код | Добавить негативный тест |
| Устаревший feature flag | Мёртвый код | Проверить флаг выключен. Пометить на удаление |
Измерение комбинированной эффективности
| Метрика | Цель | Назначение |
|---|---|---|
| Покрытие требований | 100% | Каждое требование имеет тесты |
| Покрытие операторов | 80%+ | Большая часть кода выполняется |
| Покрытие решений | 75%+ | Большая часть ветвей тестируется |
| Mutation score | 80%+ на критичном коде | Тесты реально ловят дефекты |
| Показатель обнаружения | Растёт | Комбинированный подход находит больше багов |
Ключевые выводы
- Ни одна техника не достаточна — комбинируйте на основе спецификации, структуры и опыта
- Начинайте с техник спецификации как основы
- Используйте анализ покрытия для выявления структурных пробелов
- Заполняйте пробелы целевыми тестами, а не случайными
- Применяйте техники опыта для edge cases реального мира
- Измеряйте эффективность метриками покрытия, mutation score и показателем утечки дефектов
- Трёхслойный подход не последовательный — итерируйте по мере изучения системы