Правила Backend Тестирования
Назначение
Документ задает стандарт тестирования .NET backend сервисов Pin: unit tests, integration tests, component tests через TestServer, contract tests, consumer idempotency tests и проверки observability/security boundaries.
Стек
| Инструмент | Назначение |
|---|---|
xUnit | основной test framework. |
FluentAssertions | readable assertions. |
Moq | mocks для ports и внешних зависимостей в unit/component tests. |
AutoFixture | test data builders для request/model/value objects. |
Testcontainers | PostgreSQL, Kafka, Redis, ClickHouse, Elasticsearch и provider stubs. |
WebApplicationFactory / TestServer | API component/integration tests. |
MassTransit Test Harness | consumer, saga и outbox/inbox behavior tests. |
Respawn или schema reset fixture | очистка PostgreSQL между integration tests. |
Структура
tests/services/<service-name>/
Pin.<Service>.Domain.Tests/
Pin.<Service>.Application.Tests/
Pin.<Service>.Infrastructure.Tests/
Pin.<Service>.Api.Tests/
Pin.<Service>.Contract.Tests/
Pin.<Service>.TestKit/
TestKit содержит factories, builders, container fixtures, fake clocks, fake actor contexts и helpers. Production projects не зависят от test projects.
Application tests зеркалируют feature slice:
Pin.Identity.Application.Tests/
Users/
GetUserRoles/
GetUserRolesQueryHandlerTests.cs
GetUserRolesQueryValidatorTests.cs
CreateUser/
CreateUserCommandHandlerTests.cs
CreateUserCommandValidatorTests.cs
Не создавать root-level CommandTests, QueryTests или HandlerTests, если тест относится к конкретному use case.
Unit Tests
Покрывают:
- aggregate invariants;
- value object validation;
- state transitions;
- domain services без I/O;
- pure policy/calculation code.
Правила:
- тестировать поведение, а не private implementation;
- не мокать aggregate;
- использовать
AutoFixturecustomizations для valid defaults; - illegal transition проверять как typed failure;
- money calculations проверять с
decimal, currency precision и rounding rules.
Application Tests
Покрывают MediatR handlers и pipeline decisions:
- validation failure;
- authorization failure;
- idempotency replay;
- transaction starts only after validation/authorization;
- audit/outbox side effects;
- repository scope filters через fake или integration repository;
- cancellation token propagation для I/O ports.
Mocks допустимы для external ports. Domain behavior не подменяется mocks.
Integration Tests
Обязательны для:
- financial code;
- identity/session/token code;
- game provider callbacks;
- payment webhooks;
- Kafka consumers;
- repository scope filters;
- outbox/inbox/idempotency;
- Elasticsearch/ClickHouse projections, если query behavior влияет на API.
Используются Testcontainers:
- PostgreSQL для EF migrations, constraints, transactions, concurrency;
- Kafka или MassTransit test transport для consumers/outbox behavior;
- Redis для cache/locks/rate limits;
- ClickHouse для analytics facts/reports;
- Elasticsearch для search trimming/rebuild.
API Tests
WebApplicationFactory/TestServer проверяет:
- authentication schemes;
- actor context middleware;
- tenant/brand resolution;
- permission policies;
- request validation;
- response contracts;
- error mapping;
- correlation headers;
- no raw PII/secrets in response/loggable error.
Каждый high-impact endpoint имеет tests для 401, 403, validation error, success, idempotent replay и audit.
Consumer И Saga Tests
Consumer tests покрывают:
- duplicate event не меняет state второй раз;
- out-of-order event handled/fails according to docs;
- DLQ/retry behavior;
- correlation/causation propagation;
- projection freshness update;
- compensation command для saga failure.
Saga tests обязаны проверять happy path, step timeout, compensation и retry после transient failure.
Repository Scope Tests
Для каждого сервиса с multi-tenant data:
- missing tenant scope fail closed;
- tenant admin не видит другой tenant;
- user/partner не может расширить owner scope через filters;
- global admin bypass требует permission и audit;
- Elasticsearch/ClickHouse report query использует такие же scope filters, как PostgreSQL.
Export Tests
Отчеты и выгрузки тестируются отдельно:
- XLSX создается через ClosedXML и открывается валидатором workbook;
- CSV использует documented delimiter/encoding и escaping;
- JSON соответствует schema;
- filters не позволяют partner выгрузить чужие данные;
- row limit, rate limit, retention и audit работают;
- privacy suppression скрывает малые buckets и PII.
Что Запускать Перед Commit
- Для docs-only changes: проверка ссылок/структуры, если есть локальный script; иначе
git status --short --branch. - Для narrow backend change: tests соответствующего layer/project.
- Для money/callback/event change: unit + integration + consumer/idempotency tests.
- Для shared building block: tests package-а и хотя бы один consuming service slice.
Обратные ссылки
Автоссылки: где используется этот документ.
- implementation-blueprint.md (1): Implementation Blueprint
- adr (1): ADR-0040: Testing Strategy — Стандарт Тестирования Backend
- index.md (1): Backend SDK — Руководство Разработчика
- 08-testing-patterns.md (1): Тестирование — Практическое Руководство
- 09-reporting-export.md (1): Reporting и Export — Практическое Руководство
- backend-rules.md (1): Правила Backend Разработки