ADR-0023: Пирамида тестирования и контрактные тесты провайдеров

Status: accepted Date: 2026-04-17 Deciders: команда проекта

Контекст

Проект интегрируется с внешними поставщиками и одновременно содержит сложную доменную логику. Без явной тестовой архитектуры система быстро скатится либо в дорогие и хрупкие E2E, либо в набор unit-тестов без проверки реальных интеграционных рисков.

Отдельно нужно зафиксировать:

  • использование mockery для внутренних портов;
  • тестирование внешних провайдеров на моковых API-ответах;
  • минимальный, но реальный smoke layer.

Решение

Фиксируется тестовая пирамида:

  1. Unit — основной объём покрытия, рядом с кодом, с mockery-сгенерированными моками.
  2. Service/Integration — проверка wiring, БД, Kafka, адаптеров, транзакций и observability.
  3. Provider contract tests — тестирование клиентов поставщиков на моковом HTTP API (httptest.Server или эквивалент) с fixture-ответами, записанными из реальных/sandbox ответов.
  4. 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

Отклонено: ручные моки быстро расходятся с интерфейсами и плодят ложную уверенность.

Ссылки