Мутационное тестирование: Stryker.NET

↑ 7.5 Нагрузочное и продвинутое тестирование · ← Предыдущая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Ответ на вопрос «как понять, что тесты действительно проверяют, а не просто выполняют код».

Объяснение

Мутационное тестирование вносит небольшие изменения (мутации) в код и запускает тесты. Если тесты падают — мутант «убит»; если проходят — «выжил», значит тесты этого изменения не замечают.

МутацияПример
Арифметика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 не цель; смотрите на выжившие в важной логике.
  • Медленные и нестабильные тесты замедляют всё.
  • Дополняет, а не заменяет покрытие кода.

Практика

  1. Запустите Stryker на модуле расчётов и разберите выживших.
  2. Допишите тесты на граничные значения и убейте мутантов.
  3. Настройте порог в ночном CI.

Вопросы с ответами

Связанные темы