Ответ
REST Assured использует предметно-ориентированный язык (DSL), построенный на цепочках методов. Основные ключевые слова/методы:
1. Настройка запроса (Given):
given()— отправная точка для спецификации запроса..header(String name, String value)/.headers(Map headers)— установка HTTP-заголовков..param(String key, String value)/.params(Map params)— добавление query-параметров..body(Object body)— установка тела запроса (объект автоматически сериализуется в JSON/XML)..contentType(ContentType type)— указание типа контента (например,ContentType.JSON)..auth()— настройка аутентификации (basic, oauth, etc.).
2. Выполнение запроса (When):
.when()— разделитель между спецификацией и действием..get(String url),.post(String url),.put(String url),.delete(String url)— отправка HTTP-запроса указанного метода.
3. Верификация ответа (Then):
.then()— начало спецификации для проверок ответа..statusCode(int expectedCode)— проверка HTTP-статуса..body(String jsonPath, Matcher matcher)— мощная проверка тела ответа с помощью JsonPath или XmlPath и Hamcrest-матчеров (например,equalTo(),hasItems())..header(String name, Matcher matcher)— проверка значения заголовка..time(Matcher<Long> matcher)— проверка времени ответа.
4. Извлечение данных (Extract):
.extract()— позволяет извлечь данные из ответа для использования в последующих запросах..path("json.path.here")— извлечение значения по JsonPath..response()— получение всего объектаResponse.
Полный пример теста:
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
public class UserApiTest {
@Test
public void testCreateAndGetUser() {
// 1. Given: Настраиваем запрос
int userId = given()
.header("Content-Type", "application/json")
.body("{"name": "Alice", "job": "Engineer"}")
// 2. When: Выполняем действие
.when()
.post("/api/users")
// 3. Then: Проверяем ответ
.then()
.statusCode(201)
.body("name", equalTo("Alice"))
// 4. Extract: Извлекаем ID нового пользователя
.extract()
.path("id");
// Используем извлеченный ID для нового запроса
when()
.get("/api/users/" + userId)
.then()
.statusCode(200)
.body("job", equalTo("Engineer"));
}
} Ответ 18+ 🔞
А, REST Assured, ёпта! Ну это ж просто песня, а не библиотека для тестирования API. Сидишь такой, как царь, и пишешь тесты, которые читаются, как будто ты инструкцию для домочадцев составляешь. Слушай, разберём, как эта штука работает, без всякой зауми.
Вот смотри, вся её мощь строится на цепочках методов, это как лего, только для запросов. Есть три основных кита, на которых всё держится: Given, When, Then. Прямо как в сказке, блядь.
1. Given — «Допустим, что...» или «Раз уж так вышло...» Тут ты настраиваешь всё, что нужно перед тем, как ткнуть палкой в сервер.
given()— это точка отсчёта, с неё всё начинается. Ты как будто говоришь: «Так, народ, начинаем спектакль»..header(...)— надеваешь на запрос шапку. «Слушай, сервер, я тебе JSON несу, вот тебе заголовочек»..param(...)— это когда ты в URL эти вопросики и амперсанды суёшь.?name=Vasya&job=loser..body(...)— а это самое вкусное. Суёшь туда объект Java, а библиотека сама, как хитрая жопа, превращает его в JSON или XML. Магия, блядь!.contentType(...)— кричишь серверу прямо в ухо: «Чувак, я тебе JSON посылаю, не тупи!»..auth()— если доступ только для своих, тут логины-пароли или токены подсовываешь.
2. When — «И вот когда...» Момент истины, пиздец. Разделитель между подготовкой и самим действием.
.when()— просто слово-разделитель. Чисто для красоты и читаемости..get(...),.post(...)— а вот это уже сам выстрел. Ты говоришь метод (GET, POST, PUT, DELETE) и URL. Всё, запрос полетел. Сервер, держись!
3. Then — «Тогда я ожидаю, что...» А вот тут начинается цирк с проверками. Сервер ответил, а ты ему: «А ну-ка, рот открой, покажи, что там у тебя».
.then()— начинаем вершить суд..statusCode(200)— первое и главное: «Ты мне статус 200 вернул, а? Не 500? Молодец»..body("user.name", equalTo("Vasya"))— а это овердохуище по мощности. С помощью JsonPath ты лезешь прямо в тело ответа, как хирург, и проверяешь, что там лежит.equalTo,hasItems— это матчеры из Hamcrest, они как умные друзья, которые говорят «да, совпадает» или «нет, хуйня какая-то»..header("Content-Type", containsString("json"))— проверяешь, не обманул ли тебя сервер с типом контента..time(lessThan(2000L))— «И чтобы быстро, блядь! Дольше двух секунд не думал!».
4. Extract — «А теперь дай-ка я это себе заберу...» Бывает, нужно не только проверить, но и вытащить что-то из ответа для следующего запроса.
.extract()— говоришь: «Так, стоп. Проверки проверками, но я тут кое-что приметил»..path("id")— выковыриваешь из JSON, например, айдишник только что созданного пользователя. И потом используешь его, чтобы этого же пользователя получить или удалить.
Ну а теперь, чтобы не быть голословным, смотри, как это всё вместе выглядит в деле:
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
public class UserApiTest {
@Test
public void testCreateAndGetUser() {
// 1. Given: Распаковываем чемодан перед поездкой
int userId = given()
.header("Content-Type", "application/json")
.body("{"name": "Alice", "job": "Engineer"}") // Посылаем Алису инженером
// 2. When: Жмём на кнопку "Пуск"
.when()
.post("/api/users")
// 3. Then: Прищуриваемся и проверяем чек
.then()
.statusCode(201) // Должен сказать "Создано!"
.body("name", equalTo("Alice")) // И имя должно быть Алиса, а не Вася
// 4. Extract: Забираем сдачу — айдишник
.extract()
.path("id");
// А теперь, используя этот самый айди, идём и проверяем, что Алиса на месте
when()
.get("/api/users/" + userId)
.then()
.statusCode(200) // Всё ок
.body("job", equalTo("Engineer")); // И работа её действительно инженер, а не бариста
}
}
Вот и вся философия. Ничего сложного, просто пишешь, что хочешь сделать, и библиотека это делает. Красота, ёпта!