Опиши сложный тестовый сценарий для распределенной системы (микросервисов).

«Опиши сложный тестовый сценарий для распределенной системы (микросервисов).» — вопрос из категории Практические задания, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сложный сценарий — тестирование асинхронного потока оформления заказа в системе, построенной на микросервисах и брокере сообщений (Kafka).

Контекст:

  1. Сервис заказов (Order Service): Создает заказ и публикует событие OrderCreated.
  2. Сервис платежей (Payment Service): Подписан на OrderCreated, обрабатывает платеж, публикует PaymentProcessed.
  3. Сервис доставки (Delivery Service): Подписан на PaymentProcessed, создает задание на доставку.
  4. Брокер сообщений (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"

Сложность заключается в необходимости:

  1. Эмулировать сетевые задержки и сбои отдельных сервисов.
  2. Проверять состояние системы в разных сервисах после асинхронных событий.
  3. Анализировать логи и метрики (например, в Grafana) для подтверждения корректности потока.