Как протестировать API-запросы, выполняемые сервис-клиентом?

«Как протестировать API-запросы, выполняемые сервис-клиентом?» — вопрос из категории Тестирование, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я тестирую API-клиенты, комбинируя изолированные юнит-тесты с моками и интеграционные тесты с реальным или заглушенным сервером.

1. Юнит-тестирование с моками (PHPUnit): Заменить реальный HTTP-клиент на mock-объект, чтобы проверить логику формирования запроса и обработки ответа.

// Пример с Guzzle и PHPUnit
$mockHandler = new MockHandler([
    new Response(200, ['Content-Type' => 'application/json'], '{"id": 123}'),
    new Response(404) // Тестирование обработки ошибок
]);
$handlerStack = HandlerStack::create($mockHandler);
$testClient = new Client(['handler' => $handlerStack]);

// Внедряем тестовый клиент в сервис
$apiService = new ApiService($testClient);
$result = $apiService->fetchUser(123);
$this->assertEquals(123, $result['id']);

2. Интеграционное тестирование с реальным тестовым API: Запускаю контейнер с тестовой версией API (например, используя Docker Compose) или использую сторонние сервисы-заглушки (WireMock, Mockoon).

3. Запись и воспроизведение трафика (PHP-VCR): Полезно для тестов, которые должны работать с реальными ответами API, но без сетевых запросов.

VCR::turnOn();
VCR::insertCassette('test_api.yml');
// Первый запуск — запись запроса/ответа на диск
// Последующие запуски — чтение с диска
$response = $client->get('https://api.example.com/data');
VCR::turnOff();

Ключевые проверки в моих тестах:

  • Корректность HTTP-метода, URL, заголовков и тела запроса.
  • Обработка успешных ответов (парсинг JSON/XML).
  • Обработка ошибок (4xx, 5xx, таймауты).
  • Поведение при сетевых сбоях.