Мутационное тестирование: Stryker.NET
↑ 7.5 Нагрузочное и продвинутое тестирование · ← Предыдущая
Зачем это на собесе
Ответ на вопрос «как понять, что тесты действительно проверяют, а не просто выполняют код».
Объяснение
Мутационное тестирование вносит небольшие изменения (мутации) в код и запускает тесты. Если тесты падают — мутант «убит»; если проходят — «выжил», значит тесты этого изменения не замечают.
| Мутация | Пример |
|---|---|
| Арифметика | a + b → a - b |
| Сравнение | > → >= |
| Логика | && → || |
| Возврат | return x → return default |
| Удаление оператора | вызов метода удаляется |
Mutation score = убитые / (убитые + выжившие) × 100%.
dotnet tool install -g dotnet-stryker
cd tests/Orders.Tests && dotnet stryker --break-at 60 # падает, если score < 60%Результат — HTML-отчёт: какие мутанты выжили и в какой строке.
public decimal Discount(decimal total) => total >= 1000 ? total * 0.1m : 0; // выживший мутант: >= → > , если нет теста на 1000Улучшайте тесты, добавляя граничные случаи и проверки результата.
Нюансы и подводные камни
- Запуск долгий: применяйте на изменённом коде (
--since), в ночных сборках, для критичных модулей. - Эквивалентные мутанты (не меняют поведение) дают ложные «выжившие».
- 100% score не цель; смотрите на выжившие в важной логике.
- Медленные и нестабильные тесты замедляют всё.
- Дополняет, а не заменяет покрытие кода.
Практика
- Запустите Stryker на модуле расчётов и разберите выживших.
- Допишите тесты на граничные значения и убейте мутантов.
- Настройте порог в ночном CI.
Вопросы с ответами
Что такое выживший мутант?
Изменение кода, которое не привело к падению тестов, что показывает пробел в проверках.
Чем mutation score лучше coverage?
Coverage показывает выполнение кода, mutation score — способность тестов обнаружить ошибки.