DDD-спецификация: гайд для тестировщика

Тестирование DDD: матрицы переходов, BR-тесты, E2E, Saga.

DDD тестирование

DDD тестирование — этот документ собирает все блоки тестирования из DDD-спецификации и реорганизует их по типам тестов. Для каждого раздела даны конкретные чеклисты, матрицы и примеры тест-кейсов.

Связанные документы:

DDD тестирование: роль QA в DDD-спецификации

Тестировщик извлекает из каждого раздела DDD-спецификации конкретные тест-кейсы. Спецификация -- не абстрактный документ, а прямой источник: граничных значений, матриц переходов, чеклистов авторизации и сценариев ошибок. Задача QA -- превратить каждый раздел в проверяемые тесты и убедиться, что реализация соответствует контракту.


1. Границы тестирования

Источник: раздел 1 -- Bounded Context

Bounded Context определяет границы тестирования:

  • Что внутри -- тестируем полностью (функционально, интеграционно, нагрузочно). В примере: создание, подтверждение и отмена заказов, управление позициями, расчет стоимости.
  • Что снаружи -- тестируем только на уровне интеграции (контракты, таймауты, обработка ошибок). В примере: каталог товаров, обработка платежей, логистика.
  • Соседние контексты -- для каждого соседа три сценария: корректный обмен, недоступность, некорректные ответы и таймауты.

2. Терминология в тестах

Источник: раздел 2 -- Ubiquitous Language

Глоссарий -- основа для именования тест-кейсов и тестовых данных:

  • Те же термины в тестах: test_createOrder_withTwoItems_success, а не test_makePurchase_withProducts.
  • Проверять, что в UI, API-ответах и ошибках используются правильные термины из глоссария.
  • Антислова -- повод для баг-репорта: если в интерфейсе встретилось слово из колонки "Не используем" -- это дефект. Например, "Покупка" вместо "Заказ", "Продукт" вместо "Товар".

3. Тестовые данные из доменной модели

Источник: раздел 3 -- Domain Model

Доменная модель -- источник тестовых данных и граничных значений:

  • Типы данных -- тесты на невалидные значения: quantity = 0, amount = -0.01, zipCode = "abc".
  • Ограничения -- граничные значения: quantity = 1 (мин), quantity = 99 (макс), amount = 0.01.
  • Обязательность -- apartment необязательно: проверить, что заказ создается без квартиры.
  • Агрегат -- транзакционная граница: добавление позиции и пересчет суммы атомарны.

Примеры граничных значений:

АтрибутВалидныеНевалидныеГраничные
quantity5, 500, -1, 100, "abc"1 (мин), 99 (макс)
amount100.00, 1.00-0.01, null0.01 (мин допустимый)
zipCode"101000""abc", "12345", "1234567"6 цифр ровно

4. Матрица переходов состояний

Источник: раздел 4 -- Жизненный цикл и состояния

Диаграмма состояний -- главный источник тест-кейсов. Полная матрица переходов (6 x 6 = 36 комбинаций, 7 допустимых):

Из / ВCREATEDCONFIRMEDPAIDSHIPPEDDELIVEREDCANCELLED
CREATED--данетнетнетда
CONFIRMEDнет--данетнетда
PAIDнетнет--данетнет
SHIPPEDнетнетнет--данет
DELIVEREDнетнетнетнет--нет
CANCELLEDнетнетнетнетнет--
  • Каждое "да" -- позитивный тест-кейс: переход выполнен, статус изменился, событие опубликовано.
  • Каждое "нет" -- негативный тест-кейс: система возвращает корректную ошибку, статус не меняется.
  • Конечные состояния: DELIVERED и CANCELLED -- из них нет выхода. Любая попытка перехода должна быть отклонена.

5. Тесты авторизации

Источник: раздел 5 -- Роли и права доступа

Матрица доступа -- прямой чеклист тестов авторизации:

КомандаCustomerManagerAdmin
CreateOrderда (свой)нетда
ConfirmOrderда (свой)нетда
AddItemда (свой, CREATED)нетда
CancelOrderда (свой, до оплаты)нетда
ShipOrderнетдада
DeliverOrderнетдада
InitiateRefundнетнетда
  • Каждое "да" -- позитивный тест (200 OK).
  • Каждое "нет" -- негативный тест (403 Forbidden).
  • Изоляция данных: Покупатель A не видит заказы Покупателя Б.
  • Региональные ограничения: Менеджер "Москва" не видит заказы "СПб".

6. Тесты бизнес-правил

Источник: раздел 6 -- Бизнес-правила и инварианты

Каждый BR-N -- минимум два теста:

