При TDD тестового кода по количеству больше программного в десять раз.
То есть сами тесты фиксируются, их нельзя менять/удалять, потому что они контролируют этот непричёсанный код.
Я понял, что там почти ничего нет, деланного с нуля.
Это делается затем, что если требования меняются к коду, чтобы переписать только тесты под новые требования
В тестах-то они выдумываются.
А ты когда-нибудь поднимал версии программ?
Там они (америкосы) предлагают оставлять говнокод до рефакторинга
Ты просто так не перекинешь эту инфраструктуру в другие программы
Инфраструктура покрыта функциональными/e2e тестами. Ты же не будешь покрывать тестами реализацию репозитория для базы данных, мокать query builder-ы и т.д. Это тупо, скучно, занимает много времени и несет мало ценности. Замокать репозиторий - да, замокать зависимости репозитория - не выйдет нормально. С точки зрения оптимизации времени разработки это наиболее выгодный подход. Бизнес логика не так часто меняется на уровне интерфейсов объектов и да даже если она меняется, это никогда не приносить каких-то мегабольших изменений вроде "блин надо добавить еще аргумент в тысячу тесткейсов", обычно изменение сигнатуры одного метода затрагивает только тесты, которые этот метод юзают, а это не может быть много тестов. Обычно такие изменения разве что у репозиториев бывают.
Повторюсь, у меня есть 3 слоя:
- domain layer - сущности, vo, сервисы. Все это покрыто юнит тестами. Чем сложнее бизнес логика, там удобнее применять TDD для разработки. Этот слой редко подвержен изменениям на уровне интерфейсов и т.д. А если интерфейсы и меняются, то затрагивают не так много тест кейсов, так как все максимально независимо друг от друга.
- application layer - сервисы уровня приложения, задача которых принять DTO запроса, дернуть другие сервисы что бы регламентировать флоу, и сформировать DTO ответа. Этот слой можно покрыть юнит тестами но это довольно скучно, так как по сути сам по себе этот слой не выполняет логику, он лишь регламентирует последовательность действий. Этот слой часто меняется и удобнее покрывать его интеграционными/функциональными/E2E тестами
- UI layer - в моем случае это довольно тонкая прослойка, чья задача состоит только в том что бы сконвертить запрос (обычно это http запрос) в DTO в нужном формате. У нас могут быть разные версии API или еще чего, да и код там обычно довольно тупой - замэпить объект на объект. Так же покрывается функциональными/E2E тестами.
- Слой инфраструктуры, он сквозной и реализует все интерфейсы, объявленные на предыдущих слоях. Например Domain layer регламентирует интерфейс репозитория где хранятся данные, а этот слой его реализует. На 90% этот слой - это фреймворк и/или сторонние библиотеки который мы используем, он уже покрыт юнит тестами. Оставшиеся 10% того что пилем мы - функциональные тесты.Да, главное, что-нибудь посложнее написать, чтобы потом никто в этом не разобрался. :)
Да ладно, это может звучит сложно, по факту это все очень легко и красиво поддерживать.
Не идёт оно вразрез. Просто вместо одного теста ты пишешь сто.
Речь идёт про реальные данные, которые нужны, а не про составленные.
а она не подходит к тем фичам, которые уже есть.
Тот интерфейс, который получается, формируется при создании тестов.
потому что пишешь не для себя, а чисто продал и забыл
Вот представь себе частое изменение требований, когда тесты надо выкидывать, потому что программа поменяла интерфейс.