Рубрики
Без рубрики

Руководство по REST-уверены

Изучите основы программы REST-assured – библиотеки, которая упрощает тестирование и проверку API REST.

Автор оригинала: baeldung.

1. Введение

КОМПАНИЯ REST-assured была разработана для упрощения тестирования и проверки API REST и в значительной степени зависит от методов тестирования, используемых в динамических языках, таких как Ruby и Groovy.

Библиотека имеет твердую поддержку HTTP, начиная, конечно, с глаголов и стандартных операций HTTP, но и выходит далеко за рамки этих основ.

В этом руководстве мы собираемся изучить РЕСТ-гарантированных и мы собираемся использовать Hamcrest, чтобы сделать утверждение. Если вы еще не знакомы с Hamcrest, вы должны сначала освежить с учебником: Тестирование с Hamcrest .

Кроме того, чтобы узнать о более продвинутых случаях использования REST-assured, ознакомьтесь с другими нашими статьями:

  • РЕСТ-уверен с Groovy
  • JSON Схема Проверка с REST-уверены
  • Параметры, заготовки и печенье с гарантированной REST

Теперь давайте погрузимся в с простым примером.

2. Простой пример теста

Прежде чем мы начнем, давайте гарантируем, что наши тесты имеют следующие статические импорта:

io.restassured.RestAssured.*
io.restassured.matcher.RestAssuredMatchers.*
org.hamcrest.Matchers.*

Нам нужно, чтобы тесты были простыми и имели легкий доступ к основным API.

Теперь давайте начнем с простого примера – базовой системы ставок, разоблачающих некоторые данные для игр:

{
    "id": "390",
    "data": {
        "leagueId": 35,
        "homeTeam": "Norway",
        "visitingTeam": "England",
    },
    "odds": [{
        "price": "1.30",
        "name": "1"
    },
    {
        "price": "5.25",
        "name": "X"
    }]
}

Допустим, это ответ JSON от удара локально развернутых API – http://localhost:8080/events?id=390. :

Давайте теперь использовать REST-уверены, чтобы проверить некоторые интересные особенности ответа JSON:

@Test
public void givenUrl_whenSuccessOnGetsResponseAndJsonHasRequiredKV_thenCorrect() {
   get("/events?id=390").then().statusCode(200).assertThat()
      .body("data.leagueId", equalTo(35)); 
}

Итак, что мы сделали здесь – мы проверили, что вызов в конечную точку /события?id-390 отвечает телом, содержащим JSON Струнные чьи leagueId из данные объект 35.

Рассмотрим более интересный пример. Допустим, вы хотели бы проверить, что шансы массив имеет записи с ценами 1.30 и 5.25 :

@Test
public void givenUrl_whenJsonResponseHasArrayWithGivenValuesUnderKey_thenCorrect() {
   get("/events?id=390").then().assertThat()
      .body("odds.price", hasItems("1.30", "5.25"));
}

3. Установка, гарантированная REST

Если вашим любимым инструментом зависимости является Maven, мы добавляем следующую зависимость в пом.xml файл:


    io.rest-assured
    rest-assured
    3.3.0
    test

Чтобы получить последнюю версию, следуйте эта ссылка .
REST-assured использует силу hamcrest matchers для выполнения своих утверждений, поэтому мы должны включить, что зависимость, а также:


    org.hamcrest
    hamcrest-all
    2.1

Последняя версия всегда будет доступна на эта ссылка .

4. Анонимная проверка корня JSON

Рассмотрим массив, который состоит из примитивов, а не объектов:

[1, 2, 3]

Это называется анонимным корнем JSON, что означает, что он не имеет пары ключевых значений, тем не менее, он по-прежнему действителен JSON данных.

Мы можем выработать проверку в таком сценарии с помощью $ символ или пустая строка («» ) как путь. Предположим, что мы подвергаем вышеуказанную услугу через http://localhost:8080/json то мы можем проверить его, как это с REST-уверены:

when().get("/json").then().body("$", hasItems(1, 2, 3));

или вот так:

when().get("/json").then().body("", hasItems(1, 2, 3));

5. Поплавки и парный разряд

Когда мы начинаем использовать РЕСТ-гарантированные для тестирования наших услуг REST, мы должны понимать, что плавающие точечные числа в ответах JSON отображаются на примитивных типах плавать.

