Ответ
Сложный сценарий — тестирование асинхронного потока оформления заказа в системе, построенной на микросервисах и брокере сообщений (Kafka).
Контекст:
- Сервис заказов (Order Service): Создает заказ и публикует событие
OrderCreated. - Сервис платежей (Payment Service): Подписан на
OrderCreated, обрабатывает платеж, публикуетPaymentProcessed. - Сервис доставки (Delivery Service): Подписан на
PaymentProcessed, создает задание на доставку. - Брокер сообщений (Kafka): Обеспечивает асинхронную коммуникацию.
Основные проблемы для тестирования:
- Согласованность данных (Data Consistency): Гарантирует ли система, что доставка не начнется для неоплаченного заказа?
- Идемпотентность: Обработка дублирующихся событий (например,
OrderCreatedпришел дважды) не должна создавать два одинаковых заказа. - Устойчивость к сбоям (Resilience): Что происходит, если Сервис платежей временно недоступен?
- Порядок сообщений: Важен ли порядок событий? (Например,
PaymentFailedдолжен обрабатываться послеOrderCreated).
Пример интеграционного теста (Python-подобный псевдокод):
def test_async_order_fulfillment_happy_path():
"""Позитивный сценарий: заказ создан, оплачен, доставка назначена."""
# 1. Клиент создает заказ
order_id = order_service.create_order(customer_id=123, items=[...])
# 2. Имитируем публикацию и потребление события OrderCreated
order_event = kafka_consumer.await_event("OrderCreated", order_id, timeout=5)
assert order_event["status"] == "pending"
# 3. Имитируем обработку платежа платежным сервисом
payment_service.process_payment(order_id)
payment_event = kafka_consumer.await_event("PaymentProcessed", order_id, timeout=5)
assert payment_event["status"] == "completed"
# 4. Проверяем, что сервис доставки отреагировал
delivery_task = delivery_service.get_task_by_order(order_id)
assert delivery_task is not None
assert delivery_task["status"] == "scheduled"
# 5. Финальная проверка статуса заказа
final_order = order_service.get_order(order_id)
assert final_order["status"] == "completed"
def test_async_order_payment_service_down():
"""Сценарий сбоя: Сервис платежей недоступен при создании заказа."""
# 1. «Ломаем» сервис платежей
payment_service.stop()
# 2. Создаем заказ
order_id = order_service.create_order(...)
# 3. Событие OrderCreated опубликовано, но не обработано
order_event = kafka_consumer.await_event("OrderCreated", order_id, timeout=2)
# 4. Восстанавливаем сервис платежей
payment_service.start()
# 5. Проверяем механизм повторных попыток (Retry):
# Сервис платежей должен получить событие из Kafka и обработать его
payment_event = kafka_consumer.await_event("PaymentProcessed", order_id, timeout=30)
assert payment_event["status"] == "completed"
Сложность заключается в необходимости:
- Эмулировать сетевые задержки и сбои отдельных сервисов.
- Проверять состояние системы в разных сервисах после асинхронных событий.
- Анализировать логи и метрики (например, в Grafana) для подтверждения корректности потока.