Урок за REST Assured за автоматизирано тестване на API (пример)

Какво е Rest Assured?

Бъдете спокойни ви позволява да тествате REST API с помощта на java библиотеки и се интегрира добре с Maven. Има много ефективни техники за съпоставяне, така че утвърждаването на вашите очаквани резултати също е доста лесно. Rest Assured има методи за извличане на данни от почти всяка част от заявката и отговора, без значение колко сложни са JSON структурите.

За общността на тестването API автоматизираното тестване все още е ново и специализирано. Сложността на JSON поддържа тестването на API неизследвано. Но това не го прави по-малко важен в процеса на тестване. Бъдете сигурни. Рамката на io го направи много проста, използвайки основните основи на Java, което го прави много желано нещо за научаване.

Защо се нуждаете от Rest-Assured?

Представете си, че отваряте изгледа на картата на Google и търсите място, което искате да отидете, веднага виждате близки ресторанти, виждате опции за пътуване до работното място; от някои водещи доставчици на пътувания и вижте толкова много опции на една ръка разстояние. Всички знаем, че те не са продукти на Google, тогава как Google успява да го покаже. Те използват откритите API на тези доставчици. Сега, ако бъдете помолени да тествате този вид настройка, дори преди потребителският интерфейс да е изграден или да е в процес на разработка, тестването на API става изключително важно и многократното им тестване с различни комбинации от данни го прави много подходящ случай за автоматизация.

По-рано използвахме динамични езици като groovy, ruby, за да постигнем това, и беше предизвикателство. Следователно тестването на API не е изследвано чрез функционално тестване.

Но с помощта на Rest Assured автоматизираното тестване на API, изпращането на прости https заявки с лесни за потребителя персонализации е лесно, ако човек има базов опит в Java. Необходимо е да се разбере тестването на API и тестването на интеграцията, но публикувайте тази автоматизация. Бъдете сигурни, че дава много добра увереност в бекенда, докато тестването на предния край може да се съсредоточи само върху потребителския интерфейс и операциите от страна на клиента. Rest Assured е с отворен код с много допълнителни методи и добавени библиотеки, което го прави чудесен избор за автоматизация на API.

Как да настроите Rest Assured.io с Eclipse

Стъпка 1) Инсталирайте Java. Обърнете се към това ръководи

Стъпка 2) Изтеглете IDE, за да започнете: затъмнение

Стъпка 3) Инсталирайте Maven и настройте вашия eclipse. Реф тук.

Настройка Бъдете сигурни

  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

Синтаксис:

Синтаксисът на Rest Assured.io е най-красивата част, тъй като е много подобен на BDD и разбираем.

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

Обяснение:

код Обяснение
даден() Ключова дума „Given“ ви позволява да зададете фон, тук предавате заглавките на заявката, параметрите на заявката и пътя, тялото, бисквитките. Това не е задължително, ако тези елементи не са необходими в заявката
Когато() Ключовата дума 'when' маркира предпоставката на вашия сценарий. Например, „когато“ получите/публикувате/поставите нещо, направете нещо друго.
Метод() Заменете това с която и да е от CRUD операциите (get/post/put/delete)
Тогава() Вашите условия за твърдение и съпоставяне отиват тук

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

Какво ще донесеш?

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

Бъдете спокойни скрипт

В случай, че получите грешка в браузъра, когато се опитате да получите отговор на заявката,

  1. Вижте дали сте използвали Https или Http. Вашият браузър може да има настройки да не отваря незащитени уебсайтове.
  2. Вижте дали имате прокси или защитна стена, която блокира браузъра ви да отваря уебсайтове.

*Забележка – не сте използвали никакви заглавки тук, нито тяло, нито бисквитка. Това беше URL адрес и освен това получавате съдържание от API и не публикувате или актуализирате съществуващо съдържание, така че това го прави GET извикване. Запомнете това, за да разберете по-добре нашия първи тест.

Целта на вашия тест:

Целта на скрипта е да отпечата същия изход на вашата IDE конзола като това, което сте получили в браузъра чрез Rest Assured.

Нека кодираме това със следните стъпки:

Получаване на тялото на отговора

Стъпка 1) Създайте клас с име „myFirstRestAssuredClass“

Стъпка 2) Създайте метод, наречен „getResponseBody“

Стъпка 3) Подобно на структурата, научена по-рано от дадената, когато и след това, въведете кода по-долу

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

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

получи('https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1'). ->трябва да се предостави само url

