Tutorial de testare API REST Assured
โก Rezumat inteligent
REST Assured se impune ca JavaBibliotecฤ open-source bazatฤ pe , care simplificฤ testarea automatฤ a API-urilor REST. Framework-ul permite inginerilor de calitate sฤ valideze rฤspunsuri JSON complexe, anteturi, coduri de stare ศi timpi de rฤspuns folosind o sintaxฤ curatฤ รฎn stil BDD, cu integrare perfectฤ cu Maven.

Ce este Fii sigur?
Fiศi siguri vฤ permite sฤ testaศi API-urile REST folosind biblioteci java ศi se integreazฤ bine cu Maven. Are tehnici de potrivire foarte eficiente, aศa cฤ afirmarea rezultatelor aศteptate este, de asemenea, destul de simplฤ. Rest Assured are metode pentru a prelua date din aproape fiecare parte a cererii ศi a rฤspunsului, indiferent cรขt de complexe sunt structurile JSON.
Pentru comunitatea de testare, API Automation Testing este รฎncฤ nou ศi de niศฤ. Complexitฤศile JSON menศin testarea API-ului neexplorat. Dar asta nu รฎl face mai puศin important รฎn procesul de testare. Cadrul Rest Assured.io a fฤcut-o foarte simplu folosind elementele de bazฤ ale Java, ceea ce รฎl face un lucru foarte de dorit de รฎnvฤศat.
De ce ai nevoie de Rest-Assured?
Imagineazฤ-ศi cฤ รฎศi deschizi Google Vizualizaศi Hฤrศi ศi cฤutaศi un loc unde doriศi sฤ mergeศi. Vedeศi imediat restaurante รฎn apropiere, opศiuni de navetฤ de la furnizorii de servicii de cฤlฤtorie de top ศi multe opศiuni la รฎndemรขnฤ. ศtim cu toศii cฤ acestea nu sunt Google produse, deci cum funcศioneazฤ Google reuศeศte sฤ le afiศeze? Foloseศte API-urile expuse ale acestor furnizori. Acum, dacฤ ศi se cere sฤ testezi acest tip de configuraศie, chiar รฎnainte ca interfaศa cu utilizatorul sฤ fie construitฤ sau sฤ fie รฎn curs de dezvoltare, testarea API-urilor devine extrem de importantฤ. Testarea lor repetatฤ cu diferite combinaศii de date o face un caz foarte potrivit pentru automatizare.
Anterior, echipele foloseau limbaje dinamice precum Groovy ศi Ruby pentru a realiza acest lucru, iar acest lucru a fost o provocare. Prin urmare, testarea API nu a fost exploratฤ pe scarฤ largฤ de cฤtre testerii funcศionali.
Totuศi, cu Rest Assured, testarea automatizatฤ a API-urilor ศi trimiterea de cereri HTTPS simple cu personalizฤri uศor de utilizat devin simple dacฤ se au cunoศtinศe de bazฤ despre... JavaEste util pentru รฎnศelegerea testฤrii API ศi a testฤrii integrฤrii. Rest Assured oferฤ o รฎncredere puternicฤ รฎn backend, รฎn timp ce testerii front-end se pot concentra pe interfaศa cu utilizatorul ศi pe operaศiunile din partea clientului. Rest Assured este open source, iar adฤugarea constantฤ de metode ศi biblioteci l-a transformat รฎntr-o alegere excelentฤ pentru automatizarea API-urilor.
REST Assured vs. Postman: Diferenศele cheie
Atรขt REST Assured, cรขt ศi Postman valideazฤ API-urile REST, รฎnsฤ fiecare se potriveศte unei etape diferite a ciclului de viaศฤ al testฤrii. Selectarea instrumentului potrivit depinde de abilitฤศile echipei, de domeniul de aplicare al proiectului ศi de nevoile de integrare.
| Aspect | Fiศi siguri | Postman |
|---|---|---|
| Tip | Java bibliotecฤ pentru automatizare bazatฤ pe cod | Client API bazat pe interfaศฤ graficฤ cu suport pentru scripting |
| Cel mai bun caz de utilizare | Conducte de integrare continuฤ ศi suite de regresie | Explorare manualฤ ศi verificฤri rapide ale API-ului |
| Cerinศฤ de abilitฤศi | Nucleu Java cunoศtinศe necesare | Codare minimalฤ; utilizฤri JavaFragmente de script |
| Raportarea | Se integreazฤ cu TestNG, JUnitศi Allure | Rezumate de rulare รฎncorporate prin intermediul interfeศei de comandฤ Newman |
Multe echipe folosesc Postman pentru prototipuri timpuriiping ศi treceศi la REST Assured pentru regresie automatฤ odatฤ ce API-ul este contract se stabilizeazฤ.
Cum sฤ configuraศi Rest Assured.io cu Eclipse
Configurarea REST Assured implicฤ trei dependenศe principale: Java, un IDE ศi Maven. Urmaศi paศii de mai jos pentru a evita erorile de compilare ulterioare.
Pasul 1) Instalaศi Java. Faceศi referire la aceasta ghida
Pasul 2) Descฤrcaศi un IDE pentru a รฎncepe: eclipsฤ
Pasul 3) Instalaศi Maven ศi configuraศi-vฤ eclipsa. Consultaศi aici.
Configurare Fiศi siguri
- Creaศi un proiect Maven รฎn IDE-ul dumneavoastrฤ. Noi folosim IntelliJ, dar veศi obศine o structurฤ similarฤ pe orice IDE pe care รฎl utilizaศi.
- Deschideศi fiศierul POM.xml.
Structura proiectului pentru un spaศiu de lucru Maven REST Assured
For Rest Assured.io: Pentru Java versiunea < 9 utilizatori:
Adฤugaศi dependenศa de mai jos la POM.xml dvs.:
<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>
For Rest Assured.io: Pentru Java Utilizatori versiunea 9+:
<dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured-all</artifactId> <version>4.2.0</version> <scope>test</scope> </dependency>
Depanare:
รn cazul รฎn care observaศi erori ศi nu sunteศi sigur dacฤ dependenศele au fost descฤrcate corect, urmaศi aceศti paศi:
- Executaศi o compilare Maven pentru a importa toate dependenศele. Veศi gฤsi ajutor pentru configurarea Maven pe Guru99.
- Dacฤ erorile persistฤ, executaศi o curฤศare Maven urmatฤ de o instalare Maven. Compilarea ar trebui sฤ se finalizeze fฤrฤ erori.
- Adฤugaศi importurile de mai jos รฎn Java clasa ศi confirmaศi cฤ nu existฤ erori de compilare.
import io.restassured.RestAssured.*; import io.restassured.matcher.RestAssuredMatchers.*; import org.hamcrest.Matchers.*;
Primul script simplu Rest Assured
Cu dependenศele implementate, acum puteศi scrie primul script. Framework-ul urmeazฤ un stil de dezvoltare bazatฤ pe comportament (BDD) care se citeศte aproape ca limba englezฤ.
Sintaxฤ:
Sintaxa Rest Assured.io este cea mai uศor de citit parte a framework-ului, deoarece este foarte asemฤnฤtoare cu BDD ศi uศor de รฎnศeles.
Given().
param("x", "y").
header("z", "w").
when().
Method().
Then().
statusCode(XXX).
body("x", "y", equalTo("z"));
Explicaลฃie:
| Code | Explicaศie |
|---|---|
| Dat() | Cuvรขntul cheie โGivenโ vฤ permite sฤ setaศi un fundal. Aici, transmiteศi anteturile cererii, parametrii de interogare ศi cale, corpul cererii ศi cookie-urile. Acest lucru este opศional dacฤ aceste elemente nu sunt necesare รฎn cerere. |
| Cรขnd() | Cuvรขntul cheie โcรขndโ marcheazฤ premisa scenariului tฤu. De exemplu, โcรขndโ primeศti/postezi/puni ceva, fฤ altceva. |
| Metodฤ() | รnlocuiศi aceasta cu oricare dintre operaศiunile CRUD (get/post/put/delete). |
| Apoi() | Condiศiile tale de afirmare ศi de potrivire se aflฤ aici. |
Acum, cฤ ai configuraศia ศi cรขteva cunoศtinศe despre sintaxฤ, hai sฤ creฤm primul nostru test simplu. Este รฎn regulฤ dacฤ structura ศi se pare nouฤ, pe mฤsurฤ ce codezi mai departe ศi interpretezi fiecare linie, te vei obiศnui cu ea.
Ce vei aduce?
Deschideศi browserul ศi apฤsaศi โ https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1. Asiguraศi-vฤ cฤ vedeศi ceva ca mai jos.
Exemplu de rฤspuns API capturat de REST Assured
รn cazul รฎn care primiศi o eroare รฎn browser atunci cรขnd รฎncercaศi sฤ obศineศi un rฤspuns la cerere:
- Verificฤ dacฤ ai folosit HTTPS sau HTTP. Browserul tฤu ar putea avea setฤri care blocheazฤ site-urile web nesigure.
- Verificaศi dacฤ vreun proxy sau firewall blocheazฤ browserul dvs. sฤ deschidฤ site-ul web.
*notiศe โ nu ai folosit niciun antet aici, niciun corp ศi niciun cookie. A fost un URLศi primiศi conศinut de la API รฎn loc sฤ postaศi sau sฤ actualizaศi conศinut existent. Aceasta รฎl face un apel GET. Reศineศi acest lucru pentru a รฎnศelege mai bine primul nostru test.
Obiectivul testului dvs.:
Scopul scriptului este de a imprima aceeaศi ieศire pe consola IDE ca ceea ce aศi primit รฎn browser prin Rest Assured.
Sฤ codificฤm acest lucru cu paศii de mai jos:
Obศinerea rฤspunsului Body
Pas 1) Creaศi o clasฤ numitฤ โmyFirstRestAssuredClassโ.
Pas 2) Creaศi o metodฤ numitฤ โgetResponseBodyโ.
Pas 3) Similar structurii รฎnvฤศate anterior pentru given, when ศi then, introduceศi codul de mai jos:
dat(). -> Nu sunt necesare antete, nici un parametru de interogare sau cale.
cรขnd(). -> Nicio condiศie specificฤ configuratฤ.
obศine('https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1'). -> doar URL trebuie furnizat.
then(). -> Nu sunt necesare aserศiuni specifice.
log().all() -> Odatฤ ce toate rฤspunsurile sunt preluate, se รฎnregistreazฤ รฎn jurnal rฤspunsul, anteturile ศi, practic, tot ceea ce vฤ returneazฤ solicitarea.
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();
}
Acum observaศi cฤ URL โusedโ este lung ศi mai puศin lizibil. Privind cu atenศie, veศi observa cฤ sunt utilizaศi 3 parametri de interogare:
- Numฤr de รฎnregistrare client
- Parolฤ
- Cont_Nr
Rest Assured ne ajutฤ sฤ transmitem fiecare parte (interogare, cale, parametru antet) separat, fฤcรขnd codul mai lizibil ศi mai uศor de รฎntreศinut. De asemenea, putem parametriza datele dintr-un fiศier extern, dupฤ cum este necesar.
Pentru a utiliza parametrul de interogare, ne รฎntoarcem la definiศia noastrฤ a sintaxei ศi vedem cฤ toate sunt transmise ca parte a datei.
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();
}
**Reศineศi cฤ am folosit โcorpโ รฎn loc de โtotโ; acest lucru ne ajutฤ sฤ exprimฤmtracdoar corpul rฤspunsului.
ieศire:
Obศinerea codului de stare a rฤspunsului
Urmฤtoarea metodฤ pe care o vom scrie รฎn script este sฤ obศinem codul de stare ศi sฤ plasฤm o aserศiune pentru a-l valida.
Pas 1) Creaศi o metodฤ numitฤ getResponseStatus().
Pas 2) Utilizaศi aceeaศi structurฤ de solicitare folositฤ mai sus. Copiaศi ศi lipiศi-l.
Pas 3) รn loc sฤ รฎl รฎnregistrezi, foloseศte โgetStatusโCode' metodฤ รฎncorporatฤ a Rest Assured pentru a obศine valoarea codului de stare.
Pas 4) Pentru a afirma cฤ codul dvs. de stare este 200, utilizaศi cuvintele cheie โ assertThat().statusCode(aศteptatCode).
**Notฤ โ URL este o variabilฤ utilizatฤ pentru simplitate. URL conศine รฎntreaga cerere API URL.
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);
}
ieศire:
Nevoie de afaceri
Una dintre regulile de bazฤ ale automatizฤrii este cฤ trebuie sฤ punem puncte de control, astfel รฎncรขt testul sฤ continue numai dacฤ sunt รฎndeplinite toate condiศiile cerute. รn testarea API, cea mai simplฤ validare este verificarea dacฤ codul de stare al cererii este รฎn format 2XX.
Codul complet, pรขnฤ acum:
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);
}
}
*Notฤ:
- 200 este un rฤspuns reuศit pentru acest scenariu. Uneori, este posibil sฤ fie nevoie ca solicitarea sฤ eศueze, caz รฎn care puteศi utiliza 4XX sau 5XX. รncercaศi sฤ modificaศi codul de stare furnizรขnd parametri nevalidi ศi verificaศi.
- Cรขnd afirmฤm o condiศie, nu va exista nicio imprimare pe consolฤ decรขt dacฤ existฤ o eroare.
Script pentru a prelua diferite pฤrศi ale unui rฤspuns
Dincolo de corpul rฤspunsului ศi codul de stare, REST Assured expune ศi anteturile, timpul de rฤspuns ศi tipul de conศinut prin intermediul unor exemple รฎnlฤnศuibile.tracmetode tor. Cuvรขntul cheie โextract' este esenศial pentru preluarea acestor pฤrศi specifice.
Antet
Rest Assured este un limbaj foarte simplu, iar preluarea antetelor este la fel de simplฤ. Numele metodei este headers(). Ca ศi รฎnainte, vom crea o metodฤ independentฤ pentru a face acelaศi lucru.
public static void getResponseHeaders(){
System.out.println("The headers in the response "+
get(url).then().extract()
.headers());
}
Reศineศi cฤ โgiven().when()โ este omisฤ aici, iar linia de cod รฎncepe de la get(). Acest lucru se datoreazฤ faptului cฤ nu existฤ nicio precondiศie sau verificare efectuatฤ รฎnainte de a accesa cererea ศi a primi un rฤspuns. รn astfel de cazuri, este opศional sฤ o utilizaศi.
ieลire:
Nevoie de afaceri:
Destul de des, ar trebui sฤ utilizaศi token-ul de autorizare sau un cookie de sesiune pentru solicitarea ulterioarฤ, iar aceste detalii sunt returnate รฎn mare parte ca anteturi ale rฤspunsului.
Timp De Raspuns
Pentru a obศine timpul necesar pentru a prelua rฤspunsul de la backend sau alte sisteme din aval, Rest Assured oferฤ o metodฤ numitฤ โtimeInโ cu o unitate de timp adecvatฤ pentru a obศine timpul necesar pentru a returna rฤspunsul.
public static void getResponseTime(){
System.out.println("The time taken to fetch the response "+get(url)
.timeIn(TimeUnit.MILLISECONDS) + " milliseconds");
}
ieศire:
Nevoie de afaceri:
O caracteristicฤ foarte importantฤ a testฤrii API-urilor este timpul lor de rฤspuns, care mฤsoarฤ performanศa aplicaศiei. Timpul necesar apelului poate fi mai mare sau mai mic, รฎn funcศie de viteza conexiunii la internet, performanศa API-ului la momentul respectiv, รฎncฤrcarea serverului ศi alศi factori care influenศeazฤ timpul.
Content-Type
Puteศi obศine tipul de conศinut al rฤspunsului returnat folosind metoda โcontentType()โ.
public static void getResponseContentType(){
System.out.println("The content type of response "+
get(url).then().extract()
.contentType());
}
producศie
Nevoie de afaceri:
Uneori, obศinerea tipului de conศinut este esenศialฤ pentru a asigura cฤ nu existฤ lacune de securitate pentru ameninศฤri de tip cross-source ศi pentru a confirma cฤ respectivul conศinut este conform standardelor API.
Preluaศi elementul JSON individual
Pe baza rฤspunsului dat, ศi se cere sฤ calculezi suma totalฤ. Trebuie sฤ aduci fiecare sumฤ ศi sฤ o aduni.
Paศi:
Pas 1) Cรขmpul โamountโ se aflฤ รฎntr-o matrice cu cheia โstatementsโ, care la rรขndul ei se aflฤ รฎn lista cu cheia โresultโ.
Pas 2) Rest Assured oferฤ un mecanism pentru a ajunge la valorile din API folosind โcaleโ.
Pas 3) Calea pentru a ajunge la sume este โresult.statements.AMOUNTโ. Gรขndiศi-vฤ la ea ca la XPath รฎn Selenium.
Pas 4) Preia toate sumele dintr-o colecศie, apoi parcurge toate valorile pentru a calcula suma.
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);
}
Notฤ: Deoarece valoarea amount este un tip de date ศir de caractere, o convertim รฎntr-un numฤr รฎntreg pentru รฎnsumare.
ieศire:
Cele mai bune practici pentru automatizarea testelor REST Assured
Odatฤ ce รฎnศelegeศi elementele de bazฤ, aplicarea unor modele disciplinate menศine suita fiabilฤ pe mฤsurฤ ce suprafaศa API creศte. Practicile de mai jos ajutฤ echipele sฤ evite testele instabile ศi cheltuielile suplimentare de รฎntreศinere.
- Centralizaศi baza URL: Stocaศi URI-ul de bazฤ ศi token-urile de autentificare รฎntr-o singurฤ clasฤ de configurare sau fiศier de proprietฤศi. Acest lucru evitฤ duplicarea ศi simplificฤ schimbarea mediului.
- Utilizaศi specificaศiile de solicitare ศi rฤspuns: Construieศte obiecte RequestSpecBuilder ศi ResponseSpecBuilder reutilizabile. Acestea reduc suprasolicitarea atunci cรขnd mai multe teste au anteturi sau aserศiuni comune.
- Validarea schemei JSON: Combinaศi REST Assured cu modulul json-schema-validator pentru a confirma contracIntegritatea. Verificฤrile schemei detecteazฤ modificฤrile incompatibile รฎnainte ca acestea sฤ ajungฤ la consumatorii din aval.
- Externalizarea datelor de testare: Stocaศi sarcini utile รฎn fiศiere JSON sau utilizaศi furnizori de date de la TestNGDatele codificate fix devin rapid รฎnvechite.
- Executaศi teste independente: Fiecare test ar trebui sฤ configureze ศi sฤ elimine propriile date. Suitele dependente de ordine eศueazฤ imprevizibil รฎn rulฤrile paralele ale CI.
- Capturaศi jurnalele selectiv: Foloseศte log().ifError() รฎn suitele stabile ศi log().all() รฎn timpul depanฤrii. Jurnalele detaliate รฎncetinesc conductele CI ศi ascund problemele reale.
- Conectaศi la CI/CD: Declanศaศi suitele REST Assured prin Maven Surefire sau Failsafe รฎn Jenkins, Acศiuni GitHub sau GitLab. Rulaศi verificฤri de tip โsmoke checkโ pentru fiecare commit ศi regresie completฤ peste noapte.
Adoptarea timpurie a acestor obiceiuri transformฤ automatizarea API-urilor รฎntr-un avantaj pe termen lung, mai degrabฤ decรขt รฎntr-un blocaj fragil.


