Что такое библиотека Rest Assured?

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

Ответ

Rest Assured — это доминирующая Java-библиотека с открытым исходным кодом, специально разработанная для удобного тестирования RESTful API. Она предоставляет DSL (Domain-Specific Language), который позволяет описывать HTTP-запросы и проверки ответов на почти естественном языке, что делает тесты чрезвычайно читаемыми и лёгкими в написании.

Ключевые возможности для тестировщика:

  • Простой синтаксис: Цепочка методов given() (предусловия), when() (действие), then() (проверки).
  • Поддержка всех HTTP-методов: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS.
  • Мощные валидации: Проверка статус-кода, заголовков, тела ответа (JSON, XML) с использованием библиотек типа Hamcrest или JsonPath.
  • Встроенная поддержка аутентификации: Basic Auth, OAuth 1/2, формы.
  • Лёгкая интеграция: Работает с любым тестовым фреймворком (JUnit 4/5, TestNG) и системой сборки (Maven, Gradle).

Пример комплексного теста API с Rest Assured:

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;

public class UserApiTest {

    @BeforeAll
    static void setup() {
        RestAssured.baseURI = "https://api.example.com";
        RestAssured.authentication = basic("username", "password"); // Предусловие для всех тестов
    }

    @Test
    void testGetUserById() {
        given()
                .pathParam("userId", 42) // Параметр пути
                .log().all() // Логируем весь запрос (для отладки)
        .when()
                .get("/users/{userId}") // Выполняем GET-запрос
        .then()
                .log().body() // Логируем тело ответа
                .statusCode(200) // Проверяем статус
                .contentType(ContentType.JSON) // Проверяем тип контента
                .body("id", equalTo(42), // Проверяем поле в JSON-ответе
                     "name", not(emptyString()),
                     "address.city", equalTo("Moscow")); // Используем JsonPath
    }

    @Test
    void testCreateNewUser() {
        String userJson = """
                {
                    "name": "John Doe",
                    "email": "john.doe@test.com"
                }
                """;

        given()
                .contentType(ContentType.JSON) // Устанавливаем заголовок Content-Type
                .body(userJson) // Передаём тело запроса
        .when()
                .post("/users")
        .then()
                .statusCode(201) // Проверяем, что ресурс создан
                .header("Location", containsString("/users/")) // Проверяем заголовок Location
                .body("id", greaterThan(0)); // Проверяем, что ID присвоен
    }

    @Test
    void testUserNotFound() {
        when()
                .get("/users/99999")
        .then()
                .statusCode(404) // Ожидаем 404 Not Found
                .body("message", equalTo("User not found"));
    }
}

Почему Rest Assured популярен среди QA-автоматизаторов: Он абстрагирует низкоуровневые детали HTTP-клиента (в отличие от OkHttp), позволяя сосредоточиться на бизнес-логике теста и делая код поддержки тестов гораздо проще.