Дублированный код - это такой же запах в коде модульного теста, как и в другом коде. Если у вас есть дублированный код в тестах, это затрудняет рефакторинг кода реализации, потому что вам нужно обновить непропорционально большое количество тестов. Тесты должны помочь вам с уверенностью выполнить рефакторинг, а не стать большим бременем, мешающим вам работать с тестируемым кодом.
Если дублирование уже настроено, рассмотрите возможность более широкого использования setUp
метода или предоставления более (или более гибких) методов создания .
Если дублирование заключается в коде, управляющем SUT, спросите себя, почему несколько так называемых «модульных» тестов реализуют одни и те же функции.
Если дублирование есть в утверждениях, возможно, вам понадобятся какие-то настраиваемые утверждения . Например, если в нескольких тестах есть строка утверждений вроде:
assertEqual('Joe', person.getFirstName())
assertEqual('Bloggs', person.getLastName())
assertEqual(23, person.getAge())
Тогда, возможно, вам понадобится единственный assertPersonEqual
метод, чтобы вы могли писать assertPersonEqual(Person('Joe', 'Bloggs', 23), person)
. (Или, возможно, вам просто нужно перегрузить оператор равенства Person
.)
Как вы упомянули, важно, чтобы тестовый код был читабельным. В частности, важно, чтобы цель теста была ясна. Я считаю, что если многие тесты выглядят в основном одинаково (например, три четверти строк одинаковы или практически одинаковы), трудно обнаружить и распознать существенные различия, не внимательно прочитав и не сравнив их. Итак, я считаю, что рефакторинг для удаления дублирования способствует удобочитаемости, потому что каждая строка каждого метода тестирования имеет прямое отношение к цели теста. Это гораздо полезнее для читателя, чем случайное сочетание строк, имеющих прямое отношение к делу, и строк, которые являются просто шаблонными.
Тем не менее, иногда тесты используют сложные ситуации, которые похожи, но все же значительно отличаются, и трудно найти хороший способ уменьшить дублирование. Используйте здравый смысл: если вы чувствуете, что тесты удобочитаемы и проясняют их намерения, и вам удобно, что, возможно, вам нужно обновить больше, чем теоретически минимальное количество тестов при рефакторинге кода, вызванного тестами, тогда примите несовершенство и переместите на что-нибудь более продуктивное. Вы всегда можете вернуться и провести рефакторинг тестов позже, когда придет вдохновение!