Занимался ли асинхронным тестированием?

«Занимался ли асинхронным тестированием?» — вопрос из категории API тестирование, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, сталкивался с асинхронным тестированием в нескольких контекстах:

  1. Тестирование API с длительными операциями (polling, webhooks). Часто API не возвращает результат синхронно, а предоставляет ID задачи или endpoint для отслеживания статуса.

    • Подход: Написание теста, который сначала инициирует операцию (например, POST /api/v1/report/generate), затем в цикле опрашивает статус (GET /api/v1/tasks/{taskId}) до получения успешного результата или таймаута.
    • Пример на Python с requests и time:
      
      import requests
      import time

    def test_async_report_generation():

    1. Запускаем генерацию отчёта

    start_resp = requests.post("https://api.example.com/reports", json={"type": "annual"})
    task_id = start_resp.json()["taskId"]
    assert start_resp.status_code == 202  # Accepted
    
    # 2. Ожидаем завершения (Polling)
    status_url = f"https://api.example.com/tasks/{task_id}"
    for _ in range(10):  # 10 попыток
        status_resp = requests.get(status_url)
        status = status_resp.json()["status"]
    
        if status == "SUCCESS":
            report_url = status_resp.json()["reportUrl"]
            # 3. Проверяем результат
            report_resp = requests.get(report_url)
            assert report_resp.status_code == 200
            assert "Annual Sales" in report_resp.text
            return
        elif status == "FAILED":
            pytest.fail("Report generation failed")
    
        time.sleep(2)  # Ждём 2 секунды перед следующей проверкой
    pytest.fail("Task did not complete in time")
  2. Параллельное выполнение API-запросов для нагрузочного или интеграционного тестирования с использованием asyncio и aiohttp в Python или аналогичных инструментов.

  3. Ожидание элементов в UI-автоматизации (например, в Selenium WebDriver или Playwright), где элементы могут появляться динамически. Там используются неявные (Implicit Waits) или явные (Explicit Waits) ожидания, которые по сути являются асинхронными операциями.