Учебное пособие по REST Assured для автоматического тестирования API (пример)

Что такое будьте уверены?

Будьте уверены позволяет тестировать REST API с использованием Java-библиотек и хорошо интегрируется с Maven. Он имеет очень эффективные методы сопоставления, поэтому утверждение ожидаемых результатов также довольно просто. В Rest Assured есть методы для получения данных практически из каждой части запроса и ответа, независимо от того, насколько сложны структуры JSON.

Для сообщества тестировщиков автоматизированное тестирование API по-прежнему является новым и нишевым явлением. Сложности JSON оставляют тестирование API неисследованным. Но это не делает его менее важным в процессе тестирования. Фреймворк Rest Assured.io упростил использование основных основ Java, что делает его очень желательным для изучения.

Зачем нужна гарантия безопасности?

Представьте, что вы открываете карту Google и ищете место, куда хотите пойти, вы сразу видите ближайшие рестораны, видите варианты поездок на работу; от некоторых ведущих туроператоров и увидеть так много вариантов у вас под рукой. Мы все знаем, что это не продукты Google, тогда как Google удается это показать? Они используют открытые API этих поставщиков. Теперь, если вас просят протестировать такую ​​настройку, даже до того, как пользовательский интерфейс будет создан или находится в стадии разработки, тестирование API становится чрезвычайно важным, а их многократное тестирование с различными комбинациями данных делает это очень подходящим случаем для автоматизации.

Раньше для достижения этой цели мы использовали динамические языки, такие как groovy и Ruby, и это было непросто. Следовательно, тестирование API не было исследовано функциональным тестированием.

Но с помощью Rest Assured, автоматического тестирования API-интерфейсов, отправка простых https-запросов с удобными для пользователя настройками проста, если у вас есть базовый опыт работы с Java. Это необходимо для понимания тестирования API и интеграционного тестирования, но следует отметить, что автоматизация Rest Assured дает очень хорошую уверенность в бэкэнде, в то время как внешнее тестирование может сосредоточиться только на пользовательском интерфейсе и операциях на стороне клиента. Rest Assured — это проект с открытым исходным кодом, в который добавляется множество дополнительных методов и библиотек, что делает его отличным выбором для автоматизации API.

Как настроить Rest Assured.io с помощью Eclipse

Шаг 1) Установите Java. Обратитесь к этому инструкция

Шаг 2) Загрузите IDE для начала: затмение

Шаг 3) Установите Maven и настройте свое затмение. Ссылаться здесь.

Настройка Будьте уверены

  1. Создайте проект Maven в своей IDE. Мы используем Intellij, но вы получите аналогичную структуру в любой используемой вами IDE.
  2. Откройте свой POM.xml.
Структура проекта
Структура проекта

Для отдыха.io: Для Java версия < 9 пользователей:

Добавьте приведенную ниже зависимость в ваш POM.xml:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>xml-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

Для уверенности.io: Для Java Пользователи версии 9+:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured-all</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

Поиск и устранение неисправностей:

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

  1. Выполните сборку maven, чтобы импортировать все зависимости. Вы снова найдете помощь по настройке Maven на guru99.
  2. Тем не менее, вы видите ошибки, затем выполните очистку maven, а затем установку maven, и сборка должна пройти без каких-либо ошибок.
  3. Вы можете добавить приведенные ниже строки в свой класс Java и увидеть отсутствие ошибок компиляции.
import io.restassured.RestAssured.*;
import io.restassured.matcher.RestAssuredMatchers.*;
import org.hamcrest.Matchers.*;

Первый простой сценарий «Будьте уверены»

Синтаксис:

Синтаксис Rest Assured.io — самая красивая часть, поскольку он очень похож на BDD и понятен.

Given(). 
        param("x", "y"). 
        header("z", "w").
when().
Method().
Then(). 
        statusCode(XXX).
        body("x, ”y", equalTo("z"));

Объяснение:

Code объяснение
Данный() Ключевое слово «Given» позволяет установить фон. Здесь вы передаете заголовки запроса, параметры запроса и пути, тело, файлы cookie. Это необязательно, если эти элементы не нужны в запросе.
Когда() Ключевое слово «когда» отмечает предпосылку вашего сценария. Например, «когда» вы получаете/публикуете/выкладываете что-то, сделайте что-нибудь другое.
Метод() Замените это любой из операций CRUD (получить/пост/поместить/удалить).
Затем() Здесь находятся ваши условия утверждения и сопоставления.

