Работали ли вы с тестированием PATCH-запросов в API?

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

Ответ

Да, тестирование PATCH-эндпоинтов — стандартная задача при проверке REST API. PATCH используется для частичного обновления ресурса, что требует особого внимания к валидации.

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

  • Частичное обновление: Убедиться, что обновляются только переданные поля, а остальные остаются неизменными.
  • Валидация входных данных: Корректная обработка невалидных типов данных, пустых значений или полей, не предназначенных для обновления.
  • Идемпотентность: В идеале, несколько одинаковых PATCH-запросов должны давать тот же результат, что и один (хотя это не всегда гарантировано спецификацией).
  • Ответ сервера: Проверка HTTP-статуса (обычно 200 OK или 204 No Content), а также того, что в ответе возвращается обновлённое представление ресурса.

Пример теста на Java (RestAssured):

@Test
public void testPartialUserUpdate() {
    int userId = 42;
    String originalName = "Old Name";
    String originalEmail = "old@mail.com";

    // 1. Подготовка: создаём пользователя (POST)
    // ...

    // 2. Действие: отправляем PATCH-запрос для обновления только email
    String patchEndpoint = "/api/users/" + userId;
    String newEmail = "new.qa@mail.com";

    Map<String, Object> patchData = new HashMap<>();
    patchData.put("email", newEmail);

    Response response = given()
                            .contentType(ContentType.JSON)
                            .body(patchData)
                        .when()
                            .patch(patchEndpoint);

    // 3. Проверки ответа
    response.then().statusCode(200);

    // 4. Проверка, что обновилось только email, а имя осталось прежним
    given()
        .when()
            .get("/api/users/" + userId)
        .then()
            .statusCode(200)
            .body("id", equalTo(userId))
            .body("email", equalTo(newEmail)) // Новый email
            .body("name", equalTo(originalName)); // Имя не изменилось
}

Также важно тестировать сценарии с JSON Patch (формат application/json-patch+json), где передаётся массив операций (add, replace, remove), если API это поддерживает.