Стоит ли писать тесты на раннем этапе разработки
Что проверяют
Не согласитесь ли вы с очевидным, не подумав. Ответ «да» ожидаем, но ценность в другом: какие тесты вы пишете сразу, какие откладываете осознанно и отличаете ли тесты от процента покрытия.
Как отвечать
Да, раньше дешевле: чем позже найдена ошибка, тем больше кода на неё опирается и тем дороже правка. Но добавьте, что «рано» для разных видов тестов означает разное.
Сразу пишутся юнит-тесты на доменную логику: расчёты, переходы состояний, разбор входных данных. Они не поднимают контекст, идут за миллисекунды и переживают любой рефакторинг инфраструктуры. Здесь же уместен подход, когда тест пишется до кода: он не столько проверяет, сколько заставляет продумать интерфейс и граничные случаи.
Интеграционные тесты на репозитории и внешние вызовы подключают, когда схема данных устоялась. Держат их на настоящей базе в контейнере, а не на встроенной в память: диалект и блокировки отличаются, и зелёный тест на подменённой базе даёт ложную уверенность.
Откладывать разумно тесты на разведочный код, который пишется ради понимания задачи и будет выброшен, и на интерфейс, который заведомо переделают. Честно назовите и цену: тест это код, который тоже поддерживают, а хрупкий тест на моках внутренних классов ломается при каждом рефакторинге, ничего при этом не находя.
Хороший финал: тесты окупаются не числом пойманных багов, а тем, что позволяют менять код без страха.
Где спотыкаются
Называют целью процент покрытия. Покрытие показывает, какие строки исполнились, а не какие проверены: тест без единого утверждения даёт покрытие и не ловит ничего.
Второе: пишут ранние тесты на внутренние детали, привязываясь через моки к именам методов и порядку вызовов. Любая перестановка внутри класса красит их красным, и команда начинает править тесты вместо кода.
Третье: рассказывают историю про резкое падение числа багов с круглой цифрой, взятой из воздуха. Такая цифра разваливается на первом уточняющем вопросе. Лучше назвать один конкретный сценарий: что поймал тест и что случилось бы без него.