Теперь, когда у вас есть настройки и некоторые сведения о синтаксисе, давайте создадим наш первый простой тест. Ничего страшного, если пока структура кажется вам новой, по мере дальнейшей интерпретации кода вы наловчитесь.

Что ты принесешь?

Откройте браузер и нажмите – http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1. Убедитесь, что вы видите что-то, как показано ниже.

Сценарий «Будьте уверены»

Если при попытке получить ответ на запрос в браузере возникает ошибка,

  1. Посмотрите, использовали ли вы Https или Http. В вашем браузере могут быть настройки, запрещающие открытие небезопасных веб-сайтов.
  2. Посмотрите, есть ли у вас прокси-сервер или брандмауэр, блокирующий открытие веб-сайтов в вашем браузере.

*Внимание — вы не использовали здесь ни заголовки, ни тело, ни файлы cookie. Это был URL-адрес, и вы также получаете контент из API, а не публикуете и не обновляете какой-либо существующий контент, так что это вызов GET. Помните об этом, чтобы лучше понять наш первый тест.

Цель вашего теста:

Цель сценария — вывести на консоль IDE тот же вывод, который вы получили в браузере через Rest Assured.

Давайте закодируем это с помощью следующих шагов:

Получение тела ответа

Шаг 1) Создайте класс с именем «myFirstRestAssuredClass».

Шаг 2) Создайте метод под названием «getResponseBody».

Шаг 3) Подобно структуре, изученной ранее, когда и затем введите приведенный ниже код.

данный(). -> Не требуются заголовки, нет параметров запроса или пути.

когда(). -> Нет конкретной настройки условий

получать('http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1'). -> необходимо указать только URL

затем(). -> Никаких конкретных утверждений не требуется

бревно(). all() -> После получения всего ответа запишите ответ, заголовки и, по сути, все, что вам возвращает запрос.

public static void getResponseBody(){
   given().when().get("http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1").then().log()
  .all();
 
}

Теперь обратите внимание, что используемый URL-адрес длинный и менее читаемый. Если вы присмотритесь, вы заметите, что используются 3 параметра запроса:

  1. Пользовательский ИД
  2. Пароль
  3. Аккаунт_Нет

Будьте уверены, это помогает нам передавать каждую часть (запрос, путь, параметр заголовка) отдельно, делая код более читабельным и простым в обслуживании. Кроме того, при необходимости мы можем параметризовать данные из внешнего файла.

Для использования параметров запроса мы возвращаемся к нашему определению синтаксиса и видим, что все они передаются как часть заданного.

public static void getResponseBody(){
 
   given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("http://demo.guru99.com/V4/sinkministatement.php").then().log()
           .body();
}

**Обратите внимание, что мы использовали «тело» вместо «все»; это помогает нам извлечь только тело ответа.

Вывод:

Вывод для getResponseBody
Вывод для getResponseBody

Получение кода статуса ответа

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

Шаг 1) Создайте метод getResponseStatus().

Шаг 2) Используйте ту же структуру запроса, что и выше. Скопируйте и вставьте его.

Шаг 3) Вместо регистрации мы используем встроенный метод GetStatusCode в Rest Assured для получения значения кода состояния.

Шаг 4) Чтобы утверждать, что ваш код состояния равен 200, мы используем ключевые слова — AssertThat().statusCode(expectedCode)

**Примечание. URL — это переменная, используемая для простоты. URL-адрес содержит весь URL-адрес запроса API.

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1") .when().get("http://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

Вывод:

Вывод для getResponseStatus
Вывод для getResponseStatus

Деловая потребность

Одно из основных правил автоматизации заключается в том, что мы должны ставить контрольные точки, чтобы тест продолжался только при выполнении всех необходимых условий. При тестировании API самая основная проверка — это проверка того, находится ли код состояния запроса в формате 2XX.

Полный код на данный момент:

import java.util.ArrayList;
import static io.restassured.RestAssured.*;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

public class myFirstRestAssuredClass {

   final static String url="http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1";

   public static void main(String args[]) {

     getResponseBody();
     getResponseStatus();

; }