Использование поплавок тип не взаимозаменяем с двойной как и во многих сценариях java.

В качестве точки зрения зрения зрения имеется такой ответ:

{
    "odd": {
        "price": "1.30",
        "ck": 12.2,
        "name": "1"
    }
}

предположим, что мы запускаем следующий тест на значение ck :

get("/odd").then().assertThat().body("odd.ck", equalTo(12.2));

Этот тест провалится, даже если значение, которое мы тестируем, равно значению в ответе. Это потому, что мы сравниваем с двойной вместо того, чтобы поплавок .

Чтобы это сработало, мы должны четко указать оперу равныйВ метод матчера как поплавок , как это:

get("/odd").then().assertThat().body("odd.ck", equalTo(12.2f));

6. Определение метода запроса

Как правило, мы выполняем запрос, вызывая такой метод, как получить (), в соответствии с методом запроса, который мы хотим использовать.

Кроме того, мы также можем указать глагол HTTP, используя запрос () метод :

@Test
public void whenRequestGet_thenOK(){
    when().request("GET", "/users/eugenp").then().statusCode(200);
}

Приведенный выше пример эквивалентен использованию получить () прямо.

Аналогичным образом, мы можем отправить ГОЛОВНОй , ПОДКЛЮЧИТЕ и ВАРИАНТы Запросы:

@Test
public void whenRequestHead_thenOK() {
    when().request("HEAD", "/users/eugenp").then().statusCode(200);
}

Поместить запрос также следует аналогичному синтаксису, и мы можем указать тело с помощью с () и тело() методика.

Поэтому, чтобы создать новую Нечетные отправив POST просьба:

@Test
public void whenRequestedPost_thenCreated() {
    with().body(new Odd(5.25f, 1, 13.1f, "X"))
      .when()
      .request("POST", "/odds/new")
      .then()
      .statusCode(201);
}

Нечетные объект, отправленный в тело автоматически преобразуется в JSON. Мы также можем пройти любое Струнные что мы хотим послать в качестве нашего POST тело.

7. Конфигурация значений по умолчанию

Мы можем настроить много значений по умолчанию для тестов:

@Before
public void setup() {
    RestAssured.baseURI = "https://api.github.com";
    RestAssured.port = 443;
}

Здесь мы устанавливаем базовый URI и порт для наших запросов. Помимо этого, мы также можем настроить базовый путь, погладить корень, и аутентификации.

Примечание: мы также можем сбросить на стандартные неувереемые в REST по умолчанию с помощью:

RestAssured.reset();

8. Измерение времени отклика

Давайте посмотрим, как мы можем измерить время отклика с помощью время () и timeIn () методы Ответные объект :

@Test
public void whenMeasureResponseTime_thenOK() {
    Response response = RestAssured.get("/users/eugenp");
    long timeInMS = response.time();
    long timeInS = response.timeIn(TimeUnit.SECONDS);
    
    assertEquals(timeInS, timeInMS/1000);
}

Обратите внимание, что:

  • время () используется для времени отклика в миллисекундах
  • timeIn () используется для времени отклика в указанном времени

8.1. Проверка времени отклика

Мы также можем проверить время отклика – в миллисекундах – с помощью простых долго Совпадений:

@Test
public void whenValidateResponseTime_thenSuccess() {
    when().get("/users/eugenp").then().time(lessThan(5000L));
}

Если мы хотим проверить время отклика в другой единице времени, то мы будем использовать время () матч с второй ТаймУнит параметр:

@Test
public void whenValidateResponseTimeInSeconds_thenSuccess(){
    when().get("/users/eugenp").then().time(lessThan(5L),TimeUnit.SECONDS);
}

9.XML Проверка ответов

Он не только может проверить ответ JSON, он может проверить XML, а также.

Допустим, мы делаем запрос на http://localhost:8080/employees и мы получаем следующий ответ:


    
        Jane
        Daisy
        f
    

Мы можем проверить, что имя это Джейн как так:

@Test
public void givenUrl_whenXmlResponseValueTestsEqual_thenCorrect() {
    post("/employees").then().assertThat()
      .body("employees.employee.first-name", equalTo("Jane"));
}