BRПозитивный тестНегативный тестГраничный тест
BR-1Заказ с 1 позицией -> OKЗаказ с 0 позиций -> ошибка1 позиция (граница)
BR-2quantity = 5 -> OKquantity = 0 -> ошибка, quantity = 100 -> ошибкаquantity = 1 (мин), quantity = 99 (макс)
BR-3totalAmount = 1.00 -> OKtotalAmount = 0.99 -> ошибка1.00 (граница)
BR-4Отмена в CREATED -> OKОтмена в PAID -> ошибкаОтмена в CONFIRMED (последний допустимый)
BR-5Тот же товар -> количество увеличивается--Увеличение до quantity > 99
BR-6addItem в CREATED -> OKaddItem в CONFIRMED -> ошибка--

7. Тесты команд

Источник: раздел 7 -- Commands

Каждая команда порождает набор тест-кейсов:

  1. Happy path -- все валидно, команда выполнена, событие опубликовано, статус изменился.
  2. Невалидные параметры -- каждый параметр: пустой, null, за пределами допустимого диапазона.
  3. Неправильный статус -- например, AddItem для заказа в PAID -> ошибка ORDER_MODIFICATION_FORBIDDEN.
  4. Неправильная роль -- например, Менеджер вызывает CreateOrder -> 403 Forbidden.
  5. Проверки BR -- каждое указанное бизнес-правило отдельным тестом.
  6. Событие -- payload содержит корректные данные после успешного выполнения.

8. Тесты событий

Источник: раздел 8 -- Domain Events

Для каждого события проверять:

  1. Факт публикации -- после команды событие опубликовано в outbox / Kafka.
  2. Payload -- все поля корректны, типы данных соответствуют спецификации.
  3. Подписчики получают -- каждый указанный подписчик обработал событие.
  4. Идемпотентность -- повторная обработка не дублирует эффект (склад не резервирует дважды).
  5. Порядок -- OrderCreated приходит раньше OrderPaid.

9. Тесты read-модели

Источник: раздел 9 -- Queries

Тесты на read-модель:

  • Фильтры -- каждый фильтр работает корректно (status, customerId, dateFrom/dateTo), комбинации фильтров.
  • Пагинация -- первая страница, последняя, пустая, выход за границы (page > max).
  • Сортировка -- по умолчанию (дата создания) и явная (по сумме), ASC/DESC.
  • Изоляция данных -- Покупатель A не видит заказы Покупателя Б через SearchOrders.
  • Консистентность -- после CreateOrder заказ сразу появляется в SearchOrders.

10. Контракт-тесты API

Источник: раздел 9.1 -- API-контракт (OpenAPI)

API-контракт -- основа для контракт-тестов:

  • Schema validation -- каждый эндпоинт: ответ соответствует OpenAPI spec.
  • Все HTTP-статусы -- для каждого эндпоинта протестировать: 200/201, 400, 401, 403, 404, 409, 422, 503.
  • Backward compatibility -- новая версия API не ломает существующих потребителей.

Маппинг эндпоинтов для проверки:

ЭндпоинтКоманда / Запрос
POST /api/v1/ordersCreateOrder
PUT /api/v1/orders/{orderId}/confirmConfirmOrder
POST /api/v1/orders/{orderId}/itemsAddItem
PUT /api/v1/orders/{orderId}/cancelCancelOrder
PUT /api/v1/orders/{orderId}/shipShipOrder
PUT /api/v1/orders/{orderId}/deliverDeliverOrder
POST /api/v1/orders/{orderId}/refundInitiateRefund
GET /api/v1/orders/{orderId}GetOrder
GET /api/v1/ordersSearchOrders

11. E2E тесты из Use Cases

Источник: раздел 10 -- Use Cases

Use Cases -- сценарии для E2E-тестов:

  • Основной поток -> один E2E-тест "happy path" (создание заказа от авторизации до подтверждения).
  • Каждый альтернативный поток -> отдельный E2E-тест (например, пустая корзина, товар закончился).
  • Предусловия -> фикстуры: "покупатель авторизован, в корзине товары".
  • Постусловия -> assert-ы: "заказ в статусе CREATED, событие опубликовано".

12. UI-тесты

Источник: раздел 11 -- UI-спецификация

UI-спецификация -- источник UI-тестов:

  • Привязка к данным -> экран загружает данные из правильных запросов.
  • Привязка к действиям -> кнопки вызывают правильные команды.
  • Отображение ошибок -> каждая ошибка из колонки "Ошибки" отображается на нужном экране.
  • Платформа -> если указано "web, mobile" -- тестировать на обеих платформах.

Реестр экранов для тестирования:

IDНазваниеКомандыОшибкиПлатформа
UI-001Оформление заказаCreateOrder, AddItemORDER_EMPTY, ORDER_ITEM_OUT_OF_STOCKweb, mobile
UI-002Подтверждение заказаConfirmOrder, CancelOrderORDER_CANCEL_FORBIDDENweb, mobile
UI-003Список заказов----web, mobile
UI-004Карточка заказаCancelOrder, InitiateRefundORDER_CANCEL_FORBIDDEN, ORDER_MODIFICATION_FORBIDDENweb, mobile
UI-005Панель менеджераShipOrder, DeliverOrder--web

