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