ADR-0023: Пирамида тестирования и контрактные тесты провайдеров
Status: accepted Date: 2026-04-17 Deciders: команда проекта
Контекст
Проект интегрируется с внешними поставщиками и одновременно содержит сложную доменную логику. Без явной тестовой архитектуры система быстро скатится либо в дорогие и хрупкие E2E, либо в набор unit-тестов без проверки реальных интеграционных рисков.
Отдельно нужно зафиксировать:
- использование
mockeryдля внутренних портов; - тестирование внешних провайдеров на моковых API-ответах;
- минимальный, но реальный smoke layer.
Решение
Фиксируется тестовая пирамида:
- Unit — основной объём покрытия, рядом с кодом, с
mockery-сгенерированными моками. - Service/Integration — проверка wiring, БД, Kafka, адаптеров, транзакций и observability.
- Provider contract tests — тестирование клиентов поставщиков на моковом HTTP API (
httptest.Serverили эквивалент) с fixture-ответами, записанными из реальных/sandbox ответов. - E2E smoke — ограниченный набор сценариев на собранной среде, без превращения в основной слой регрессии.
Дополнительные правила:
- hand-written mocks/stubs/fakes для нового production-кода не используются;
- live-вызовы к поставщикам не блокируют merge-request pipeline;
- для провайдеров допускается отдельный scheduled smoke в sandbox/non-prod контуре.
Последствия
Плюсы
- Основная регрессия остаётся быстрой.
- Интеграции с поставщиками проверяются детерминированно и без внешней сети.
- Контракты адаптеров и retry/auth parsing paths получают отдельный слой защиты.
Минусы
- Нужна дисциплина поддержки fixture-набора и mock generation.
- Появляется отдельный слой contract tests, который нужно поддерживать как артефакт.
Нейтральные последствия
- E2E остаются важными, но не заменяют unit/service/contract layers.
Рассмотренные альтернативы
Делать ставку только на E2E
Отклонено: дорого, медленно и нестабильно для provider-heavy продукта.
Live API calls в каждом MR
Отклонено: rate limits, flaky network и нестабильность внешних сред делают такой pipeline ненадёжным.
Ручные моки вместо mockery
Отклонено: ручные моки быстро расходятся с интерфейсами и плодят ложную уверенность.