Как справиться с фазой рефакторинга TDD

#unit-testing #refactoring #tdd

#модульное тестирование #рефакторинг #tdd

Вопрос:

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

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

Ответ №1:

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

Имитировать зависимости часто бывает полезно, но не всегда, и я бы не сказал, что «правильно для модульного теста» имитировать все зависимости.

На этапе рефакторинга TDD вы должны вносить изменения в производственный код, которые не влияют на прохождение тестов. И вы не должны изменять тесты одновременно.

Возможно, позже вы захотите модифицировать свои тесты так, чтобы извлеченный код тестировался независимо от исходного кода и подвергался издевательствам в оригинальных тестах.

Комментарии:

1. Так что, можно модифицировать тесты?

2. Конечно. Но они должны продолжать работать и обеспечивать то же покрытие, пока вы этого не сделаете. Рефакторинг не приводит к тому, что у вас внезапно появляется непокрытый код.

3. Я думаю, что одним из моих рефакторингов был скрытый новый код, следовательно, он не тестировался.

Ответ №2:

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

Или, может быть, после рефакторинга вы пытаетесь провести тесты для чего-то, чего не должны, например, для частных методов. Рефакторинг в любом случае не должен изменять покрытие вашего кода.

Комментарии:

1. Ничего из этого не было, но это хорошие попытки диагностики. Проверьте комментарии @Don Roby о том, что произошло.