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

Правила Backend Тестирования

Назначение

Документ задает стандарт тестирования .NET backend сервисов Pin: unit tests, integration tests, component tests через TestServer, contract tests, consumer idempotency tests и проверки observability/security boundaries.

Стек

ИнструментНазначение
xUnitосновной test framework.
FluentAssertionsreadable assertions.
Moqmocks для ports и внешних зависимостей в unit/component tests.
AutoFixturetest data builders для request/model/value objects.
TestcontainersPostgreSQL, Kafka, Redis, ClickHouse, Elasticsearch и provider stubs.
WebApplicationFactory / TestServerAPI component/integration tests.
MassTransit Test Harnessconsumer, 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;
  • использовать AutoFixture customizations для 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.

Обратные ссылки

Автоссылки: где используется этот документ.