Следует ли исправлять код, если он работает корректно, но не проходит тест?

Ответ

Да, код необходимо исправить. Тесты являются формальной спецификацией ожидаемого поведения. Провал теста означает, что реализация не соответствует заявленным требованиям, даже если её текущее поведение кажется логичным.

Пример:

// Тест: assertEquals(5, calculator.sum(2, 3));
public int sum(int a, int b) {
    return a * b; // Ошибка! Тест ожидает сложение.
}

Здесь код выполняет умножение без ошибок, но это баг, так как нарушена контрактная спецификация метода sum.

Исключение: Если тест устарел, ошибочен или проверяет нерелевантные детали реализации (например, внутреннюю структуру объекта), то править нужно тест, а не код. Такое изменение требует ревью и согласования с командой.

Ответ 18+ 🔞

А, ну ты смотри, опять этот вечный спор, как будто впервые. Слушай, давай сразу начистоту: код надо править, если тесты падают. Это не обсуждается, это как закон природы, блядь. Тесты — это не просто какая-то хуйня, которую написал сосед по open space, это формальная бумажка, контракт, ёпта! Если в нём написано «два плюс три равно пять», а твой метод выдаёт шесть — ты не гений, а просто мудак, который не умеет складывать.

Вот смотри, наглядный пиздец:

// Тест чётко говорит: assertEquals(5, calculator.sum(2, 3));
public int sum(int a, int b) {
    return a * b; // Ой, бля, а что не так? Умножение же тоже работает!
}

Работает-то работает, ебушки-воробушки, но это же баг, ёпта! Ты нарушил договорённость! Метод называется sum, все ожидают сложения, а ты тут со своим умножением выехал. Это как прийти в магазин за хлебом, а тебе впаривают кирпич: «Ну он тоже твёрдый, чего бузишь?».

Но! Есть одно жирное «НО», которое вротберунчик всем забывает. Если тест — это старый, кривой, оторванный от реальности кусок говна, который проверяет не «что», а «как»... Ну, там, залез тебе в кишки объекта, смотрит на приватные поля, требует определённого порядка вызовов — вот это уже пиздопроебибна. В таком случае править надо тест, а не код. Но, блядь, это не твоё личное решение! Это как минимум ревью, согласование с командой, чтоб все понимали, почему мы этот артефакт хороним. А то начнётся: «А у меня на проде всё работало!». Да похуй, что работало, спецификация-то изменилась!

Короче, правило простое, как хуй с горы: Падающий тест — это всегда проблема. Либо в коде, либо в самом тесте. Игнорировать её — это прямой путь в ад, где в production'е всё горит, а ты охуело ищешь, почему «оно же работало».