Научитесь выполнять автоматизированное тестирование 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()
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.