Skúmanie testovacieho rámca pre Jersey

1. Prehľad

V tomto výučbe sa pozrieme na Jersey Test Framework a uvidíme, ako ho môžeme použiť na rýchle napísanie integračných testov.

Ako sme už videli v predchádzajúcich článkoch, Jersey je rámec otvoreného zdroja pre vývoj webových služieb RESTful. Viac sa o Jersey dozvieme v našom úvode k článku o vytváraní API s Jersey a jar - tu.

2. Nastavenie aplikácie

Jersey Test Framework je nástroj, ktorý nám pomáha overiť správnu implementáciu našich komponentov na strane servera. Ako uvidíme neskôr, poskytuje rýchly a bezproblémový spôsob zápisu integračných testov a veľmi dobre zvláda komunikáciu s našimi HTTP API.

Rovnako to funguje takmer okamžite a je ľahké sa integrovať do našich projektov založených na Maven. Rámec je primárne založený na JUnit, aj keď je možné ho použiť aj s TestNG, vďaka čomu je použiteľný takmer vo všetkých prostrediach.

V ďalšej časti uvidíme, ktoré závislosti musíme do našej aplikácie pridať, aby sme mohli rámec používať.

2.1. Maven závislosti

Najskôr pridajme k našej základnej závislosti Jersey Test Framework pom.xml:

 org.glassfish.jersey.test-framework dres-test-framework-core 2,27 test 

Ako vždy môžeme získať najnovšiu verziu z Maven Central.

Takmer takmer všetky testy v Jersey používajú továreň na testovacie kontajnery defacto Grizzly, ktorú tiež budeme musieť doplniť:

 org.glassfish.jersey.test-framework.providers Jersey-test-framework-provider-grizzly2 2,27 test 

Najnovšiu verziu opäť nájdeme v Maven Central.

3. Začíname

V tejto ďalšej časti sa budeme venovať základným krokom potrebným na napísanie jednoduchého testu.

Začneme testovaním jednoduchých Zdravím vás zdroj na našom serveri:

@Path ("/ greetings") public class Greetings {@GET @Path ("/ hi") public String getHiGreeting () {return "hi"; }} 

3.1. Konfigurácia testu

Teraz definujme našu testovaciu triedu:

verejná trieda GreetingsResourceIntegrationTest rozširuje JerseyTest {@Override chránená Aplikácia configure () {vrátiť nový ResourceConfig (Greetings.class); } // ...} 

Na vyššie uvedenom príklade vidíme, že na vývoj testu pomocou Jersey Test Framework je potrebné náš test podtriedy JerseyTest.

Ďalej prepíšeme konfigurovať metóda, ktorá vráti vlastnú konfiguráciu prostriedkov pre náš test a obsahuje iba Zdravím vás zdroj. Toto je samozrejme zdroj, ktorý chceme vyskúšať.

3.2. Písanie nášho prvého testu

Začnime testovaním jednoduchej žiadosti GET z nášho pozdravu API:

@Test public void givenGetHiGreeting_whenCorrectRequest_thenResponseIsOkAndContainsHi () {Response response = target ("/ greetings / hi"). Request () .get (); assertEquals ("Http odpoveď by mala byť 200:", Status.OK.getStatusCode (), response.getStatus ()); assertEquals ("Http Content-Type by měl být:", MediaType.TEXT_HTML, response.getHeaderString (HttpHeaders.CONTENT_TYPE)); Obsah reťazca = response.readEntity (String.class); assertEquals ("Obsah odpovede je:", "ahoj", obsah); } 

Všimnite si, že máme plný prístup k odpovedi HTTP - takže môžeme robiť napríklad kontrolu stavového kódu, aby sme sa ubezpečili, že operácia bola skutočne úspešná, alebo pracovať so skutočným textom odpovede.

Vysvetlíme si podrobnejšie, čo robíme vo vyššie uvedenom príklade:

  1. Pošlite požiadavku HTTP GET na adresu „/ greetings / hi“
  2. Skontrolujte stavový kód HTTP a hlavičky odpovedí typu obsahu
  3. Test obsah odpovede obsahuje reťazec „ahoj“

4. Testovanie GET na získanie zdrojov

Teraz, keď sme videli základné kroky spojené s vytváraním testov. Poďme otestovať jednoduché rozhranie Fruit API, ktoré sme predstavili vo vynikajúcom článku o podpore pre MVC v Jersey.

4.1. Získajte obyčajný JSON

V nasledujúcom príklade pracujeme s telom odpovede ako so štandardným reťazcom JSON:

@Test public void givenFruitExists_whenSearching_thenResponseContainsFruit () {final String json = target ("fruit / search / strawberry"). Request () .get (String.class); assertThat (json, containsString ("{\" name \ ": \" jahoda \ ", \" váha \ ": 20}")); }

4.2. Získajte entitu namiesto JSON

Odpoveď môžeme tiež namapovať priamo do triedy entity Resource - napríklad:

 @Test public void givenFruitExists_whenSearching_thenResponseContainsFruitEntity () {final Fruit entity = target ("fruit / search / strawberry"). Request () .get (Fruit.class); assertEquals ("Názov ovocia:", "jahoda", entity.getName ()); assertEquals ("Hmotnosť ovocia:", Integer.valueOf (20), entity.getWeight ()); }

Tentokrát špecifikujeme typ Java, na ktorý sa entita odpovede prevedie v dostať metóda - a Ovocie objekt.

5. Testovanie POST na vytvorenie zdrojov

Aby sme v našom API vytvorili nový zdroj - budeme dobre využívať POST požiadavky. V ďalšej časti uvidíme, ako otestovať túto časť nášho API.

5.1. Post Plain JSON

Začnime zverejnením obyčajného reťazca JSON, ktorý otestuje vytvorenie nového zdroja ovocia:

@Test public void givenCreateFruit_whenJsonIsCorrect_thenResponseCodeIsCreated () {Response response = target ("fruit / created"). Request () .post (Entity.json ("{\" name \ ": \" jahoda \ ", \" váha \ ": 20} ")); assertEquals ("Http odpoveď by mala byť 201", Status.CREATED.getStatusCode (), response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("Ovocie uložené: Ovocie [názov: jahodová farba: null]"))); }

Vo vyššie uvedenom príklade používame príspevok metóda, ktorá vyžaduje Subjekt parameter objektu. Používame pohodlné json metóda na vytvorenie entity z príslušného reťazca JSON.

5.2. Zadajte entitu namiesto JSON

Ako sme už videli pri požiadavkách na získanie, môžeme priamo uverejniť aj triedu entity Resource - napríklad:

@Test public void givenCreateFruit_whenFruitIsInvalid_thenResponseCodeIsBadRequest () {Fruit fruit = new Fruit ("Blueberry", "purple"); ovocie.setHmotnosť (1); Odozva response = target ("ovocie / vytvorenie"). Request (MediaType.APPLICATION_JSON_TYPE) .post (Entity.entity (ovocie, MediaType.APPLICATION_JSON_TYPE)); assertEquals ("Http odpoveď by mala byť 400", 400, response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("Hmotnosť ovocia musí byť 10 alebo vyššia")); }

Tentokrát používame subjekt metóda na zverejnenie našej ovocnej entity a tiež zadajte typ média ako JSON.

5.3. Formulárové príspevky pomocou POST

V našom poslednom príklade príspevku uvidíme, ako otestovať odoslanie formulára prostredníctvom žiadosti o príspevok:

@Test public void givenCreateFruit_whenFormContainsNullParam_thenResponseCodeIsBadRequest () {Formulár formulára = nový Form (); form.param ("meno", "jablko"); form.param ("farba", null); Odozva response = target ("ovocie / vytvorenie"). Request (MediaType.APPLICATION_FORM_URLENCODED) .post (Entity.form (form)); assertEquals ("Http odpoveď by mala byť 400", 400, response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("Farba ovocia nesmie byť nulová")); }

Podobne využívame Subjekt triedy, ale tentokrát na našu žiadosť o príspevok odovzdáme formulár, ktorý obsahuje množstvo parametrov.

6. Testovanie ďalších slovies HTTP

Niekedy musíme otestovať ďalšie koncové body HTTP, ako sú PUT a DELETE. To je samozrejme úplne možné pomocou Jersey Test Framework.

Pozrime sa na jednoduchý príklad PUT:

@Test public void givenUpdateFruit_whenFormContainsBadSerialParam_thenResponseCodeIsBadRequest () {Formulár formulár = nový Form (); form.param ("serial", "2345-2345"); Odozva response = target ("ovocie / aktualizácia"). Request (MediaType.APPLICATION_FORM_URLENCODED) .put (Entity.form (formulár)); assertEquals ("Http odpoveď by mala byť 400", 400, response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("sériové číslo ovocia nie je platné")); }

Akonáhle sme zavolali žiadosť metódu môžeme vyvolať ľubovoľnú metódu HTTP na aktuálnom objekte požiadavky.

7. Ďalšie funkcie

Testovací rámec Jersey obsahuje množstvo ďalších konfiguračných vlastností, ktoré môžu pomôcť pri ladení a testovaní.

V nasledujúcom príklade uvidíme, ako programovo povoliť funkciu s daným menom:

verejná trieda FruitResourceIntegrationTest rozširuje JerseyTest {@Override chránená aplikácia configure () {enable (TestProperties.LOG_TRAFFIC); povoliť (TestProperties.DUMP_ENTITY); // ...

Keď vytvoríme a nakonfigurujeme našu testovanú aplikáciu Jersey. Môžeme povoliť aj ďalšie vlastnosti. V takom prípade povoľujeme dve vlastnosti protokolovania - LOG_TRAFFIC a DUMP_ENTITYktoré poskytnú ďalšie užitočné informácie o protokolovaní a ladení počas testovacích behov.

8. Podporované kontajnery

Ako sme už spomenuli, defacto kontajner používaný pri písaní testov pomocou Jersey Test Framework je Grizzly. Podporovaných je však množstvo ďalších kontajnerov:

  • Kontajner v pamäti
  • HttpServer od spoločnosti Oracle JDK
  • Jednoduchý kontajner (org.simpleframework.http
  • Mólový kontajner (org.eclipse.jetty)

Ďalšie informácie o konfigurácii týchto kontajnerov nájdete v dokumentácii tu.

9. Záver

Ak to zhrnieme, v tomto tutoriáli sme preskúmali rámec Jersey Test Framework. Najprv sme začali predstavením toho, ako nakonfigurovať Jersey Test Framework, a potom sme videli, ako napísať test pre veľmi jednoduché API.

V ďalšej časti sme videli, ako napísať testy pre rôzne koncové body GET a POST API. Nakoniec sme sa pozreli na niektoré ďalšie funkcie a kontajnery, ktoré podporuje Jersey Test Framework.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


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