Должен ли я написать тест, чтобы доказать, что удаление кода исправляет ошибку?

14

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

Теперь кажется странным иметь тест, утверждающий, что какой-то код был удален. Конечно, я полагаю, что это гарантирует, что никто не будет копаться в системе контроля версий и вернет этот код обратно, но стоит ли это того? Если оно того стоит, оно, безусловно, кажется менее ценным, чем написание теста для добавленного кода , верно?

jhewlett
источник
8
Я думаю, что любой регрессионный тест полезен, независимо от того, как ошибка была исправлена
Исмаил Бадави
1
Тест не утверждает, что код был удален - тест утверждает, что ошибка исправлена ​​...
user253751

Ответы:

50

Вы смотрите на это неправильно. Тест не утверждает, что код был удален. Тест делает утверждает , определенную функциональность.

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

Еще один способ взглянуть на это с точки зрения TDD заключается в следующем: когда вы знаете, что удаление кода исправляет ошибку, а затем задаетесь вопросом, писать ли тест, вы уже сделали TDD неправильно. После того, как вы начнете работать над ошибкой, вы должны сначала написать тест, который гарантирует наличие ошибки при ее сбое. Только после этого вы исправляете фактическую ошибку - которая может потребовать удаления кода или нет - и делаете тестовый проход. Вопрос, который вы задаете, даже не возникает таким образом.

Фрэнк
источник
3
+1, но я могу представить себе следующую ситуацию: удаленный код содержал некоторые абсурдные функции, добавленные кем-то, кто неправильно понимал проблемную область. Теперь, во время проверки кода, другой разработчик видит, что вся эта часть на самом деле бессмысленна, и код будет удален. Наличие большого количества тестов для такого бессмысленного поведения может привести к раздуванию вашего набора тестов.
Док Браун
2
Очевидно, что удаленная функциональность неправильно обрабатывает некоторые операции ввода / вывода. Очевидно, что кто-то в дальнейшем может неправильно понять проблему таким же образом. Если вы боитесь раздувания тестового набора, я не думаю, что TDD для вас. В любом случае, что такое раздутый костюм?
Дорус
3
@DocBrown: Если они делают TDD, то должен быть какой-то тест, который требует такой абсурдной функциональности, иначе им вообще не разрешили бы написать этот код! Помните, что вы можете написать только минимальный объем кода для прохождения теста. Если нет такой тест, то код никогда не должен был написан в первую очередь , и это может быть просто удален. Если есть тест, который вызывает такое абсурдное поведение, то этот тест следует удалить, и теперь мы находимся в том же случае, который я описал ранее: тест пройден, удалите код.
Йорг Миттаг,
В обоих случаях вы никогда не добавляете никаких тестов в набор тестов, а во втором случае вы даже удаляете один из них. Однако, если окажется, что тест на самом деле имеет смысл, то функциональность была не такой уж абсурдной.
Йорг Миттаг,