Тестирование REST API с REST-assured

Научитесь выполнять автоматизированное тестирование API с REST-assured. Мы рассмотрим все важные концепции с простыми для понимания примерами и фрагментами кода.

1. Введение

REST-assured — отличный инструмент для написания автоматизированных тестов в стиле разработки BDD, хотя его можно использовать и с другими стилями. Он помогает в тестировании реального или фиктивного REST API декларативным способом, вдохновленным другими динамическими языками, такими как Ruby и Groovy.

REST-assured отлично поддерживает тестирование методов HTTP и использует методы с именами глаголов HTTP, например get() и post() и т. д. Общий синтаксис для написания теста следующий:

given().......when().......then()......;

В качестве лучшей практики всегда добавляйте следующие статические операторы импорта в тестовый класс, чтобы мы могли использовать все методы напрямую. Они будут включать почти все необходимые методы для отправки запросов и проверки ответа с помощью Hamcrest matchers.

 импорт статического io.restassured.RestAssured.*;импорт статического io.restassured.matcher.RestAssuredMatchers.*;импорт статического org.hamcrest.Matchers.*;

2. Настройка с помощью Maven

Для работы REST-assured необходимы следующие модули:

  • rest-assured и rest-assured-common : состоят из основных классов и интерфейсов.
  • json-path : упрощает парсинг документов JSON. Использует синтаксис Groovy GPath.
  • json-schema-validator : помогает при необходимости проверить структуру ответа JSON.
  • xml-path : упрощает анализ XML-документов.
  • groovy : если groovy отсутствует в classpath, то уже .
 <зависимость><groupId>io.rest-assured</groupId><artifactId>остайтесь-уверенными-общими</artifactId><версия>5.1.1</версия><область>тест</область></зависимость><зависимость><groupId>io.rest-assured</groupId><artifactId>будьте уверены</artifactId><версия>5.1.1</версия><область>тест</область></зависимость><зависимость><groupId>io.rest-assured</groupId><artifactId>json-path</artifactId><версия>5.1.1</версия><область>тест</область></зависимость><зависимость><groupId>io.rest-assured</groupId><artifactId>xml-path</artifactId><версия>5.1.1</версия><область>тест</область></зависимость><зависимость><groupId>org.codehaus.groovy</groupId><artifactId>круто</artifactId><версия>3.0.12</версия></зависимость>

Если мы используем Java 9+, то мы можем включить все необходимые зависимости одним включением, используя rest-assured-all.

 <зависимость><groupId>io.rest-assured</groupId><artifactId>будьте-уверены-во-всех</artifactId><версия>5.1.1</версия><область>тест</область></зависимость>

3. Тестирование с REST-гарантией

Давайте изучим основы тестирования API на примерах.

3.1. Настройка хоста, порта и корня API по умолчанию

Хотя мы можем указать полный URL API, включая имя хоста и порт, в каждом методе теста, но это может не подойти для чистого кода. REST-assured поддерживает статические переменные baseURI, port и basePath из класса RestAssured для настройки общих частей URI в одном месте.

Например, мы строим наши примеры, используя общедоступные API, доступные в reqres. Все API начинаются с URL https://reqres.in/api/, поэтому мы можем определить базовый URI и путь API следующим образом:

@BeforeAllpublic static void setup() {baseURI = "https://reqres.in/";basePath = "/api";}

3.2. API GET

Подробности API GET следующие:

HTTP GET /users/2{"data": {"id": 2,"email": "janet.weaver@reqres.in","first_name": "Janet","last_name": "Weaver"......}}

Используйте метод get() для вызова API с параметрами пути. Для проверки данных ответа мы можем использовать встроенные методы, такие как equalsTo(), hasItems(), is() и т. д.

given().pathParam("id", 2).when().get("/users/{id}").then().statusCode(equalTo(200)).body("data.id", equalTo(2)).body("data.email", equalTo("janet.weaver@reqres.in"));

3.3. API POST

В демонстрационном POST API мы используем следующий запрос.

HTTP POST /users{"name": "lokesh","email": "admin@howtodoinjava.com"}

Чтобы отправить запрос POST с телом, мы можем использовать метод body(). Чтобы проверить ответ, мы можем использовать методы, описанные в предыдущем разделе.

