У меня есть два ответа на ваш вопрос, один философский, а другой тактический.
На философском фронте важно рассматривать ваши юнит-тесты как код. Это означает, что все нормальные черты хорошего кода обычно подходят для хороших тестов: выявление намерений, удаление дублирования и т. Д. Многие, возможно, большинство сбоев, которые я видел при модульном тестировании, произошли потому, что люди не обработали свои тесты таким образом, но вместо того, чтобы просто закодировать их и никогда не пересматривать их, чтобы увидеть, следует ли их реорганизовать.
По моему опыту, если вы достигли точки, когда ваши юнит-тесты являются препятствием для изменения, это потому, что у вас есть технический долг в ваших тестах.
Итак, мое тактическое предложение заключается в том, что перед тем, как пытаться изменить свои требования, вы должны реорганизовать свои тесты. Каждый тест должен иметь уникальную причину для прохождения / неудачи, и поведение вне этого должно быть в общем коде. Это означает, что для любого данного изменения поведения у вас будет два места для изменения тестов:
- Тест, который фактически проверяет это поведение
- Места, в которых это поведение используется в общем коде приборов
Вы могли бы найти эту статью полезной: Вырасти свое упряжь естественно . На самом деле речь шла о многоразовом жгуте для функционального тестирования, но я нахожу идеи очень полезными и в моих модульных тестах.