Какие принципы REST API ты знаешь и как проверяешь их соблюдение при тестировании?

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

Ответ

При тестировании REST API я проверяю соблюдение следующих ключевых принципов:

1. Единообразие интерфейса

  • Ресурсы через URI: Проверяю, что эндпоинты используют существительные, а не глаголы
    Правильно: GET /api/users
    Неправильно: GET /api/getUsers
  • HTTP-методы по назначению:
    • GET — получение данных (идемпотентный)
    • POST — создание ресурса
    • PUT — полное обновление (идемпотентный)
    • PATCH — частичное обновление
    • DELETE — удаление (идемпотентный)

2. Stateless (Без состояния)

  • Каждый запрос содержит всю необходимую информацию (обычно в headers)
  • Проверяю, что аутентификация через токены, а не сессии

3. Кэширование

  • Проверяю наличие соответствующих headers:
    Cache-Control: max-age=3600
    ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

4. Клиент-серверная архитектура

  • Разделение ответственности: клиент — UI, сервер — логика и данные

5. Слоистая система

  • Проверяю, что можно добавить прокси/балансировщик без изменения клиента

6. Код по требованию (опционально)

  • Возможность передачи исполняемого кода (например, JavaScript)

Пример тест-кейсов для проверки REST принципов:

// Проверка корректного использования HTTP-методов
@Test
public void testPutMethodIdempotency() {
    // Первый запрос
    Response response1 = given()
        .body(updatedUserData)
        .put("/api/users/123");

    // Второй идентичный запрос
    Response response2 = given()
        .body(updatedUserData)
        .put("/api/users/123");

    // Результаты должны быть одинаковыми
    assertEquals(response1.getStatusCode(), response2.getStatusCode());
    assertEquals(response1.getBody().asString(), response2.getBody().asString());
}

// Проверка stateless
@Test
public void testStatelessAuthentication() {
    // Запрос без токена должен вернуть 401
    given()
        .get("/api/protected-data")
        .then()
        .statusCode(401);

    // Запрос с токеном — 200
    given()
        .header("Authorization", "Bearer " + authToken)
        .get("/api/protected-data")
        .then()
        .statusCode(200);
}

При тестировании также проверяю:

  • Форматы данных (JSON/XML)
  • Коды состояния HTTP
  • HATEOAS (гипермедиа) если реализовано