Каков наилучший способ действий в TDD, если после правильной реализации логики тест по-прежнему не проходит (потому что в тесте есть ошибка)?
Например, предположим, что вы хотели бы разработать следующую функцию:
int add(int a, int b) {
return a + b;
}
Предположим, мы разработали его в следующие шаги:
Написать тест (пока нет функции):
// test1 Assert.assertEquals(5, add(2, 3));
Приводит к ошибке компиляции.
Напишите фиктивную реализацию функции:
int add(int a, int b) { return 5; }
Результат:
test1
проходит.Добавьте еще один тест:
// test2 -- notice the wrong expected value (should be 11)! Assert.assertEquals(12, add(5, 6));
Результат:
test2
не удается,test1
все еще проходит.Напишите реальную реализацию:
int add(int a, int b) { return a + b; }
Результат:
test1
все еще проходит,test2
все еще терпит неудачу (так как11 != 12
).
В данном конкретном случае: было бы лучше:
- исправить
test2
и посмотреть, что сейчас проходит, или - удалите новую часть реализации (т. е. вернитесь к шагу № 2, приведенному выше), исправьте
test2
и оставьте ее неудачной, а затем снова введите правильную реализацию (шаг № 4 выше).
Или есть какой-то другой, более умный способ?
Хотя я понимаю, что примерная проблема довольно тривиальна, меня интересует, что делать в общем случае, который может быть более сложным, чем сложение двух чисел.
РЕДАКТИРОВАТЬ (в ответ на ответ @Thomas Junk):
Основное внимание в этом вопросе уделяется тому, что TDD предлагает в таком случае, а не тому, что является «универсальной передовой практикой» для достижения хорошего кода или тестов (которые могут отличаться от способа TDD).