Sprievodca istotou REST

Jackson Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Úvod

Program REST-assured bol navrhnutý s cieľom zjednodušiť testovanie a validáciu rozhraní REST API a je vysoko ovplyvnený testovacími technikami používanými v dynamických jazykoch, ako sú Ruby a Groovy.

Knižnica má pevnú podporu protokolu HTTP, samozrejme od slovies a štandardných operácií HTTP, ale ide aj nad rámec týchto základov.

V tejto príručke sa chystáme preskúmajte REST-istotu a na tvrdenie použijeme Hamcrest. Ak ešte nemáte skúsenosti s Hamcrestom, mali by ste si najskôr prečítať návod: Testovanie s Hamcrestom.

Ak sa chcete dozvedieť viac informácií o prípadoch pokročilejšieho použitia zaistenia REST, pozrite si naše ďalšie články:

  • S odpočinkom zaistený Groovy
  • Overenie schémy JSON so zaistením REST
  • Parametre, hlavičky a cookies s istotou REST

Poďme sa teraz venovať jednoduchému príkladu.

2. Jednoduchý príkladný test

Než začneme, zabezpečme, aby naše testy mali nasledujúce statické importy:

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

Budeme to potrebovať, aby boli testy jednoduché a aby sme mali ľahký prístup k hlavným rozhraniam API.

Poďme teraz na jednoduchý príklad - základný systém stávkovania, ktorý odhaľuje niektoré údaje pre hry:

{"id": "390", "data": {"leagueId": 35, "homeTeam": "Nórsko", "visitTeam": "Anglicko",}, "odds": [{"price": "1,30 "," name ":" 1 "}, {" price ":" 5.25 "," name ":" X "}]}}

Povedzme, že toto je odpoveď JSON od zasiahnutia lokálne nasadeného API - // localhost: 8080 / events? id = 390. :

Poďme si teraz pomocou nástroja REST-assured overiť niektoré zaujímavé vlastnosti súboru JSON odpovede:

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

To, čo sme tu urobili, je - overili sme si, že ide o koncový bod / events? id = 390 reaguje telom obsahujúcim a Reťazec JSON ktorého ligaId z údaje objekt je 35.

Pozrime sa na zaujímavejší príklad. Povedzme, že by ste chceli overiť, či šanca pole má záznamy s cenami 1.30 a 5.25:

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

3. Inštalácia zaistená REST

Ak je váš obľúbený nástroj pre závislosť Maven, pridáme do súboru nasledujúcu závislosť pom.xml spis:

 io. odpočinok zaistený odpočinok 3.3.0 test 

Najnovšiu verziu získate kliknutím na tento odkaz.

REST-assured využíva silu Hamcrestových dohadzovačov na vykonávanie svojich tvrdení, takže musíme zahrnúť aj túto závislosť:

 org.hamcrest hamcrest-všetci 2.1 

Najnovšia verzia bude vždy k dispozícii na tomto odkaze.

4. Anonymné overenie koreňov JSON

Zvážte pole, ktoré obsahuje skôr primitívy ako objekty:

[1, 2, 3]

Toto sa nazýva anonymný koreň JSON, čo znamená, že nemá žiadny pár kľúč - hodnota, napriek tomu sú to stále platné údaje JSON.

V takomto scenári môžeme spustiť validáciu pomocou $ symbol alebo prázdny reťazec („“) ako cestu. Predpokladajme, že vyššie uvedenú službu vystavíme prostredníctvom // localhost: 8080 / json potom to môžeme takto potvrdiť pomocou zaistenia REST:

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

alebo takto:

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

5. Plaváky a štvorhra

Keď začneme testovať naše služby REST so zaistením REST, musíme pochopiť, že čísla s pohyblivou rádovou čiarkou v odpovediach JSON sú mapované na primitívny typ plavák.

Použitie plavák typ nie je zameniteľný s dvojitý ako je to v prípade mnohých scenárov v Jave.

Príkladom je táto odpoveď:

{"odd": {"price": "1.30", "ck": 12.2, "name": "1"}}

predpokladajme, že spúšťame nasledujúci test hodnoty ck:

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

Tento test zlyhá, aj keď sa hodnota, ktorú testujeme, rovná hodnote v odpovedi. Je to tak preto, lebo porovnávame s a dvojitý skôr ako do a plavák.

Aby to fungovalo, musíme explicitne špecifikovať operand na rovná metóda porovnávania ako a plavák, ako:

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

6. Zadanie metódy požiadavky

Spravidla by sme vykonali požiadavku zavolaním metódy ako napr get (), zodpovedajúce metóde požiadavky, ktorú chceme použiť.

Navyše, môžeme tiež určiť HTTP sloveso pomocou požiadavka () metóda:

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

Vyššie uvedený príklad je ekvivalentný použitiu dostať () priamo.

Podobne môžeme poslať HLAVA, PRIPOJIŤ a MOŽNOSTI žiadosti:

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

POST požiadavka tiež sleduje podobnú syntax a môžeme ju určiť telo pomocou s () a telo () metódy.

Preto vytvoriť nový Zvláštny zaslaním a POST požiadavka:

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

The Zvláštny objekt odoslaný ako telo sa automaticky prevedie na JSON. Môžeme prejsť aj akýmkoľvek String ktoré chceme poslať ako naše POSTtelo.

7. Konfigurácia predvolených hodnôt

Pre testy môžeme nakonfigurovať veľa predvolených hodnôt:

@ Pred nastavením verejnej neplatnosti () {RestAssured.baseURI = "//api.github.com"; RestAssured.port = 443; }

Tu nastavujeme základné URI a port pre naše požiadavky. Okrem nich môžeme tiež nakonfigurovať základnú cestu, root pat a autentifikáciu.