тогава(). -> Не се изискват конкретни твърдения

log(). all() -> След като целият отговор бъде извлечен, регистрирайте отговора, заглавките, по същество всичко, което ви връща заявката.

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

Сега забележете, че използваният URL адрес е дълъг и по-малко четлив, ако се вгледате внимателно, ще забележите, че се използват 3 параметъра на заявката, които са

  1. Customer_ID
  2. Парола
  3. Account_No

Бъдете сигурни, помага ни да предаваме всяка част (заявка, път, параметър на заглавката) отделно, което прави кода по-четлив и лесен за поддръжка. Също така можем да параметризираме данните от външен файл, както е необходимо.

За използване на параметър на заявка се връщаме към нашата дефиниция на синтаксиса и виждаме, че всички те се предават като част от дадено.

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

**Имайте предвид, че използвахме „body“ вместо „all“; това ни помага да извлечем само тялото на отговора.

Изход:

Получаване на код за състояние на отговор

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

Стъпка 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("https://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

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

Изход:

Бизнес нужда

Едно от основните правила на автоматизацията е, че трябва да поставим контролни точки, така че тестът да продължи само ако са изпълнени всички необходими условия. При тестването на 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="https://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("https://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("https://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. Когато заявяваме условие, няма да има печат на конзолата, освен ако няма грешка.

Скрипт за извличане на различни части от отговор

Извличането на тялото на отговора и кода на състоянието на отговора вече е обхванато в горния сегмент. Заслужава да се отбележи, че за извличане на различни части от отговора, ключовата дума „екстракт“ е много важна.

Header

Rest Assured е много ясен език и извличането на заглавки е също толкова просто. Името на метода е headers(). Както преди, ние ще създадем самостоятелен метод, за да направим същото.

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

Моля, имайте предвид, че 'given().when()' се пропуска тук и кодовият ред започва от get(), това е така, защото тук няма предварително условие или проверка, направена тук, за да се удари заявката и да се получи отговор. В такива случаи не е задължително да използвате същото.

Изход:

Бизнес нужда:

Доста пъти ще трябва да използвате токена за оторизация или сесийна бисквитка за последващата заявка и най-вече тези подробности се връщат като заглавки на отговора.

Време За Реакция

За да получите времето, необходимо за извличане на отговора от бекенда или други системи надолу по веригата, Rest Assured предоставя метод, наречен „timeIn“ с подходяща timeUnit, за да получите времето, необходимо за връщане на отговора.

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

Изход:

Бизнес нужда:

Много важна характеристика на тестването на API е тяхното време за реакция, за да се измери производителността на приложението. Обърнете внимание, че времето, необходимо за вашето обаждане, може да отнеме повече или по-малко време в зависимост от вашата интернет скорост, производителността на API по това време, натоварването на сървъра и други фактори, влияещи върху времето.

Тип съдържание

Можете да получите върнатия тип съдържание на отговора, като използвате метода „contentType ()“.

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

Продукция

Бизнес нужда:

Понякога получаването на типа съдържание е от съществено значение, за да се гарантира, че няма пропуски в сигурността за всякакви заплахи от кръстосан произход или просто за да се гарантира, че предаваното съдържание отговаря на стандартите на API.

Извличане на отделен JSON елемент

От дадения отговор ще бъдете помолени да изчислите общата сума, трябва да извлечете всяка сума и да я сумирате.

Стъпки:

Стъпка 1) Полето за сума е в масив с ключови „изявления“, който на свой ред е в списъка с ключ „резултат“

Стъпка 2) Бъдете сигурни, предоставя механизъм за достигане на стойностите в API с помощта на „path“

Стъпка 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);

}

Забележка: Тъй като стойността на сумата е в низов тип данни, ние преобразуваме в цяло число и го използваме за сумиране.

Изход:

Oбобщение

  • Rest Assured е група от java библиотеки, които ни позволяват да автоматизираме Rest API тестване
  • Бъдете сигурни, че е Java-базирани и познаване на ядрото Java достатъчно, за да го научите
  • Помага за извличане на стойности на заявка и отговор от сложни JSON структури
  • - API заявката може да бъде персонализирана с различни заглавки, заявки, параметри на пътя и всяка сесия или бисквитки, които да бъдат зададени.
  • Помага за задаване на твърдения и условия.
  • Въпреки че Rest Assured е много полезно, когато отговорът е тип JSON, неговите методи може да не работят безпроблемно, ако ID на типа съдържание е HTML или обикновен текст.