13. Тесты Saga

Источник: раздел 12 -- Сложные процессы (Saga / Process Manager)

Для каждой Saga (Обработка заказа, Возврат средств) пять типов тестов:

  1. Happy path -- все шаги успешны, процесс завершен корректно.
  2. Ошибка на каждом шаге -- отдельный тест на сбой каждого шага (резервирование, оплата, доставка).
  3. Компенсация -- при ошибке оплаты проверить, что резерв на складе отменен.
  4. Таймаут -- имитировать таймаут (30 сек на резерв/оплату, 5 мин на доставку), проверить retry (до 3 раз) и компенсацию.
  5. Идемпотентность -- retry не дублирует эффект (двойной резерв, двойная оплата).

14. Негативное тестирование

Источник: раздел 13 -- Каталог ошибок

Каталог ошибок -- чеклист для негативного тестирования. Для каждой строки:

  1. Воспроизвести условие ошибки.
  2. Проверить код ошибки (не generic 500).
  3. Проверить HTTP-статус.
  4. Проверить текст сообщения.
  5. Убедиться, что при ошибке состояние не изменилось.
  6. Проверить отображение на нужном экране (колонка "Ошибки" в реестре экранов).

Каталог ошибок:

КодHTTPКогда
ORDER_EMPTY422Нарушение BR-1
ORDER_ITEM_INVALID_QUANTITY422Нарушение BR-2
ORDER_TOTAL_TOO_LOW422Нарушение BR-3
ORDER_CANCEL_FORBIDDEN409Нарушение BR-4
ORDER_MODIFICATION_FORBIDDEN409Нарушение BR-6
ORDER_ITEM_OUT_OF_STOCK409Товар недоступен
ORDER_NOT_FOUND404Несуществующий или чужой orderId
CATALOG_SERVICE_UNAVAILABLE503Сервис каталога не отвечает
PAYMENT_SERVICE_UNAVAILABLE503Платежный шлюз не отвечает
WAREHOUSE_SERVICE_UNAVAILABLE503Сервис склада не отвечает

15. Интеграционные тесты

Источник: раздел 14 -- Интеграции (Context Mapping)

Для каждой интеграции -- 4 сценария:

  1. Нормальная работа -- корректный ответ в срок.
  2. Недоступность -- проверить fallback (кэш, retry, circuit breaker).
  3. Некорректный ответ -- ACL-адаптер должен обработать невалидные данные.
  4. Таймаут -- ответ позже SLA (300ms для Каталога, 5 сек для Доставки).

Дополнительно: контракт-тесты (Pact / Spring Cloud Contract) и SLA-тесты.


16. Приемочные тесты

Источник: раздел 15 -- Критерии приемки (Acceptance Criteria)

AC -- минимальный набор тестов. Given-When-Then формат напрямую транслируется в автотесты:

ACGivenWhenThen
AC-1Покупатель авторизован, 3 товара в корзинеОформляет заказСтатус CREATED, виден в SearchOrders, событие OrderCreated
AC-2Покупатель авторизован, корзина пустаОформляет заказОшибка ORDER_EMPTY
AC-3Заказ в CREATEDОтменяет заказСтатус CANCELLED, событие OrderCancelled, резерв снят
AC-4Заказ в PAIDПытается отменитьОшибка ORDER_CANCEL_FORBIDDEN, статус не изменился
AC-5Заказ в CONFIRMEDПытается добавить товарОшибка ORDER_MODIFICATION_FORBIDDEN
AC-6Менеджер, заказ в PAIDОтправляет заказСтатус SHIPPED, событие OrderShipped
AC-7Администратор, заказ в PAIDИнициирует возвратСобытие RefundInitiated, запуск Saga возврата
AC-8Покупатель A, существуют заказы Покупателя БSearchOrders / GetOrder чужогоЧужие заказы не видны, ORDER_NOT_FOUND (404)

Тестировщик дополняет AC на основе: матрицы переходов (раздел 4), бизнес-правил (раздел 6), каталога ошибок (раздел 13), матрицы доступа (раздел 5), Saga (раздел 12).


17. Нагрузочные и security тесты

Источник: раздел 16 -- Нефункциональные требования

НФТ определяют нагрузочные, стресс- и security-тесты:

  • Производительность: Gatling/JMeter -- API <= 200ms при p95, 50 rps на оформление заказа, 500 rps на просмотр каталога.
  • Масштабируемость: стресс-тест x5 нагрузки (имитация распродаж).
  • Доступность: при падении одного инстанса система продолжает работать (kill pod, проверить recovery).
  • Безопасность: тесты аутентификации/авторизации, проверка JWT, CORS, PCI DSS compliance.

Каждая цифра из НФТ -- порог для автоматического теста. Если p95 > 200ms -- тест красный.