Poznámka: Na štandardné predvolené nastavenia REST môžeme tiež resetovať pomocou:

RestAssured.reset ();

8. Zmerajte čas odozvy

Pozrime sa, ako môžeme zmerajte čas odozvy pomocou čas () a timeIn () metódy Odozva 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); }

Poznač si to:

  • čas () sa používa na získanie času odozvy v milisekundách
  • timeIn () sa používa na získanie času odozvy v zadanej časovej jednotke

8.1. Overiť čas odozvy

Môžeme tiež overiť čas odozvy - v milisekundách - pomocou jednoduchých dlhoMatcher:

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

Ak chceme overiť čas odozvy v inej časovej jednotke, použijeme čas () dohadzovač s sekundou TimeUnit parameter:

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

9. Overenie XML odpovede

Nielen, že dokáže overiť odpoveď JSON, ale aj XML.

Predpokladajme, že predložíme žiadosť // localhost: 8080 / zamestnancov a dostaneme nasledujúcu odpoveď:

  Jane Daisy f 

Môžeme overiť, či krstné meno je Jane ako:

@Test public void givenUrl_whenXmlResponseValueTestsEqual_thenCorrect () {post ("/ zamestnanci"). Potom (). AssertThat () .body ("zamestnanci.employee.first-name", sameTo ("Jane")); }

Môžeme tiež overiť, či sa všetky hodnoty zhodujú s našimi očakávanými hodnotami, a to tak, že zreťazíme reťazce zhody tela takto:

@Test public void givenUrl_whenMultipleXmlValuesTestEqual_thenCorrect () {post ("/ Zamestnanci"). Potom (). AssertThat () .body ("Zamestnanci.employee.first-name", RovnýTo ("Jane")) .body ("Zamestnanci.Pracovník" .last-name ", equalTo (" Daisy ")) .body (" Zamestnanci.employee.sex ", EqualTo (" f ")); }

Alebo pomocou skratkovej verzie s variabilnými argumentmi:

@Test public void givenUrl_whenMultipleXmlValuesTestEqualInShortHand_thenCorrect () {post ("/ Zamestnanci") .then (). name ", equalTo (" Daisy ")," zamestnanci.employee.sex ", equalTo (" f ")); }

10. XPath pre XML

Naše odpovede tiež môžeme overiť pomocou protokolu XPath. Zvážte príklad uvedený nižšie, ktorý vykoná porovnávač na krstné meno:

@Test public void givenUrl_whenValidatesXmlUsingXpath_thenCorrect () {príspevok ("/ zamestnanci"). Potom (). AssertThat (). telo (hasXPath ("/ zamestnanci / zamestnanec / krstne meno", obsahujeString ("Ja"))); }

XPath akceptuje aj alternatívny spôsob spustenia rovná dohadzovač:

@Test public void givenUrl_whenValidatesXmlUsingXpath2_thenCorrect () {príspevok ("/ zamestnanci"). Potom (). AssertThat () .body (hasXPath ("/ zamestnanci / zamestnanec / krstne meno [text () = 'Jane']"))); }

11. Detaily testu protokolovania

11.1. Podrobnosti žiadosti o denník

Najprv sa pozrime, ako na to zaznamenať celé podrobnosti žiadosti pomocou log (). všetko ():

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

Týmto sa zaznamená niečo také:

Metóda požiadavky: GET Identifikátor požiadavky: //api.github.com:443/users/eugenp Proxy: Parametre požiadavky: Parametre dotazu: Parametre formulára: Parametre cesty: Viacdielne: Hlavičky: Prijať = * / * Cookies: Text: 

Na zaznamenanie iba konkrétnych častí žiadosti máme: denník () metóda v kombinácii s parametre (), body (), hlavičky (), cookies (), metóda (), cesta () napr log. (). params ().

Upozorňujeme, že iné použité knižnice alebo filtre môžu meniť to, čo sa skutočne odosiela na server, takže toto by sa malo použiť iba na zaznamenanie špecifikácie počiatočnej požiadavky.

11.2. Podrobnosti odpovede protokolu

Podobne môžeme zaznamenať podrobnosti odpovede.

V nasledujúcom príklade zaznamenávame iba telo odpovede:

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

Ukážka výstupu:

{"id": 9754983, "name": "tutorials", "full_name": "eugenp / tutorials", "private": false, "html_url": "//github.com/eugenp/tutorials", "description" : "The \" REST With Spring \ "Course:", "fork": false, "size": 72371, "license": {"key": "mit", "name": "MIT License", "spdx_id ":" MIT "," url ":" //api.github.com/licenses/mit "}, ...}

11.3. Odozva protokolu, ak nastala podmienka

Máme tiež možnosť zaznamenať odpoveď iba v prípade, že sa vyskytla chyba alebo sa stavový kód zhoduje s danou hodnotou:

@ Test public 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 (greaterThan (200)); }

11.4. Zaznamenajte, ak overenie zlyhalo

Môžeme tiež prihlásiť požiadavku aj odpoveď, iba ak zlyhala naša validácia:

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

V tomto príklade chceme overiť, že stavový kód je 200. Iba ak sa to nepodarí, požiadavka a odpoveď sa zaprotokoluje.

12. Záver

V tejto príručke máme preskúmali REST-zaistený rámec a pozrel sa na jeho najdôležitejšie funkcie, ktoré môžeme použiť na otestovanie našich služieb RESTful a overenie ich odpovedí.

Plnú implementáciu všetkých týchto príkladov a útržkov kódu nájdete v projekte GitHub so zárukou REST.

Jackson spodok

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

$config[zx-auto] not found$config[zx-overlay] not found