Перейти к основному содержимому

ADR-0040: Testing Strategy — Стандарт Тестирования Backend

Статус

Принято.

Контекст

Pin является финансово-регуляторной системой с высокими требованиями к надёжности: ошибки в accounting, payment callbacks, KYC, incentive redemption или user safety могут привести к финансовым потерям или регуляторным нарушениям. Без чёткого стандарта тестирования сервисы расходятся по глубине покрытия, а critical paths остаются непокрытыми.

Решение

Пирамида Тестов


/E2E\ — минимально (smoke tests в staging)
/──────\
/ API / \ — WebApplicationFactory, TestServer
/──────────\
/ Application\ — handlers, behaviors, pipeline
/──────────────\
/ Domain \ — aggregates, value objects, domain services
/──────────────────\

Обязательный Стек

ИнструментНазначение
xUnitTest framework
FluentAssertionsAssertions
Moq + AutoFixture.AutoMoqMocks + test data generation
TestcontainersРеальные PostgreSQL, Kafka, Redis, ClickHouse, Elasticsearch
WebApplicationFactoryAPI component tests с реальным startup
MassTransit.TestingConsumer, saga, outbox behavior
RespawnБыстрый сброс БД между тестами
Pin.Kernel.TestingPinWebApplicationFactory, FakeActorContextModule

Обязательные Test Projects

tests/services/<service>/
<Service>.Domain.Tests/
<Service>.Application.Tests/
<Service>.Infrastructure.Tests/
<Service>.Api.Tests/
<Service>.Contract.Tests/
<Service>.TestKit/

Обязательные Тесты По Категориям

Financial code, identity, payment callbacks, game callbacks: unit + integration + consumer/idempotency.

Repository scope: user не видит чужое, tenant admin не видит другой tenant, missing scope fail closed, global admin bypass требует permission + audit.

State transitions: happy path, illegal transition, compensation для saga.

API: 401, 403, validation error, success, idempotent replay, audit для каждого high-impact endpoint.

Export: файл открывается, содержит правильные данные, privacy suppression работает, partner не получает чужое.

Последствия

  • Financial и security code не мержится без integration tests с реальными containers.
  • Testcontainers запускаются через shared fixtures для экономии ресурсов CI.
  • TestKit избавляет от дублирования setup между тестовыми классами.
  • FakeActorContextModule позволяет тестировать auth/scope без реального Identity Service.

Ссылки