Что такое мутационное тестирование (Mutation Testing)?

«Что такое мутационное тестирование (Mutation Testing)?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Как работает:

  1. Создание мутантов: Инструмент автоматически вносит изменения в код (например, заменяет операторы, изменяет значения).
  2. Запуск тестов: Для каждого мутанта выполняется набор тестов.
  3. Анализ результата:
    • Если тесты падают — мутант убит (тесты эффективны).
    • Если тесты проходят — мутант выживает (это указывает на возможную недостаточность тестового покрытия).

Пример мутации в Java:

// Исходный код
public int add(int a, int b) {
    return a + b;
}

// Мутант (замена оператора)
public int add(int a, int b) {
    return a - b; // Мутация
}

Если тесты для метода add не проваливаются на этом мутанте, значит они не проверяют корректность именно операции сложения.

Популярные инструменты: Pitest (Java), Stryker (.NET, JavaScript).

Преимущества:

  • Выявляет слабые, неэффективные тесты (которые проходят, но не проверяют логику).
  • Помогает найти недостижимый или избыточный код.

Недостатки:

  • Высокие вычислительные затраты (генерируется и проверяется множество мутантов).
  • Может создавать эквивалентные мутанты (которые семантически не меняют поведение программы), что приводит к ложным срабатываниям.