Инженерная практика
TDD: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый — решение, которое senior принимает под реальными ограничениями: хрупкий набор, незнакомый вендор, зелёный CI поверх 67% mutation score — не определение для заучивания.
Убедись, что связываешь сквозную линию юнита: тест-сначала как давление на дизайн, правило границ для дублёров, property вместо примеров, когда налог TDD оправдан, и mutation score как метрику, которую покрытие не подделает.
Пишешь тест сначала и обнаруживаешь, что для проверки одного правила отмены заказа нужно сконструировать четырёх коллабораторов — БД, платёж, email, флаги. О чём на самом деле говорит тест?
PriceCalculator использует чистый TaxRule, который ты владеешь, и сторонний CurrencyApi по HTTP. Как задублировать каждого для устойчивого unit-теста?
Денежный форматтер имеет 94% покрытия и восемь месяцев зелёного CI, потом дважды списывает с клиента на значении, оканчивающемся на .005. Почему каждый example-тест это пропустил и что бы поймало?
Senior настаивает на полном TDD для двухдневного spike по оценке незнакомого вендорского API и решения, подписывать ли контракт. Почему это неверное решение?
Биллинговый модуль показывает 100% покрытия строк, но 67% mutation score, с выжившим граничным мутантом '>' → '>='. Как это читать?
Сквозь весь юнит — какая линия отличает набор тестов-актив от набора-обузы?
Спина юнита — один цикл суждения. Тест-сначала — это давление на дизайн: трудносконструируемый объект и есть дизайн-ревью, а не препятствие для мокания. Правило границ укрощает дублёров: мокай то, что не можешь прогнать, используй реальные объекты для своего кода, проверяй состояние. Example-тесты покрывают лишь воображённые входы, поэтому property генерируют остальное и шринкуют падение до минимального контрпримера. Налог TDD (15–22%) окупается пропорционально стабильности спеки и времени жизни кода — сделай spike по неизвестному, потом перестрой. А mutation score — честная метрика: покрытие доказывает, что строка прогналась, выживший мутант доказывает, что тест баг бы пропустил. Сквозь всё это — привязывайся к поведению, никогда к структуре.