Samouczek testowania interfejsu API REST Assured
โก Inteligentne podsumowanie
REST Assured ugruntowuje swojฤ pozycjฤ jako JavaOparta na otwartym kodzie ลบrรณdลowym biblioteka, ktรณra usprawnia automatyczne testowanie interfejsu API REST. Framework umoลผliwia inลผynierom jakoลci walidacjฤ zลoลผonych odpowiedzi JSON, nagลรณwkรณw, kodรณw statusu i czasรณw odpowiedzi przy uลผyciu przejrzystej skลadni w stylu BDD z pลynnฤ integracjฤ z Maven.

Co to jest pewnoลฤ spokoju?
Zapewniam ciฤ umoลผliwia testowanie interfejsรณw API REST przy uลผyciu bibliotek Java i dobrze integruje siฤ z Maven. Posiada bardzo wydajne techniki dopasowywania, wiฤc potwierdzenie oczekiwanych wynikรณw jest rรณwnieลผ doลฤ proste. Rest Assured ma metody pobierania danych z niemal kaลผdej czฤลci ลผฤ dania i odpowiedzi, niezaleลผnie od tego, jak zลoลผone sฤ struktury JSON.
Dla spoลecznoลci testujฤ cej testowanie automatyzacji API jest wciฤ ลผ czymล nowym i niszowym. Zลoลผonoลฤ JSON sprawia, ลผe โโtestowanie API pozostaje niezbadane. Ale to nie czyni go mniej waลผnym w procesie testowania. Framework Rest Assured.io uczyniล to bardzo prostym, wykorzystujฤ c podstawowe podstawy jฤzyka Java, co czyni go bardzo poลผฤ danym przedmiotem do nauki.
Dlaczego potrzebujesz Rest-Assured?
Wyobraลบ sobie, ลผe otwierasz Google Przeglฤ daj mapy i szukaj miejsc, do ktรณrych chcesz siฤ udaฤ. Od razu zobaczysz pobliskie restauracje, opcje dojazdu od wiodฤ cych biur podrรณลผy i wiele opcji na wyciฤ gniฤcie rฤki. Wszyscy wiemy, ลผe to nie jestโฆ Google produkty, wiฤc jak to dziaลa Google Jak je wyลwietliฤ? Wykorzystuje on udostฤpnione API tych dostawcรณw. Jeลli zostaniesz poproszony o przetestowanie takiej konfiguracji, jeszcze przed stworzeniem lub rozwojem interfejsu uลผytkownika, testowanie API staje siฤ niezwykle waลผne. Wielokrotne testowanie ich z rรณลผnymi kombinacjami danych sprawia, ลผe โโjest to bardzo odpowiedni przypadek do automatyzacji.
Wczeลniej zespoลy korzystaลy z dynamicznych jฤzykรณw, takich jak Groovy i Ruby, aby to osiฤ gnฤ ฤ, i byลo to trudne. W zwiฤ zku z tym testowanie API nie byลo szeroko eksplorowane przez testerรณw funkcjonalnych.
Jednak dziฤki Rest Assured automatyczne testowanie interfejsรณw API i wysyลanie prostych ลผฤ daล HTTPS z przyjaznymi dla uลผytkownika dostosowaniami staje siฤ proste, jeลli ktoล ma podstawowฤ wiedzฤ na temat JavaJest pomocny w zrozumieniu testowania API i testรณw integracyjnych. Rest Assured daje duลผฤ pewnoลฤ w zakresie back-endu, podczas gdy testerzy front-endu mogฤ skupiฤ siฤ na interfejsie uลผytkownika i operacjach po stronie klienta. Rest Assured jest oprogramowaniem typu open source, a ciฤ gลe dodawanie metod i bibliotek sprawiลo, ลผe jest to doskonaลy wybรณr do automatyzacji API.
REST Assured vs Postman: Kluczowe rรณลผnice
Zarรณwno REST Assured, jak i Postman Walidacja interfejsรณw API REST, ale kaลผde z nich pasuje do innego etapu cyklu testowania. Wybรณr odpowiedniego narzฤdzia zaleลผy od umiejฤtnoลci zespoลu, zakresu projektu i potrzeb integracyjnych.
| WYGLฤD | Zapewniony odpoczynek | Postman |
|---|---|---|
| Typ | Java biblioteka do automatyzacji opartej na kodzie | Klient API oparty na interfejsie graficznym z obsลugฤ skryptรณw |
| Najlepszy przypadek uลผycia | Ciฤ gลe procesy integracji i zestawy regresji | Rฤczna eksploracja i szybkie kontrole API |
| Wymagania dotyczฤ ce umiejฤtnoลci | rdzeล Java wymagana wiedza | Minimalne kodowanie; uลผywa JavaFragmenty skryptu |
| Raportowanie | Integruje siฤ z TestNG, JUniti Allure | Wbudowane podsumowania przebiegรณw za poลrednictwem interfejsu wiersza poleceล Newman |
Wiele zespoลรณw korzysta Postman dla wczesnego prototypuping i przejdลบ na REST Assured w celu automatycznej regresji, gdy API bฤdzie gotowetract siฤ stabilizuje.
Jak skonfigurowaฤ Rest Assured.io za pomocฤ Eclipse
Wdroลผenie usลugi REST Assured wymaga speลnienia trzech podstawowych zaleลผnoลci: Java, IDE i Maven. Wykonaj poniลผsze kroki, aby uniknฤ ฤ bลฤdรณw kompilacji w przyszลoลci.
Krok 1) Zainstaluj Java. Zapoznaj siฤ z tym
Krok 2) Pobierz IDE, aby rozpoczฤ ฤ: zaฤmienie
Krok 3) Zainstaluj Maven i skonfiguruj eclipse. Zapoznaj siฤ z w tym miejscu.
Konfiguracja jest pewna
- Utwรณrz projekt Maven w swoim IDE. My uลผywamy IntelliJ, ale podobnฤ strukturฤ uzyskasz w dowolnym uลผywanym IDE.
- Otwรณrz plik POM.xml.
Struktura projektu dla obszaru roboczego Maven z certyfikatem REST
Aby mieฤ pewnoลฤ.io: Dla Java wersja < 9 uลผytkownikรณw:
Dodaj poniลผszฤ zaleลผnoลฤ do pliku 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>
Aby mieฤ pewnoลฤ.io: Dla Java uลผytkownicy wersji 9+:
<dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured-all</artifactId> <version>4.2.0</version> <scope>test</scope> </dependency>
Rozwiฤ zywanie problemรณw:
Jeลli widzisz bลฤdy i nie masz pewnoลci, czy zaleลผnoลci zostaลy poprawnie pobrane, wykonaj nastฤpujฤ ce kroki:
- Wykonaj kompilacjฤ Maven, aby zaimportowaฤ wszystkie zaleลผnoลci. Pomoc dotyczฤ cฤ konfiguracji Maven znajdziesz tutaj. Guru99.
- Jeลli bลฤdy nadal wystฤpujฤ , uruchom czyszczenie Mavena, a nastฤpnie instalacjฤ Mavena. Kompilacja powinna zakoลczyฤ siฤ bez bลฤdรณw.
- Dodaj poniลผsze importy do swojego Java klasฤ i sprawdลบ, czy nie ma bลฤdรณw kompilacji.
import io.restassured.RestAssured.*; import io.restassured.matcher.RestAssuredMatchers.*; import org.hamcrest.Matchers.*;
Pierwszy prosty skrypt typu Rest Assured
Po skonfigurowaniu zaleลผnoลci moลผesz teraz napisaฤ swรณj pierwszy skrypt. Framework wykorzystuje styl programowania sterowanego zachowaniem (BDD), ktรณry brzmi niemal jak jฤzyk angielski.
Skลadnia:
Skลadnia Rest Assured.io jest najbardziej czytelnฤ czฤลciฤ struktury, poniewaลผ jest bardzo podobna do BDD i zrozumiaลa.
Given().
param("x", "y").
header("z", "w").
when().
Method().
Then().
statusCode(XXX).
body("x", "y", equalTo("z"));
Wyjaลnienie:
| Code | Wyjaลnienie |
|---|---|
| Dany() | Sลowo kluczowe โGivenโ pozwala ustawiฤ tลo. W tym miejscu przekazujesz nagลรณwki ลผฤ dania, parametry zapytania i ลcieลผki, treลฤ oraz pliki cookie. Jest to opcjonalne, jeลli te elementy nie sฤ potrzebne w ลผฤ daniu. |
| Gdy() | Sลowo kluczowe โkiedyโ oznacza zaลoลผenie Twojego scenariusza. Na przykลad โkiedyโ coล otrzymasz/opublikujesz/umieลcisz, a zrobisz coล innego. |
| Metoda() | Zastฤ p tฤ operacjฤ dowolnฤ operacjฤ CRUD (get/post/put/delete). |
| Nastฤpnie() | Tutaj naleลผy wpisaฤ warunki potwierdzenia i dopasowania. |
Skoro masz juลผ konfiguracjฤ i podstawy skลadni, utwรณrzmy nasz pierwszy prosty test. Nic nie szkodzi, jeลli struktura wydaje Ci siฤ nowa, ale w miarฤ dalszego kodowania i interpretacji kaลผdej linijki, zaลapiesz o co chodzi.
Co przyniesiesz?
Otwรณrz przeglฤ
darkฤ i naciลnij โ https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1. Upewnij siฤ, ลผe widzisz coล jak poniลผej.
Przykลadowa odpowiedลบ API przechwycona przez REST Assured
W przypadku, gdy podczas prรณby uzyskania odpowiedzi na ลผฤ danie w przeglฤ darce pojawi siฤ bลฤ d:
- Sprawdลบ, czy uลผyลeล protokoลu HTTPS czy HTTP. Twoja przeglฤ darka moลผe mieฤ ustawienia blokujฤ ce niebezpieczne witryny.
- Sprawdลบ, czy jakiล serwer proxy lub zapora sieciowa nie blokuje Twojej przeglฤ darce moลผliwoลci otwarcia witryny.
*Note โ nie uลผyลeล tu ลผadnych nagลรณwkรณw, treลci ani pliku cookie. To byลo URL, a Ty pobierasz zawartoลฤ z API, zamiast publikowaฤ lub aktualizowaฤ istniejฤ cฤ zawartoลฤ. To sprawia, ลผe โโjest to wywoลanie GET. Zapamiฤtaj to, aby lepiej zrozumieฤ nasz pierwszy test.
Cel Twojego testu:
Celem skryptu jest wydrukowanie na konsoli IDE tych samych danych wyjลciowych, ktรณre otrzymaลeล w przeglฤ darce za poลrednictwem usลugi Rest Assured.
Zakodujmy to, wykonujฤ c poniลผsze kroki:
Uzyskiwanie treลci odpowiedzi
Krok 1) Utwรณrz klasฤ o nazwie โmyFirstRestAssuredClassโ.
Krok 2) Utwรณrz metodฤ o nazwie โgetResponseBodyโ.
Krok 3) Podobnie do struktury, ktรณrej nauczyลeล siฤ wczeลniej, czyli โgiveโ, โWhenโ, a nastฤpnie wpisz poniลผszy kod:
dany(). -> Nie sฤ wymagane ลผadne nagลรณwki, ลผadne zapytania ani parametry ลcieลผki.
kiedy(). -> Brak okreลlonego ustawienia warunku.
Dostawaฤ('https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1'). -> tylko URL musi zostaฤ dostarczone.
then(). -> Nie sฤ wymagane ลผadne konkretne potwierdzenia.
log(). all() -> Po pobraniu caลej odpowiedzi, zapisz odpowiedลบ, nagลรณwki i zasadniczo wszystko, co ลผฤ danie do Ciebie zwrรณci.
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();
}
Teraz zauwaลผ, ลผe URL uลผyto jest dลugie i mniej czytelne. Przyglฤ dajฤ c siฤ uwaลผnie, zauwaลผysz, ลผe uลผywane sฤ 3 parametry zapytania:
- Identyfikator klienta
- Hasลo
- Nr konta
Rest Assured pomaga nam przekazywaฤ kaลผdฤ czฤลฤ (zapytanie, ลcieลผkฤ, parametr nagลรณwka) osobno, dziฤki czemu kod jest bardziej czytelny i ลatwiejszy w utrzymaniu. Moลผemy rรณwnieลผ parametryzowaฤ dane z pliku zewnฤtrznego, jeลli zajdzie taka potrzeba.
Aby uลผyฤ parametru zapytania, wracamy do naszej definicji skลadni i widzimy, ลผe wszystkie z nich sฤ przekazywane jako czฤลฤ podanego.
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();
}
**Naleลผy pamiฤtaฤ, ลผe uลผyliลmy sลowa โbodyโ zamiast โallโ; pomaga nam to np.tractylko treลฤ odpowiedzi.
Wyjลcie:
Uzyskiwanie kodu stanu odpowiedzi
Nastฤpnฤ metodฤ , ktรณrฤ pokaลผemy, bฤdzie pobranie kodu statusu i umieszczenie potwierdzenia w celu jego sprawdzenia.
Krok 1) Utwรณrz metodฤ o nazwie getResponseStatus().
Krok 2) Uลผyj tej samej struktury ลผฤ dania, co powyลผej. Skopiuj i wklej.
Krok 3) Zamiast rejestrowaฤ, uลผyj 'getStatusCodeWbudowana metoda Rest Assured sลuลผฤ ca do pobierania wartoลci kodu statusu.
Krok 4) Aby potwierdziฤ, ลผe kod statusu wynosi 200, uลผyj sลรณw kluczowych assertThat().statusCode(oczekiwanyCode).
**Notatka - URL jest zmiennฤ uลผywanฤ dla uproszczenia. URL przechowuje caลe ลผฤ danie 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);
}
Wyjลcie:
Potrzeba biznesowa
Jednฤ z podstawowych zasad automatyzacji jest to, ลผe musimy ustawiฤ punkty kontrolne tak, aby test przebiegaล tylko wtedy, gdy zostanฤ speลnione wszystkie wymagane warunki. W testowaniu API najbardziej podstawowฤ walidacjฤ jest sprawdzenie, czy kod statusu ลผฤ dania ma format 2XX.
Peลny kod, jak dotฤ d:
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);
}
}
*Uwaga:
- 200 to odpowiedลบ pomyลlna w tym scenariuszu. Czasami moลผe zaistnieฤ potrzeba niepowodzenia ลผฤ dania, w takim przypadku naleลผy uลผyฤ kodu 4XX lub 5XX. Sprรณbuj zmieniฤ kod statusu, podajฤ c nieprawidลowe parametry i sprawdลบ.
- Kiedy potwierdzimy warunek, na konsoli nie bฤdzie drukowania, chyba ลผe wystฤ pi bลฤ d.
Skrypt pobierajฤ cy rรณลผne czฤลci odpowiedzi
Oprรณcz treลci odpowiedzi i kodu statusu, REST Assured udostฤpnia rรณwnieลผ nagลรณwki, czas odpowiedzi i typ zawartoลci za pomocฤ ลaลcuchowych przykลadรณwtracmetody tor. Sลowo kluczowe โexโtracjest to niezbฤdne do pobrania tych konkretnych czฤลci.
Nagลรณwek
Rest Assured to bardzo prosty jฤzyk, a pobieranie nagลรณwkรณw jest rรณwnie proste. Nazwa metody to headers(). Podobnie jak poprzednio, stworzymy samodzielnฤ metodฤ, aby zrobiฤ to samo.
public static void getResponseHeaders(){
System.out.println("The headers in the response "+
get(url).then().extract()
.headers());
}
Naleลผy pamiฤtaฤ, ลผe pominiฤto tutaj metodฤ โgiven().when()โ, a wiersz kodu rozpoczyna siฤ od metody โget(). Dzieje siฤ tak, poniewaลผ przed wysลaniem ลผฤ dania i otrzymaniem odpowiedzi nie ma ลผadnego warunku wstฤpnego ani weryfikacji. W takich przypadkach uลผycie tej samej metody jest opcjonalne.
wyjลcie:
Potrzeba biznesowa:
Czฤsto konieczne jest uลผycie tokena autoryzacyjnego lub pliku cookie sesji przy kolejnym ลผฤ daniu. Dane te sฤ najczฤลciej zwracane jako nagลรณwki odpowiedzi.
Czas odpowiedzi
Aby uzyskaฤ czas potrzebny na pobranie odpowiedzi z backendu lub innych systemรณw dalszych, Rest Assured udostฤpnia metodฤ o nazwie โtimeInโ z odpowiedniฤ jednostkฤ czasu, aby uzyskaฤ czas potrzebny na zwrรณcenie odpowiedzi.
public static void getResponseTime(){
System.out.println("The time taken to fetch the response "+get(url)
.timeIn(TimeUnit.MILLISECONDS) + " milliseconds");
}
Wyjลcie:
Potrzeba biznesowa:
Bardzo waลผnฤ cechฤ testowania API jest ich czas reakcji, ktรณry mierzy wydajnoลฤ aplikacji. Czas oczekiwania na wywoลanie moลผe byฤ dลuลผszy lub krรณtszy, w zaleลผnoลci od szybkoลci ลฤ cza internetowego, wydajnoลci API w danym momencie, obciฤ ลผenia serwera i innych czynnikรณw wpลywajฤ cych na czas.
Typ zawartoลci
Typ zawartoลci zwrรณconej odpowiedzi moลผna uzyskaฤ za pomocฤ metody โcontentType()โ.
public static void getResponseContentType(){
System.out.println("The content type of response "+
get(url).then().extract()
.contentType());
}
Wydajnoลฤ
Potrzeba biznesowa:
Czasami uzyskanie informacji o typie zawartoลci jest niezbฤdne, aby mieฤ pewnoลฤ, ลผe nie ma luk w zabezpieczeniach umoลผliwiajฤ cych ataki miฤdzydomenowe, a takลผe w celu potwierdzenia, ลผe โโprzekazywana zawartoลฤ jest zgodna ze standardami interfejsu API.
Pobierz indywidualny element JSON
Na podstawie podanej odpowiedzi zostaniesz poproszony o obliczenie kwoty caลkowitej. Musisz pobraฤ kaลผdฤ kwotฤ i jฤ zsumowaฤ.
Kroki:
Krok 1) Pole kwoty znajduje siฤ w tablicy z kluczem โstatementsโ, ktรณra z kolei znajduje siฤ na liลcie z kluczem โresultโ.
Krok 2) Rest Assured udostฤpnia mechanizm umoลผliwiajฤ cy dotarcie do wartoลci w API za pomocฤ โลcieลผkiโ.
Krok 3) ลcieลผka do osiฤ gniฤcia kwot to โresult.statements.AMOUNTโ. Pomyลl o tym jak o XPath w Selenium.
Krok 4) Pobierz wszystkie kwoty z kolekcji, a nastฤpnie przejrzyj wszystkie wartoลci, aby obliczyฤ sumฤ.
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);
}
Uwaga: Poniewaลผ wartoลฤ kwoty jest typem danych ลaลcuchowych, w celu zsumowania konwertujemy jฤ na liczbฤ caลkowitฤ .
Wyjลcie:
Najlepsze praktyki w zakresie automatyzacji testรณw REST Assured
Po zrozumieniu podstaw, stosowanie zdyscyplinowanych wzorcรณw zapewni niezawodnoลฤ pakietu w miarฤ rozwoju interfejsu API. Poniลผsze praktyki pomogฤ zespoลom uniknฤ ฤ niestabilnych testรณw i narzutu na konserwacjฤ.
- Centralizacja bazy URL: Przechowuj podstawowy identyfikator URI i tokeny uwierzytelniajฤ ce w jednej klasie konfiguracyjnej lub pliku wลaลciwoลci. Pozwala to uniknฤ ฤ duplikacji i uproลciฤ przeลฤ czanie ลrodowisk.
- Uลผyj specyfikacji ลผฤ daล i odpowiedzi: Twรณrz obiekty RequestSpecBuilder i ResponseSpecBuilder wielokrotnego uลผytku. Zmniejszajฤ one liczbฤ szablonรณw, gdy wiele testรณw ma wspรณlne nagลรณwki lub asercje.
- Sprawdลบ poprawnoลฤ schematu JSON: Poลฤ cz REST Assured z moduลem json-schema-validator, aby potwierdziฤ zgodnoลฤtracintegralnoลci. Sprawdzanie schematu wychwytuje zmiany powodujฤ ce przerwanie dziaลania systemu, zanim dotrฤ one do odbiorcรณw koลcowych.
- Eksternalizacja danych testowych: Przechowuj ลadunki w plikach JSON lub korzystaj z dostawcรณw danych z TestNGZakodowane na staลe dane szybko stajฤ siฤ nieaktualne.
- Uruchom niezaleลผne testy: Kaลผdy test powinien konfigurowaฤ i usuwaฤ wลasne dane. Zestawy zaleลผne od kolejnoลci zawodzฤ w sposรณb nieprzewidywalny podczas rรณwnolegลych uruchomieล CI.
- Selektywne przechwytywanie dziennikรณw: Uลผywaj log().ifError() w pakietach stabilnych i log().all() podczas debugowania. Szczegรณลowe logowanie spowalnia procesy CI i ukrywa rzeczywiste problemy.
- Podลฤ cz do CI/CD: Uruchom pakiety REST Assured za pomocฤ Maven Surefire lub Failsafe w Jenkins, GitHub Actions lub GitLab. Przeprowadzaj testy dymowe przy kaลผdym zatwierdzeniu i peลnฤ regresjฤ w nocy.
Wczesne przyjฤcie tych nawykรณw sprawia, ลผe โโautomatyzacja API staje siฤ atutem dลugoterminowym, a nie kruchym wฤ skim gardลem.


