Как устроен типичный тест для API endpoint?

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

Ответ

Типичный тест API endpoint — это интеграционный или функциональный тест, который проверяет, что эндпоинт корректно обрабатывает HTTP-запрос и возвращает ожидаемый ответ. В экосистеме PHP для этого часто используется PHPUnit в связке с фреймворком для HTTP-клиента.

Пример теста для GET-эндпоинта /api/users/{id} с использованием Symfony и PHPUnit:

// tests/Controller/UserApiControllerTest.php
namespace AppTestsController;

use SymfonyBundleFrameworkBundleTestWebTestCase;

class UserApiControllerTest extends WebTestCase
{
    public function testGetUserReturnsValidResponse(): void
    {
        // 1. Создаем клиент и выполняем запрос
        $client = static::createClient();
        $client->request('GET', '/api/users/1');

        // 2. Проверяем HTTP-статус код (первичная проверка успеха)
        $this->assertResponseIsSuccessful(); // Проверяет, что статус код 2xx
        // Или более конкретно:
        // $this->assertResponseStatusCodeSame(200);

        // 3. Проверяем, что ответ в формате JSON
        $this->assertResponseHeaderSame('Content-Type', 'application/json');

        // 4. Декодируем и проверяем структуру и данные ответа
        $responseData = json_decode($client->getResponse()->getContent(), true, 512, JSON_THROW_ON_ERROR);

        $this->assertIsArray($responseData);
        $this->assertArrayHasKey('id', $responseData);
        $this->assertArrayHasKey('email', $responseData);
        $this->assertArrayHasKey('name', $responseData);
        $this->assertEquals(1, $responseData['id']);
        $this->assertMatchesRegularExpression('/^[^@s]+@[^@s]+.[^@s]+$/', $responseData['email']);
    }

    public function testGetUserReturns404ForNonExistentId(): void
    {
        $client = static::createClient();
        $client->request('GET', '/api/users/99999');

        // Проверяем корректную обработку ошибки
        $this->assertResponseStatusCodeSame(404);
    }
}

Ключевые аспекты, которые проверяются в API-тестах:

  • Корректность HTTP-статуса (200, 201, 400, 401, 404, 422, 500).
  • Структура ответа (формат JSON/XML, наличие обязательных полей).
  • Корректность данных (соответствие ожидаемым значениям, форматам дат, email и т.д.).
  • Заголовки ответа (Content-Type, Cache-Control, кастомные заголовки).
  • Обработка ошибок и валидации (возврат 422 с деталями ошибок при невалидном входе).
  • Авторизация и аутентификация (проверка доступа для авторизованных/неавторизованных пользователей, разных ролей).
  • Побочные эффекты (например, что POST-запрос действительно создал запись в БД).

Для комплексного тестирования также используются:

  • DataFixtures для предзагрузки тестовых данных в БД.
  • Mock-объекты для изоляции теста от внешних сервисов (например, платежных шлюзов).
  • Тестирование пагинации, фильтрации и сортировки для списковых эндпоинтов.

Такой подход обеспечивает надежную проверку контрактов API и предотвращает регрессии.