Vodič za REST-osiguran

Jackson Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Uvod

REST-assured dizajniran je za pojednostavljivanje testiranja i provjere valjanosti REST API-ja, a na njega jako utječu tehnike testiranja koje se koriste u dinamičkim jezicima kao što su Ruby i Groovy.

Biblioteka ima solidnu podršku za HTTP, počevši, naravno, od glagola i standardnih HTTP operacija, ali također i dalje od ovih osnova.

U ovom ćemo vodiču istražujte uvjereni u ODMOR a mi ćemo iskoristiti Hamcrest za tvrdnju. Ako vam Hamcrest već nije poznat, prvo trebate pripremiti tutorial: Testiranje s Hamcrestom.

Također, da biste saznali više o naprednijim slučajevima upotrebe REST-assured, pogledajte naše ostale članke:

  • ODMAH osigurano s Groovyjem
  • JSON provjera sheme uz REST-osigurano
  • Parametri, zaglavlja i kolačići s REST-ovjerom

Sada zaronimo na jednostavnom primjeru.

2. Jednostavan primjer primjera

Prije nego započnemo, pobrinimo se da naši testovi imaju sljedeći statički uvoz:

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

To će nam trebati kako bi testovi bili jednostavni i imali lak pristup glavnim API-ima.

Sada, krenimo sa jednostavnim primjerom - osnovnim sustavom klađenja koji izlaže neke podatke za igre:

{"id": "390", "data": {"leagueId": 35, "homeTeam": "Norway", "visitTeam": "England",}, "tečajevi": [{"price": "1.30 "," name ":" 1 "}, {" price ":" 5.25 "," name ":" X "}]}

Recimo da je ovo JSON-ov odgovor zbog pogađanja lokalno raspoređenog API-ja - // localhost: 8080 / events? id = 390. :

Upotrijebimo sada REST-assured da provjerimo neke zanimljive značajke odgovora JSON:

@Test javna praznina givenUrl_whenSuccessOnGetsResponseAndJsonHasRequiredKV_thenCorrect () {get ("/ events? Id = 390"). Then (). StatusCode (200) .assertThat () .body ("data.leagueId", jednakTo (35)); }

Dakle, ono što smo ovdje učinili je - potvrdili smo da je upućen poziv krajnjoj točki / događaji? id = 390 odgovara tijelom koje sadrži a JSON niz čija ligaId od podaci objekt je 35.

Pogledajmo zanimljiviji primjer. Recimo da želite provjeriti je li izgledi niz ima zapise s cijenama 1.30 i 5.25:

@Test javna praznina givenUrl_whenJsonResponseHasArrayWithGivenValuesUnderKey_thenCorrect () {get ("/ events? Id = 390"). Then (). AssertThat () .body ("odds.price", hasItems ("1.30", "5.25")); }

3. Postavljanje s REST-osiguranjem

Ako je vaš omiljeni alat za ovisnost Maven, dodamo sljedeću ovisnost u pom.xml datoteka:

 io.uvjereni rest-assured 3.3.0 test 

Da biste dobili najnoviju verziju, slijedite ovaj link.

REST-assured koristi snagu Hamcrest utakmica za izvršavanje svojih tvrdnji, tako da moramo uključiti i tu ovisnost:

 org.hamcrest hamcrest-svi 2.1 

Najnovija verzija uvijek će biti dostupna na ovoj poveznici.

4. Anonimna JSON provjera korijena

Razmotrimo niz koji se sastoji od primitiva, a ne od objekata:

[1, 2, 3]

To se naziva anonimni JSON korijen, što znači da nema par ključ / vrijednost, unatoč tome što su i dalje valjani JSON podaci.

U takvom scenariju možemo pokrenuti provjeru valjanosti pomoću $ simbol ili prazan niz ("") kao put. Pretpostavimo da gornju uslugu izlažemo putem // localhost: 8080 / json onda to možemo potvrditi ovako s REST-assured:

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

ili ovako:

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

5. Plutajuće i dvostruke

Kada počnemo koristiti REST-assured za testiranje naših REST usluga, moramo shvatiti da se brojevi s pomičnim zarezom u JSON odgovorima preslikavaju na primitivni tip plutati.