@Testpublic void createUserWithCustomObject_thenSuccess() throws JSONException {given().body(new User("lokesh", "admin@howtodoinjava.com")).header(new Header("x-custom-header", "value")).contentType("application/json").when().post("/users").then().statusCode(201).body("id", notNullValue()).body("name", equalTo("lokesh")).body("email", equalTo("admin@howtodoinjava.com"));}

3.4. API PUT

Для демо-API PUT мы используем следующий запрос. Мы обновляем адрес электронной почты сотрудника, чей идентификатор равен 2.

HTTP PUT /users/2{"name": "lokesh","email": "admin@howtodoinjava.com"}

Отправка запроса PUT аналогична запросу POST.

@Testpublic void updateUser_thenSuccess() {given().body(new User("john", "john@howtodoinjava.com")).contentType("application/json").when().put("/users/2").then().statusCode(200).body("name", equalTo("john")).body("email", equalTo("john@howtodoinjava.com"));}

3.5. API DELETE

API DELETE прост и не возвращает никакого ответа. Он возвращает код ответа 204, когда сущность удалена.

HTTP DELETE /users/2

Используйте метод delete() для отправки HTTP-запросов DELETE.

@Testpublic void deleteUser_thenSuccess() {when().delete("/users/2").then().statusCode(204).body(isEmptyOrNullString());}

4. Создание заголовков и тела запроса

4.1 Заголовки запроса

Для отправки заголовков запроса используйте метод RequestSpecification.header().

given()....header(new Header("x-custom-header", "value")).contentType("application/json")...

4.2. Текст запроса

Для отправки запросов с телом запроса у нас есть два варианта:

  • Либо, используя JSONObject для создания пользовательской полезной нагрузки JSON. Внутри себя REST-assured использует JSON.simple для разбора объекта в полезную нагрузку JSON.
JSONObject requestParams = new JSONObject();requestParams.put("name", "lokesh");requestParams.put("email", "admin@howtodoinjava.com");given().body(requestParams.toString())....when()
  • Или с помощью пользовательского объекта, который создает требуемую полезную нагрузку JSON.
given().body(new User("lokesh", "admin@howtodoinjava.com"))....when()

Отправка XML-запроса с REST-гарантией

5. Проверка статуса и текста ответа

Используйте любой из сопоставителей Hamcrest для сопоставления частей ответа, включая код статуса ответа, заголовки ответа или тело ответа.

given()....when()....then().statusCode(201).header("x-response-header", equalTo("value")).body("id", notNullValue()).body("name", equalTo("lokesh")).body("email", equalTo("admin@howtodoinjava.com"))

6. Извлечение данных ответа

Предположим, мы хотим повторно использовать данные из ответа API. Мы можем извлечь их с помощью метода extract().

String id = given().body(requestParams.toString()).contentType("application/json").when().post("/users").then().statusCode(equalTo(201)).extract().body().path("id");

7. Регистрация данных ответа

Используйте ValidatableResponseLogSpec, возвращаемый методом body(), для ведения журнала с помощью метода Hamcrest log().

given()....when()....then()....log().body();

8. Измерение времени отклика и тестирование тайм-аутов

Используя метод time(), мы можем измерить время ответа API для проверки производительности SLA. Он возвращает время в миллисекундах. Чтобы получить время в определенной единице времени, передайте TimeUnit как аргумент метода.

long timeInMs = get("...").time();long timeInSeconds = get("...").timeIn(TimeUnit.SECONDS);

Мы можем использовать метод time() с совпадениями hamcrest для проверки тайм-аутов.

when().get("...").then().time(lessThan(1000L), TimeUnit.SECONDS);

В качестве лучшей практики мы должны тестировать тайм-ауты, когда JVM разогревается. Измерение тайм-аутов в одном тесте может не дать правильного результата, поскольку он будет включать множество других инициализаций на уровне JVM.

9. Заключение

В этом уроке мы научились использовать REST-assured для написания автоматизированных тестов для реального тестирования API. Это отличное решение для разработки BDD, где мы можем начать писать макеты API и тесты для него, а затем написать фактические реализации API.

Исходный код на Github

Прокрутить вверх