Mutation testing
Обычное покрытие показывает лишь процент выполненных строк, но не гарантирует, что тесты проверяют поведение. Код можно исполнить весь, но не проверить важных условий — например, тест вызывает функцию, игнорируя результат. Мутационное тестирование вскрывает такие слепые зоны, заставляя тесты реагировать на каждое осмысленное изменение. Это ценно в медицинском ПО, автомобильных системах, финансовых алгоритмах и при рефакторинге легаси.
Процесс выглядит так: генератор создаёт сотни мутантов — копий программы с одним отличием. Для каждого запускается полный набор тестов. Если тесты завершаются ошибкой — мутант уничтожен. Если проходят — тесты нечувствительны к изменению. Так находятся конкретные непроверенные сценарии.
Пример: функция разрешает доступ с 18 лет, условие `if (age >= 18)`. Мутант меняет `>=` на `>`. Тест с возрастом 18 ожидает успех, но получает отказ — тест падает, это правильно. Если же такого граничного теста нет, мутация выживает и указывает на пробел.
Вывод: мутационное тестирование — мощный, но дорогой инструмент. Тысячи мутантов требуют много ресурсов, поэтому его применяют точечно, для критически важной логики. Зато оно даёт уверенность, что тесты не просто «покрывают» строки, а действительно ловят ошибку, когда она возникнет.
Поделиться