Istraživanje okvira za test Jerseyja

1. Pregled

U ovom uputstvu ćemo pogledati okvir za test Jerseyja i vidjeti kako ga možemo koristiti za brzo pisanje integracijskih testova.

Kao što smo već vidjeli u prethodnim člancima, Jersey je okvir otvorenog koda za razvoj RESTful web usluga. Više o Jerseyu možemo saznati u našem uvodu u stvaranje API-ja s člankom Jersey i Spring - ovdje.

2. Postavljanje aplikacije

Okvir za testiranje Jerseyja alat je koji nam pomaže provjeriti ispravnu implementaciju komponenata na strani poslužitelja. Kao što ćemo vidjeti kasnije, pruža brz i nesmetan način za pisanje integracijskih testova i može se vrlo dobro nositi s komunikacijom s našim HTTP API-ima.

Isto tako, to funkcionira gotovo odmah i lako ga je integrirati s našim projektima temeljenim na Mavenu. Okvir se prvenstveno temelji na JUnit-u, iako ga je moguće koristiti i s TestNG-om, što ga čini upotrebljivim u gotovo svim okruženjima.

U sljedećem ćemo odjeljku vidjeti koje ovisnosti moramo dodati svojoj aplikaciji da bismo koristili okvir.

2.1. Ovisnosti Mavena

Prije svega, dodajmo ovisnost jezgre Jersey Test Framework-a našoj pom.xml:

 org.glassfish.jersey.test-framework jersey-test-framework-core 2.27 test 

Kao i uvijek, najnoviju verziju možemo dobiti od Maven Central.

Gotovo gotovo svi testovi u Jerseyju koriste tvornicu testnih spremnika defacto Grizzly, što ćemo također morati dodati:

 org.glassfish.jersey.test-framework.providers jersey-test-framework-provider-grizzly2 2.27 test 

Opet možemo pronaći najnoviju verziju u Maven Central.

3. Početak rada

U sljedećem ćemo odjeljku pokriti osnovne korake potrebne za pisanje jednostavnog testa.

Započet ćemo testiranjem jednostavnog Lijep pozdrav resurs na našem poslužitelju:

@Path ("/ greetings") pozdrav javne klase {@GET @Path ("/ hi") public String getHiGreeting () {return "hi"; }} 

3.1. Konfiguriranje testa

Ajmo sada definirati našu testnu klasu:

javna klasa GreetingsResourceIntegrationTest proširuje JerseyTest {@Override protected Application configure () {return new ResourceConfig (Greetings.class); } // ...} 

U gornjem primjeru možemo vidjeti da naš test treba razvrstati u podrazred da bi razvio test koristeći Jersey Test Framework JerseyTest.

Dalje, nadjačavamo konfigurirati metoda koja vraća prilagođenu konfiguraciju resursa za naš test i sadrži samo Lijep pozdrav resurs. Ovo je, naravno, resurs koji želimo testirati.

3.2. Pisanje našeg prvog testa

Počnimo s testiranjem jednostavnog GET zahtjeva iz našeg API-ja za pozdrav:

@Test javna praznina givenGetHiGreeting_whenCorrectRequest_thenResponseIsOkAndContainsHi () {Response response = target ("/ greetings / hi"). Request () .get (); assertEquals ("Http odgovor treba biti 200:", Status.OK.getStatusCode (), response.getStatus ()); assertEquals ("Http Content-Type trebao bi biti:", MediaType.TEXT_HTML, response.getHeaderString (HttpHeaders.CONTENT_TYPE)); Sadržaj niza = response.readEntity (String.class); assertEquals ("Sadržaj odgovora je:", "hi", sadržaj); } 

Primijetite da imamo puni pristup HTTP odgovoru - tako da možemo raditi stvari poput provjere statusnog koda kako bismo bili sigurni da je operacija zapravo bila uspješna ili raditi sa stvarnim tijelom odgovora.

Objasnimo detaljnije što radimo u gornjem primjeru:

  1. Pošaljite HTTP GET zahtjev na ‘/ greetings / hi’
  2. Provjerite HTTP statusni kod i zaglavlja odgovora vrste sadržaja
  3. Testirajte sadržaj odgovora koji sadrži niz "hi"

4. Testiranje GET za preuzimanje resursa

Sad, kad smo vidjeli osnovne korake koji su uključeni u stvaranje testova. Isprobajmo jednostavni API za voće koji smo uveli u izvrsnom članku o podršci za Jersey MVC.

4.1. Nabavite obični JSON

U donjem primjeru radimo s tijelom odgovora kao standardnim JSON nizom:

@Test javna praznina givenFruitExists_whenSearching_thenResponseContainsFruit () {final String json = target ("voće / pretraživanje / jagoda"). Request () .get (String.class); assertThat (json, containsString ("{\" name \ ": \" jagoda \ ", \" težina \ ": 20}")); }

4.2. Nabavite entitet umjesto JSON-a

Odgovor također možemo mapirati izravno u klasu entiteta resursa - na primjer:

 @Test javna praznina givenFruitExists_whenSearching_thenResponseContainsFruitEntity () {final Voće entitet = cilj ("voće / pretraživanje / jagoda"). Request () .get (Fruit.class); assertEquals ("Ime voća:", "jagoda", entity.getName ()); assertEquals ("Težina ploda:", Integer.valueOf (20), entity.getWeight ()); }

Ovaj put odredujemo tip Java u koji će se entitet odgovora pretvoriti u dobiti metoda - a Voće objekt.

5. Testiranje POST-a za stvaranje resursa

Da bismo stvorili novi resurs u našem API-ju - dobro ćemo iskoristiti POST zahtjeve. U sljedećem ćemo odjeljku vidjeti kako testirati ovaj dio našeg API-ja.

5.1. Post Plain JSON

Počnimo s objavljivanjem običnog JSON Stringa kako bismo testirali stvaranje novog voćnog resursa:

@Test javna praznina givenCreateFruit_whenJsonIsCorrect_thenResponseCodeIsCreated () {Response response = target ("fruit / created"). Request () .post (Entity.json ("{\" name \ ": \" strawberry \ ", \" weight \ ": 20} ")); assertEquals ("Http odgovor treba biti 201", Status.CREATED.getStatusCode (), response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("Voće spremljeno: Voće [naziv: boja jagode: null]")); }

U gornjem primjeru koristimo post metoda koja uzima an Entitet parametar objekta. Koristimo prikladno json metoda za stvaranje entiteta iz odgovarajućeg JSON niza.

5.2. Post entitet umjesto JSON

Kao što smo već vidjeli kod zahtjeva za dobivanje, također možemo izravno objaviti klasu entiteta resursa - na primjer:

@Test javna praznina givenCreateFruit_whenFruitIsInvalid_thenResponseCodeIsBadRequest () {Voće = novo voće ("borovnica", "ljubičasta"); fruit.setWeight (1); Odgovor odgovora = cilj ("voće / stvori"). Zahtjev (MediaType.APPLICATION_JSON_TYPE) .post (Entity.entity (voće, MediaType.APPLICATION_JSON_TYPE)); assertEquals ("Http odgovor treba biti 400", 400, response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("Težina ploda mora biti 10 ili veća")); }

Ovaj put koristimo entitet metodu za objavljivanje našeg Fruit entiteta, a također navedite vrstu medija kao JSON.

5.3. Predaja obrazaca pomoću POST-a

U našem posljednjem primjeru posta vidjet ćemo kako testirati podnošenje obrazaca putem zahtjeva za postom:

@Test javna praznina givenCreateFruit_whenFormContainsNullParam_thenResponseCodeIsBadRequest () {Obrazac obrasca = novi obrazac (); form.param ("ime", "jabuka"); form.param ("boja", null); Odgovor odgovora = cilj ("voće / stvori"). Zahtjev (MediaType.APPLICATION_FORM_URLENCODED) .post (Entity.form (obrazac)); assertEquals ("Http odgovor treba biti 400", 400, response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("Boja voća ne smije biti null")); }

Slično tome, koristimo i Entitet klase, ali ovaj put proslijedite obrazac koji sadrži niz parametara na naš zahtjev za objavu.

6. Testiranje ostalih HTTP glagola

Ponekad moramo testirati druge HTTP krajnje točke kao što su PUT i DELETE. To je naravno savršeno moguće pomoću okvira za test Jersey.

Pogledajmo jednostavan primjer PUT-a:

@Test javna praznina givenUpdateFruit_whenFormContainsBadSerialParam_thenResponseCodeIsBadRequest () {Obrazac obrasca = novi obrazac (); form.param ("serijski", "2345-2345"); Odgovor odgovora = cilj ("voće / ažuriranje"). Zahtjev (MediaType.APPLICATION_FORM_URLENCODED) .put (Entity.form (obrazac)); assertEquals ("Http odgovor treba biti 400", 400, response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("Serijski broj voća nije valjan")); }

Nakon što smo nazvali zahtjev metodom, možemo pozvati bilo koju HTTP metodu na trenutnom objektu zahtjeva.

7. Dodatne značajke

Okvir za test Jersey sadrži niz dodatnih svojstava konfiguracije koja mogu pomoći u otklanjanju pogrešaka i testiranju.

U sljedećem ćemo primjeru vidjeti kako programski omogućiti značajku s danim imenom:

javna klasa FruitResourceIntegrationTest proširuje JerseyTest {@Override protected Application configure () {enable (TestProperties.LOG_TRAFFIC); omogućiti (TestProperties.DUMP_ENTITY); // ...

Kada kreiramo i konfiguriramo našu testnu aplikaciju za Jersey. Možemo omogućiti i dodatna svojstva. U ovom slučaju omogućujemo dva svojstva zapisivanja - LOG_TRAFFIC i DUMP_ENTITYkoji će pružiti korisne dodatne podatke zapisivanja i otklanjanja pogrešaka tijekom probnih vožnji.

8. Podržani spremnici

Kao što smo već spomenuli, defacto spremnik koji se koristio prilikom pisanja testova s ​​Jersey Test Framework je Grizzly. Međutim, podržan je niz drugih spremnika:

  • Spremnik u memoriji
  • HttpServer tvrtke Oracle JDK
  • Jednostavan spremnik (org.simpleframework.http
  • Kontejner za mlaz (org.eclipse.jetty)

Za više informacija o tome kako konfigurirati ove spremnike, pogledajte ovdje dokumentaciju.

9. Zaključak

Da rezimiramo, u ovom uputstvu istražili smo okvir za test Jerseyja. Prvo smo započeli s predstavljanjem kako konfigurirati Jersey Test Framework, a zatim smo vidjeli kako napisati test za vrlo jednostavan API.

U sljedećem smo odjeljku vidjeli kako pisati testove za razne krajnje točke GET i POST API. Na kraju smo pogledali neke dodatne značajke i spremnike koje Jersey Test Framework podržava.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.


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