Мы также можем проверить, что все значения соответствуют нашим ожидаемым значениям, приковав вместе спички тела так:

@Test
public void givenUrl_whenMultipleXmlValuesTestEqual_thenCorrect() {
    post("/employees").then().assertThat()
      .body("employees.employee.first-name", equalTo("Jane"))
        .body("employees.employee.last-name", equalTo("Daisy"))
          .body("employees.employee.sex", equalTo("f"));
}

Или с помощью сокращенной версии с переменными аргументами:

@Test
public void givenUrl_whenMultipleXmlValuesTestEqualInShortHand_thenCorrect() {
    post("/employees")
      .then().assertThat().body("employees.employee.first-name", 
        equalTo("Jane"),"employees.employee.last-name", 
          equalTo("Daisy"), "employees.employee.sex", 
            equalTo("f"));
}

10. XPath для XML

Мы также можем проверить наши ответы с помощью XPath. Рассмотрим пример ниже, который выполняет матч на имя :

@Test
public void givenUrl_whenValidatesXmlUsingXpath_thenCorrect() {
    post("/employees").then().assertThat().
      body(hasXPath("/employees/employee/first-name", containsString("Ja")));
}

XPath также принимает альтернативный способ запуска равныйВ Совпадений:

@Test
public void givenUrl_whenValidatesXmlUsingXpath2_thenCorrect() {
    post("/employees").then().assertThat()
      .body(hasXPath("/employees/employee/first-name[text()='Jane']"));
}

11. Подробная информация о тестировании журналов

11.1. Подробная информация о запросе журнала

Во-первых, давайте посмотрим, как войти все детали запроса с помощью журнал ().все() :

@Test
public void whenLogRequest_thenOK() {
    given().log().all()
      .when().get("/users/eugenp")
      .then().statusCode(200);
}

Это будет журнал что-то вроде этого:

Request method:	GET
Request URI:	https://api.github.com:443/users/eugenp
Proxy:			
Request params:	
Query params:	
Form params:	
Path params:	
Multiparts:		
Headers:		Accept=*/*
Cookies:		
Body:			

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

Обратите внимание, что другие библиотеки или фильтры могут изменять то, что на самом деле отправляется на сервер, поэтому это должно использоваться только для регистрации спецификации первоначального запроса.

11.2. Подробная информация о регистрации

Аналогичным образом, мы можем войти детали ответа.

В следующем примере мы регистрим только тело ответа:

@Test
public void whenLogResponse_thenOK() {
    when().get("/repos/eugenp/tutorials")
      .then().log().body().statusCode(200);
}

Выход образца:

{
    "id": 9754983,
    "name": "tutorials",
    "full_name": "eugenp/tutorials",
    "private": false,
    "html_url": "https://github.com/eugenp/tutorials",
    "description": "The \"REST With Spring\" Course: ",
    "fork": false,
    "size": 72371,
    "license": {
        "key": "mit",
        "name": "MIT License",
        "spdx_id": "MIT",
        "url": "https://api.github.com/licenses/mit"
    },
...
}

11.3. Реакция журнала если условие произошло

У нас также есть возможность регистрации ответа только в том случае, если произошла ошибка или код статуса соответствует данному значению:

@Test
public void whenLogResponseIfErrorOccurred_thenSuccess() {
 
    when().get("/users/eugenp")
      .then().log().ifError();
    when().get("/users/eugenp")
      .then().log().ifStatusCodeIsEqualTo(500);
    when().get("/users/eugenp")
      .then().log().ifStatusCodeMatches(greaterThan(200));
}

11.4. Если проверка не удалась

Мы также можем регистрировать как запрос, так и ответ только в том случае, если наша проверка не была смогла:

@Test
public void whenLogOnlyIfValidationFailed_thenSuccess() {
    when().get("/users/eugenp")
      .then().log().ifValidationFails().statusCode(200);

    given().log().ifValidationFails()
      .when().get("/users/eugenp")
      .then().statusCode(200);
}

В этом примере мы хотим проверить, что код статуса 200. Только в том случае, если это не удается, запрос и ответ будут зарегистрированы.

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

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

Полную реализацию всех этих примеров и фрагментов кода можно найти в гарантированном REST Проект GitHub .