   //This will fetch the response body as is and log it. given and when are optional here
   public static void getResponseBody(){
       given().when().get(url).then().log()
      .all();

  given().queryParam("CUSTOMER_ID","68195")
               .queryParam("PASSWORD","1234!")
               .queryParam("Account_No","1") .when().get("http://demo.guru99.com/V4/sinkministatement.php").then().log().body();
   }

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("http://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

}

*Заметка:

  1. 200 — успешный ответ для этого сценария. Иногда вам также нужно, чтобы запрос завершился неудачно, и тогда вы можете использовать 4XX или 5XX. Попробуйте изменить код состояния, указав неверные параметры, и проверьте.
  2. Когда мы утверждаем условие, на консоли не будет печати, если не произойдет ошибка.

Скрипт для получения различных частей ответа

Получение тела ответа и кода состояния ответа уже описано в приведенном выше сегменте. Стоит отметить, что для получения различных частей ответа очень важно ключевое слово «извлечь».

заголовок

Rest Assured — очень простой язык, и получение заголовков так же просто. Имя метода — headers(). Как и раньше, мы создадим отдельный метод, делающий то же самое.

public static void getResponseHeaders(){
   System.out.println("The headers in the response "+
                   get(url).then().extract()
           .headers());
}

Обратите внимание, что «given().when()» здесь пропускается, а строка кода начинается с get(). Это связано с тем, что здесь не выполняется предварительное условие или проверка для выполнения запроса и получения ответа. В таких случаях использовать то же самое необязательно.

Выход:

Вывод для getResponseHeader
Вывод для getResponseHeader

Деловая потребность:

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

Время отклика

Чтобы получить время, необходимое для получения ответа от серверной части или других нижестоящих систем, Rest Assured предоставляет метод timeIn с подходящей единицей времени, чтобы получить время, необходимое для возврата ответа.

public static void getResponseTime(){
  System.out.println("The time taken to fetch the response "+get(url)
         .timeIn(TimeUnit.MILLISECONDS) + " milliseconds");
}

Вывод:

Вывод для getResponseTime
Вывод для getResponseTime

Деловая потребность:

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

Content-Type

Вы можете получить тип контента возвращаемого ответа, используя метод «contentType ()».

public static void getResponseContentType(){
   System.out.println("The content type of response "+
           get(url).then().extract()
              .contentType());
}

Результат

Вывод для getContentType
Вывод для getContentType

Деловая потребность:

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

Получить отдельный элемент JSON

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

Шаги:

Шаг 1) Поле суммы находится в массиве с ключом «выписки», который, в свою очередь, находится в списке с ключом «результат».

Шаг 2) Будьте уверены: предоставляет механизм получения значений в API с использованием «пути».

Шаг 3) Путь к получению сумм — «result.statements.AMOUNT». Думайте об этом как о Xpath в селене.

Шаг 4) Получите все суммы в коллекции, а затем выполните цикл для всех значений, чтобы вычислить сумму.

public static void getSpecificPartOfResponseBody(){

ArrayList<String> amounts = when().get(url).then().extract().path("result.statements.AMOUNT") ;
int sumOfAll=0;
for(String a:amounts){

    System.out.println("The amount value fetched is "+a);
    sumOfAll=sumOfAll+Integer.valueOf(a);
}
System.out.println("The total amount is "+sumOfAll);

}

Примечание. Поскольку значение суммы имеет строковый тип данных, мы преобразуем его в целое число и используем его для суммирования.

Вывод:

Вывод для getSpecificPartOfResponse
Вывод для getSpecificPartOfResponse

Итого

  • Rest Assured — это группа Java-библиотек, которая позволяет нам автоматизировать Тестирование API остального
  • Будьте уверены, это Java-основанность и знание основных Java достаточно, чтобы этому научиться
  • Он помогает получать значения запроса и ответа из сложных структур JSON.
  • Команда API Запрос можно настроить с помощью различных заголовков, запросов, параметров пути, а также любого сеанса или файлов cookie, которые необходимо установить.
  • Это помогает устанавливать утверждения и условия утверждения.
  • Хотя Rest Assured очень полезен, когда ответ имеет тип JSON, его методы могут работать некорректно, если идентификатор типа контента HTML или обычный текст.