Я считаю, что это зависит от самого кода. Я не буду повторять заявления Джоэла из SO подкаста № 38, но в итоге получилось «постараться быть прагматичным».
Большой охват кода в основных элементах приложения.
Я смотрю на код как на дерево зависимостей, если листья работают (например, базовый пользовательский интерфейс или код, вызывающий модульный тестируемый DAL), и я тестировал их, когда разрабатывал или обновлял их, есть велика вероятность того, что они сработают, и если есть ошибка, то ее не составит труда найти или исправить, поэтому время, потраченное на макет некоторых тестов, вероятно, будет потрачено впустую. Да, существует проблема, из-за которой обновления кода, от которого они зависят, могут повлиять на них, но, опять же, это зависит от конкретного случая, и модульные тесты для кода, от которого они зависят, должны покрывать это.
Когда речь идет о стволах или ветви кода, да, охват кода функциональностью (в отличие от каждой функции), очень важен.
Например, недавно я работал в команде, которая создала приложение, для которого требовался набор вычислений для расчета выбросов углерода. Я написал набор тестов, в которых проверялись все расчеты, и при этом был рад видеть, что шаблон внедрения зависимостей работает нормально.
Неизбежно, из-за изменения правительственного акта, мы должны были добавить параметр в уравнения, и все 100+ тестов прервались.
Я понял, что обновлять их, помимо тестирования на опечатку (которую я мог протестировать один раз), я занимался модульным / регрессионным тестированием, и вместо этого потратил время на создание другой области приложения.