Гарантирует ли успешное прохождение тестов до и после изменения кода его корректность?

«Гарантирует ли успешное прохождение тестов до и после изменения кода его корректность?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. Успешное прохождение существующих тестов до и после модификации кода не является гарантией его корректности. Это лишь указывает на то, что изменения не сломали проверяемую тестами функциональность.

Потенциальные проблемы:

  1. Недостаточное покрытие тестами (low test coverage): Тесты могут проверять лишь часть сценариев использования. Изменение могло внести ошибку в непокрытую логику.
  2. Ложноположительные (false positive) тесты: Тест может быть написан некорректно и всегда проходить, не проверяя реальное поведение.
  3. Непрямые побочные эффекты: Изменение могло повлиять на другие модули, не связанные с текущими тестами.
  4. Изменение семантики при сохранении результата: Код может начать делать что-то другое, но для конкретного тестового набора данных результат останется прежним.

Пример:

// Исходный код
public int calculate(int a, int b) {
    return a + b; // Сложение
}
// Тест: assert calculate(2, 2) == 4 (проходит)

// Изменённый (ошибочный) код
public int calculate(int a, int b) {
    return a * b; // Умножение вместо сложения
}
// Тест: assert calculate(2, 2) == 4 (ВСЁ ЕЩЁ ПРОХОДИТ!)

Вывод: Всегда анализируйте изменения, пишите тесты для новых кейсов и стремитесь к высокому покрытию, чтобы повысить уверенность в корректности.