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