Korištenje plutati vrsta nije zamjenjiva sa dvostruko kao što je slučaj za mnoge scenarije u javi.

Slučaj je sljedeći odgovor:

{"neparno": {"cijena": "1,30", "ck": 12,2, "ime": "1"}}

pretpostavimo da izvodimo sljedeći test vrijednosti ck:

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

Ovaj test neće uspjeti čak i ako je vrijednost koju testiramo jednaka vrijednosti u odgovoru. To je zato što uspoređujemo s dvostruko nego na a plutati.

Da bismo uspjeli, moramo izričito odrediti operand za jednak metoda podudaranja kao a plutati, ovako:

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

6. Određivanje metode zahtjeva

Tipično bismo zahtjev izvršili pozivanjem metode kao što je dobiti(), što odgovara metodi zahtjeva koju želimo koristiti.

U Dodatku, možemo odrediti i HTTP glagol pomoću zahtjev() metoda:

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

Gornji je primjer ekvivalentan korištenju dobiti() direktno.

Slično tome, možemo poslati GLAVA, SPOJITI i OPCIJE zahtjevi:

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

OBJAVI zahtjev također slijedi sličnu sintaksu i to možemo odrediti tijelo pomoću s() i tijelo() metode.

Stoga, za stvaranje novog Neparan slanjem a OBJAVI zahtjev:

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

The Neparan objekt poslan kao tijelo automatski će se pretvoriti u JSON. Također možemo proći bilo koji Niz koje želimo poslati kao svoje OBJAVItijelo.

7. Konfiguracija zadanih vrijednosti

Za testove možemo konfigurirati puno zadanih vrijednosti:

@Prije javnog void postavljanja () {RestAssured.baseURI = "//api.github.com"; RestAssured.port = 443; }

Ovdje postavljamo osnovni URI i port za naše zahtjeve. Osim toga, možemo također konfigurirati osnovnu putanju, root pat i autentifikaciju.

Napomena: Također se možemo vratiti na standardne zadane vrijednosti s REST-om koristeći:

RestAssured.reset ();

8. Izmjerite vrijeme odziva

Da vidimo kako možemo izmjerite vrijeme odziva pomoću vrijeme() i timeIn () metode Odgovor objekt:

@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); }

Imajte na umu da:

  • vrijeme() koristi se za dobivanje vremena odziva u milisekundama
  • timeIn () koristi se za dobivanje vremena odziva u navedenoj vremenskoj jedinici

8.1. Potvrdite vrijeme odziva

Također možemo potvrditi vrijeme odziva - u milisekundama - uz pomoć jednostavnog dugoPodudaranje:

@Test javna praznina whenValidateResponseTime_thenSuccess () {when (). Get ("/ users / eugenp"). Then (). Time (lessThan (5000L)); }

Ako želimo provjeriti vrijeme odziva u drugoj vremenskoj jedinici, tada ćemo upotrijebiti vrijeme() meč sa sekundom TimeUnit parametar:

@Test public void whenValidateResponseTimeInSeconds_thenSuccess () {when (). Get ("/ users / eugenp"). Then (). Time (lessThan (5L), TimeUnit.SECONDS); }

9. Provjera XML odgovora

Ne samo da može potvrditi JSON odgovor, već može provjeriti i XML.

Pretpostavimo da podnesemo zahtjev za // localhost: 8080 / zaposlenici i dobivamo sljedeći odgovor:

  Jane Daisy f 

Možemo provjeriti je li ime je Jane ovako:

@Test javna praznina givenUrl_whenXmlResponseValueTestsEqual_thenCorrect () {post ("/ zaposlenici"). Then (). AssertThat () .body ("staff.employee.first-name", jednakTo ("Jane")); }

Također možemo provjeriti podudaraju li se sve vrijednosti s našim očekivanim ujedinjavanjem tjelesnih podudaranja na sljedeći način:

@Test javna praznina givenUrl_whenMultipleXmlValuesTestEqual_thenCorrect () {post ("/ zaposlenici"). Then (). AssertThat () .body ("staff.employee.first-name", jednakTo ("Jane")) .body ("zaposlenici.employee .last-name ", jednakTo (" Daisy ")) .body (" zaposlenici.employee.sex ", jednakTo (" f ")); }

Ili pomoću skraćene verzije s varijabilnim argumentima:

@Test public void givenUrl_whenMultipleXmlValuesTestEqualInShortHand_thenCorrect () {post ("/ zaposlenici"). Then (). AssertThat (). Body ("zaposlenici.employee.first-name", jednakTo ("Jane"), "zaposlenici.employee.last ime ", jednakTo (" Daisy ")," zaposlenici.employee.sex ", jednakTo (" f ")); }

10. XPath za XML

Također možemo provjeriti svoje odgovore pomoću XPath-a. Razmotrite primjer u nastavku koji izvršava podudaranje na ime:

@Test javna praznina givenUrl_whenValidatesXmlUsingXpath_thenCorrect () {post ("/ zaposlenici"). Then (). AssertThat (). body (hasXPath ("/ zaposlenici / zaposlenik / ime", sadržiString ("Ja"))); }

XPath također prihvaća zamjenski način pokretanja jednak podudaranje:

@Test public void givenUrl_whenValidatesXmlUsingXpath2_thenCorrect () {post ("/ zaposlenici"). Then (). AssertThat () .body (hasXPath ("/ zaposlenici / zaposlenik / ime [tekst () = 'Jane']"))); }

11. Pojedinosti testa bilježenja

11.1. Pojedinosti zahtjeva za zapisnik

Prvo, da vidimo kako zapisujte sve detalje zahtjeva pomoću log (). sve ():

@Test public void whenLogRequest_thenOK () {given (). Log (). All () .when (). Get ("/ users / eugenp"). Then (). StatusCode (200); }

Ovo će zabilježiti otprilike ovako:

Način zahtjeva: GET URI zahtjeva: //api.github.com:443/users/eugenp Proxy: Parametri zahtjeva: Parametri upita: Parametri obrasca: Parametri puta: Više dijelova: Zaglavlja: Prihvaćam = * / * Kolačići: Tijelo: 

Za prijavu samo određenih dijelova zahtjeva imamo zapisnik () metoda u kombinaciji s params (), body (), headers (), cookies (), method (), path () npr log. (). params ().

Imajte na umu da druge korištene knjižnice ili filtri mogu promijeniti ono što se stvarno šalje na poslužitelj, pa bi se to trebalo koristiti samo za bilježenje početne specifikacije zahtjeva.

11.2. Pojedinosti odgovora dnevnika

Slično tome, možemo evidentirati detalje odgovora.

U sljedećem primjeru bilježimo samo tijelo odgovora:

@Test public void whenLogResponse_thenOK () {when (). Get ("/ repos / eugenp / tutorials"). Then (). Log (). Body (). StatusCode (200); }

Uzorak izlaza:

{"id": 9754983, "name": "tutoriali", "full_name": "eugenp / tutorials", "private": false, "html_url": "//github.com/eugenp/tutorials", "description" : "Tečaj \" ODMOR s proljećem \ ":", "fork": false, "size": 72371, "license": {"key": "mit", "name": "MIT License", "spdx_id ":" MIT "," url ":" //api.github.com/licenses/mit "}, ...}

11.3. Zabilježite odgovor ako je došlo do stanja

Također imamo mogućnost bilježenja odgovora samo ako se dogodila pogreška ili statusni kod odgovara zadanoj vrijednosti:

@Test javna 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 (većaTan (200)); }

11.4. Zabilježite ako provjera valjanosti nije uspjela

Također možemo evidentirati i zahtjev i odgovor samo ako naša provjera valjanosti nije uspjela:

@Test public void whenLogOnlyIfValidationFailed_thenSuccess () {when (). Get ("/ users / eugenp"). Then (). Log (). IfValidationFails (). StatusCode (200); given (). log (). ifValidationFails () .when (). get ("/ users / eugenp"). then (). statusCode (200); }

U ovom primjeru želimo provjeriti je li statusni kôd 200. Samo ako to ne uspije, zahtjev i odgovor zabilježit će se.

12. Zaključak

U ovom uputstvu imamo istražio REST-osigurani okvir i pogledali njegove najvažnije značajke koje možemo koristiti za testiranje naših RESTful usluga i provjeru njihovih odgovora.

Potpuna implementacija svih ovih primjera i isječaka koda može se naći u projektu GitHub s REST-om.

Jackson dno

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