Научитесь делать запросы HTTP POST и PUT в автоматизированных тестах с REST-assured. Мы изучим различные способы настройки тела запроса, заголовков и аутентификации. Также мы научимся проверять ответы API.
1. Простой пример
Прежде чем углубляться, давайте начнем с простого примера HTTP POST, чтобы представить основные API, задействованные в тестах. Ниже приведен API POST и тело запроса.
HTTP POST /users{"name": "lokesh","email": "admin@howtodoinjava.com"}
Типичный вызов API с отправкой тела запроса, заголовков и проверкой данных ответа выглядит следующим образом:
@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"));}
2. Присоединение тела запроса POST
REST-assured поддерживает отправку тела запроса многими способами. Некоторые из наиболее используемых способов — это построение JSONObject, разбор пользовательского объекта или прямая отправка тела запроса из файла. Мы также можем имитировать отправку формы.
2.1 Использование JSONObject
JSONObject из библиотеки JSON-java, и REST-assured внутренне поддерживает его. JSON-java поддерживает парсинг документов JSON в объекты Java и генерацию новых документов JSON из классов Java. Он также может конвертировать между JSON и XML, заголовками HTTP, файлами cookie и CDL.
Для построения JSONObject мы используем его метод put(), аналогичный Map в Java, который принимает ключ и значение. Значение может быть любым примитивом, объектом, коллекцией или даже Maps. Передавая Map и коллекцию, мы можем построить любую вложенную структуру JSON.
JSONObject requestParams = new JSONObject();requestParams.put("name", "lokesh");requestParams.put("email", "admin@howtodoinjava.com");given().body(requestParams.toString()).contentType("application/json").when().post("/users").then().statusCode(equalTo(201));
2.2 Использование пользовательского объекта
Мы можем передать пользовательский POJO в метод body().
User user = new User("lokesh", "admin@howtodoinjava.com");given().body(user).contentType("application/json").when().post("/users").then().statusCode(equalTo(201));
Пользователь — это простой POJO без каких-либо аннотаций.
public class User {private String name;private String email;//Setters, getters and constructors}
Для настройки сериализации и десериализации REST-assured поддерживает объектные преобразователи из GSON, JAXB, Jackson, Faster Jackson и Eclipse Yasson(JSON-B). Например, мы можем использовать аннотации Gson в POJO, а затем построить GsonObjectMapperFactory с GsonBuilder следующим образом:
@BeforeAllpublic static void setup() {baseURI = "https://ROOT_URL/";RestAssured.config = RestAssuredConfig.config().objectMapperConfig(objectMapperConfig().gsonObjectMapperFactory(new GsonObjectMapperFactory() {@Overridepublic Gson create(Type type, String s) {return new GsonBuilder().setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();}}));}
2.3 Отправка файла или входного потока
body() принимает параметры типа java.io.File и InputStream. Мы можем передать документ JSON напрямую в запрос API. Это помогает избежать сложности парсинга правильного документа JSON из POJO. Иногда это предпочтительный способ среди тестировщиков, которые технически не очень эффективны.
{"имя": "локеш","электронная почта": "admin@howtodoinjava.com"}
given().body(new File("createUser.json")).contentType("application/json").when().post("/users").then().statusCode(equalTo(201));
3. Добавление заголовков запроса и параметров запроса
Используйте методы accept() и contentType() для передачи информации о типе носителя.
given().body(...).accept("application/json").contentType("application/json")...
Для отправки параметров запроса используйте метод queryParam().
given().body(...).queryParam("access-token", "abcd")...
4. Отправка аутентификации
Передача информации аутентификации зависит от схемы аутентификации, поддерживаемой API. REST-assured поддерживает почти все виды аутентификации OAuth, OAuth2, заголовки и даже отправку форм. Используйте oauth2() для передачи токена аутентификации OAuth2.
given().auth().preemptive().oauth2(accessToken)...
Для добавления аутентификации с использованием заголовков AuthFilter предпочтительнее обычных фильтров или прямых заголовков, поскольку AuthFilter удаляется при выполнении given().auth().none() для тестирования незащищенных API.
given().filter((requestSpec, responseSpec, ctx) -> {requestSpec.header("AUTH", "TOKEN");return ctx.next(requestSpec, responseSpec);}).when().post("/api").then().statusCode(200);
5. Проверка статуса и текста ответа
REST-assured использует функционально богатые Hamcrest-сопоставители для проверки данных ответа. Мы можем проверить все в ответе, включая коды состояния, заголовки, куки, тело и даже время ответа.
//Verify statuspost("/api").then().assertThat().statusCode(200).post("/api").then().assertThat().statusLine(containsString("OK")). ..//Verify headerspost("/api").then().assertThat().header("headerName", "headerValue"). ..post("/api").then().assertThat().headers("headerName1", containsString("value")). .//Verify bodygiven().body(requestParams.toString())....when().post("/users").then()....body("id", notNullValue()).body("name", equalTo("lokesh")).body("gender", equalTo("male")).body("status", equalTo("active")).body("email", equalTo("admin@howtodoinjava.com"))...;//Verify response timepost("/api").then().time(lessThan(2000L));post("/api").then().time(lessThan(2L), TimeUnit.SECONDS);
6. Регистрация и извлечение данных ответов
Логирование помогает в выводе полезной информации о запросах и ответах, чтобы мы могли отладить тест, если он ведет себя не так, как ожидалось. Rest-assured поддерживает методы all(), params(), body(), headers(), cookies(), method() и path() для логирования определенной информации, если это необходимо.
- Используйте given().log() для создания RequestLoggingFilter, используемого для регистрации данных запроса.
- Используйте then().log() для регистрации данных ответа.
given().log().all() //Log all request specification detailsgiven().log().body() //Log only the request bodypost("/api").then().log().all() //Log all response specification detailspost("/api").then().log().body() //Log only the request body
Если мы хотим регистрировать данные только в случае неудачной проверки, то мы можем использовать метод ifValidationFails().
given().log().ifValidationFails()......then().log().ifValidationFails().
REST-assured поддерживает получение всего тела ответа и даже части документа ответа. Для получения определенной части ответа мы можем использовать синтаксис JSON-Path.
InputStream stream = post("/api").asInputStream();byte[] byteArray = post("/api").asByteArray();String json = post("/api").asString();String id = given()....post("/users").then()....extract().body().path("user.id");
7. Заключение
В этом руководстве мы научились тестировать API HTTP POST и PUT, используя различные методы отправки тела пользовательского запроса, заголовков, параметров и токенов аутентификации. Мы также научились обрабатывать данные ответа, включая регистрацию, проверку, извлечение и измерение времени для тестирования производительности.