Когда выбирать REST Assured
Подходит
- Команда пишет автотесты на Java и использует JUnit 5 или TestNG.
- Нужны читаемые проверки JSON без ручного разбора ответа.
- Нужно переиспользовать общие заголовки, авторизацию и базовый URL через спецификации.
- API-тесты должны идти в CI вместе с остальными Java-тестами и Allure-отчётом.
Не подходит
- Команда пишет на Python или TypeScript — используйте requests/HTTPX или Supertest.
- Нужно быстро исследовать API руками — удобнее Postman или Hoppscotch.
- Нужен нагрузочный тест — для этого k6, Gatling или JMeter.
Установка
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>5.5.0</version>
<scope>test</scope>
</dependency>Примеры тестов
GET-запрос с проверкой ответа
1import static io.restassured.RestAssured.given;
2import static org.hamcrest.Matchers.*;
3
4import org.junit.jupiter.api.Test;
5
6class UsersApiTest {
7
8 @Test
9 void getUser_returnsProfile() {
10 given()
11 .baseUri("https://reqres.in/api")
12 .when()
13 .get("/users/2")
14 .then()
15 .statusCode(200)
16 .body("data.id", equalTo(2))
17 .body("data.email", containsString("@"));
18 }
19}Проверки в body() читают значения по пути JsonPath, Hamcrest-матчеры дают понятные сообщения об ошибках.
POST с телом и десериализацией в объект
1import static io.restassured.RestAssured.given;
2import static org.junit.jupiter.api.Assertions.assertEquals;
3
4import io.restassured.http.ContentType;
5import java.util.Map;
6import org.junit.jupiter.api.Test;
7
8class CreateUserTest {
9
10 record CreatedUser(String name, String job, String id) {}
11
12 @Test
13 void createUser_returnsId() {
14 CreatedUser user = given()
15 .baseUri("https://reqres.in/api")
16 .contentType(ContentType.JSON)
17 .body(Map.of("name", "Anna", "job", "QA"))
18 .when()
19 .post("/users")
20 .then()
21 .statusCode(201)
22 .extract().as(CreatedUser.class);
23
24 assertEquals("Anna", user.name());
25 }
26}extract().as() превращает ответ в объект, и дальше проверки идут обычными assert без JsonPath-строк.
Общая спецификация запросов
1import io.restassured.builder.RequestSpecBuilder;
2import io.restassured.http.ContentType;
3import io.restassured.specification.RequestSpecification;
4
5public final class ApiSpecs {
6
7 public static RequestSpecification base() {
8 return new RequestSpecBuilder()
9 .setBaseUri("https://reqres.in/api")
10 .setContentType(ContentType.JSON)
11 .addHeader("x-api-key", System.getenv("API_KEY"))
12 .build();
13 }
14}
15
16// в тесте: given().spec(ApiSpecs.base()).when().get("/users/2")...Спецификация убирает копипасту базового URL, заголовков и авторизации из каждого теста.
Типичные ошибки
- Токены и URL прямо в тестах
- Выносите базовый URL и секреты в переменные окружения и RequestSpecification, иначе тесты нельзя запустить на другом стенде.
- Проверка только статус-кода
- Статус 200 не гарантирует правильное тело. Проверяйте ключевые поля и схему ответа (json-schema-validator).
- Зависимость тестов друг от друга
- Тест, который использует id из предыдущего, ломается при выборочном запуске. Создавайте данные внутри теста или в @BeforeEach.
- Нет логирования при падении
- Добавьте .log().ifValidationFails() — запрос и ответ выведутся только для упавших тестов, лог не засоряется.
Вопросы на собеседовании по REST Assured
- Что означают given, when и then в REST Assured?
- Как проверить структуру JSON-ответа с помощью схемы?
- Чем RequestSpecification отличается от ResponseSpecification?
- Как передать авторизацию Bearer и не дублировать её в каждом тесте?
Отработать ответы можно на мок-собеседовании.
Частые вопросы
REST Assured или Postman — что выбрать?
Это разные задачи. Postman удобен для ручного исследования API и быстрых проверок. REST Assured нужен, когда API-тесты должны жить в коде рядом с остальными автотестами, проходить review и запускаться в CI.
Работает ли REST Assured с Kotlin или Groovy?
Да. Есть отдельные модули kotlin-extensions и groovy-support, но в большинстве проектов библиотеку используют именно из Java.
Как проверять JSON-схему ответа?
Подключите модуль json-schema-validator и вызовите .body(matchesJsonSchemaInClasspath("user-schema.json")). Так вы отловите изменение структуры, а не только отдельных полей.
Можно ли использовать REST Assured для нагрузочного тестирования?
Нет, он не рассчитан на нагрузку: нет управления пользователями и метрик. Для нагрузки берите k6, Gatling или JMeter.