A WireMock bemutatása
1. Áttekintés
WireMock egy könyvtár a webszolgáltatások megcsalására és gúnyolására. Felépít egy HTTP kiszolgálót, amelyhez ugyanúgy kapcsolódhatunk, mint egy tényleges webszolgáltatáshoz.
Amikor egy WireMock szerver működik, beállíthatjuk az elvárásokat, felhívhatjuk a szolgáltatást, majd ellenőrizhetjük annak viselkedését.
2. Maven-függőségek
A WireMock könyvtár előnyeinek kihasználásához a következő függőséget kell beépítenünk a POM-ba:
com.github.tomakehurst wiremock 1.58 teszt
3. Programozottan kezelt szerver
Ez a szakasz a WireMock szerver kézi konfigurálásának módját ismerteti. azaz a JUnit automatikus konfigurációjának támogatása nélkül. A felhasználást egy nagyon egyszerű csonk bizonyítja.
3.1. Szerver beállítása
A WireMock szerver így példányosítható:
WireMockServer wireMockServer = új WireMockServer (String gazdagép, int port);
Ha nincs megadva argumentum, akkor a kiszolgáló állomás alapértelmezett értéke helyi kiszolgáló és a kiszolgáló portja 8080.
Ezután a kiszolgálót két egyszerű módszerrel lehet elindítani és leállítani:
wireMockServer.start ();
És:
wireMockServer.stop ();
3.2. Alapvető használat
A WireMock könyvtárat először egy alapvető használat fogja bemutatni, ahol egy pontos URL-hez külön konfiguráció nélküli csonk van megadva. Hozzunk létre egy kiszolgálópéldányt:
WireMockServer wireMockServer = új WireMockServer ();
A WireMock szervernek futnia kell, mielőtt az ügyfél csatlakozik hozzá:
wireMockServer.start ();
Ezután a webszolgáltatás elakad:
configureFor ("localhost", 8080); stubFor (get (urlEqualTo ("/ baeldung")).. willReturn (aResponse (). withBody ("Üdvözöljük a Baeldungban!")));
Ez az oktatóanyag az Apache HttpClient API-t használja a kiszolgálóhoz csatlakozó kliens ábrázolásához:
CloseableHttpClient httpClient = HttpClients.createDefault ();
Egy kérés végrehajtásra kerül, és a válasz visszajön, illetve:
HttpGet request = new HttpGet ("// localhost: 8080 / baeldung"); HttpResponse httpResponse = httpClient.execute (kérés);
Átváltjuk a httpResponse változó a Húr segítő módszerrel:
String responseString = convertResponseToString (httpResponse);
A konverziós segítő módszer megvalósítása itt található:
privát karakterlánc convertResponseToString (HttpResponse response) dobja az IOException {InputStream responseStream = response.getEntity (). getContent (); Szkenner szkenner = új szkenner (responseStream, "UTF-8"); String responseString = szkenner.useDelimiter ("\ Z"). Következő (); scanner.close (); return responseString; }
A következő kód ellenőrzi, hogy a kiszolgáló kapott-e kérést a várt URL-re, és hogy az ügyfélhez érkező válasz pontosan mit küldött:
ellenőrizze (getRequestedFor (urlEqualTo ("/ baeldung"))); assertEquals ("Üdvözöljük a Baeldungban!", stringResponse);
Végül le kell állítani a WireMock szervert a rendszererőforrások felszabadítása érdekében:
wireMockServer.stop ();
4. JUnit kezelt kiszolgáló
A 3. szakasztól eltérően ez a szakasz a WireMock szerver használatát mutatja be a JUnit segítségével Szabály.
4.1. Szerver beállítása
A WireMock szerver integrálható a JUnit tesztesetekbe a @Szabály annotáció. Ez lehetővé teszi a JUnit számára az életciklus kezelését, a szerver indítását az egyes vizsgálati módszerek előtt, és a metódus visszatérése után leállítást.
A programozottan felügyelt kiszolgálóhoz hasonlóan a JUnit által felügyelt WireMock szerver Java objektumként létrehozható a megadott portszámmal:
@Rule public WireMockRule wireMockRule = új WireMockRule (int port);
Ha nem adunk meg argumentumokat, akkor a kiszolgáló portja az alapértelmezett értéket veszi fel, 8080. Szerver gazdagép, alapértelmezés szerint helyi kiszolgáló, és más konfigurációk megadhatók a Opciók felület.
4.2. URL egyezés
Beállítása után a WireMockRule Például a következő lépés egy csonk konfigurálása. Ebben az alszakaszban egy REST csonkot adunk meg egy szolgáltatás végpontjának a reguláris kifejezés használatával:
stubFor (get (urlPathMatching ("/ baeldung /.*")) .willReturn (aResponse () .withStatus (200) .withHeader ("Content-Type", "application / json") .withBody ("\" testing-library \ ": \" WireMock \ "")));
Térjünk át egy HTTP kliens létrehozására, egy kérés végrehajtására és válaszra:
CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet request = new HttpGet ("// localhost: 8080 / baeldung / wiremock"); HttpResponse httpResponse = httpClient.execute (kérés); String stringResponse = convertHttpResponseToString (httpResponse);
A fenti kódrészlet kihasználja a konverziós segítő módszer előnyeit:
privát karakterlánc convertHttpResponseToString (HttpResponse httpResponse) dobja az IOException {InputStream inputStream = httpResponse.getEntity (). getContent (); return convertInputStreamToString (inputStream); }
Ez viszont egy másik privát módszert alkalmaz:
privát karakterlánc convertInputStreamToString (InputStream inputStream) {Szkenner szkenner = új Szkenner (inputStream, "UTF-8"); Karaktersorozat = scanner.useDelimiter ("\ Z"). Következő (); scanner.close (); return string; }
A csonk működését az alábbi tesztkód ellenőrzi:
ellenőrizze (getRequestedFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (200, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("application / json", httpResponse.getFirstHeader ("Content-Type"). getValue ()); assertEquals ("\" testing-library \ ": \" WireMock \ "", stringResponse);
4.3. Fejlécegyeztetés kérése
Most bemutatjuk, hogyan lehet egy REST API-t elcsavarni a fejlécek egyezésével. Kezdjük a csonk konfigurációval:
stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Accept", egyező ("text /.*")) .willReturn (aResponse () .withStatus (503) .withHeader ("Content-Type") , "text / html") .withBody ("!!! A szolgáltatás nem érhető el !!!")));
Az előző alszakaszhoz hasonlóan a HTTP-interakciókat a HttpClient API segítségével szemléltetjük ugyanazon segítő módszerek segítségével:
CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet request = new HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Elfogadás", "text / html"); HttpResponse httpResponse = httpClient.execute (kérés); String stringResponse = convertHttpResponseToString (httpResponse);
A következő ellenőrzés és állítások megerősítik a korábban létrehozott csonk funkcióit:
ellenőrizze (getRequestedFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("text / html", httpResponse.getFirstHeader ("Content-Type"). getValue ()); assertEquals ("!!! A szolgáltatás nem érhető el !!!", stringResponse);
4.4. Testegyeztetés kérése
A WireMock könyvtár segítségével testreszabható REST API is megdermedhet. Itt található egy ilyen csonk konfigurációja:
stubFor (post (urlEqualTo ("/ baeldung / wiremock")) .withHeader ("Content-Type", equalTo ("application / json")) .withRequestBody (amely ("\" testing-library \ ": \" WireMock \ "")) .withRequestBody (amely tartalmazza ("\" creator \ ": \" Tom Akehurst \ "")) .withRequestBody (tartalmazza ("\" website \ ": \" wiremock.org \ "")) .willReturn ( aResponse () .Status (200)));
Itt az ideje létrehozni a StringEntity a kérelem törzseként használt objektum:
InputStream jsonInputStream = this.getClass (). GetClassLoader (). GetResourceAsStream ("wiremock_intro.json"); Karakterlánc jsonString = convertInputStreamToString (jsonInputStream); StringEntity entitás = new StringEntity (jsonString);
A fenti kód a korábban definiált konverziós segítő módszerek egyikét használja, convertInputStreamToString.
Itt található a wiremock_intro.json fájl az osztályúton:
{"testing-library": "WireMock", "creator": "Tom Akehurst", "website": "wiremock.org"}
A HTTP kéréseket és válaszokat a következőképpen lehet konfigurálni és végrehajtani:
CloseableHttpClient httpClient = HttpClients.createDefault (); HttpPost request = new HttpPost ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Tartalom-típus", "alkalmazás / json"); request.setEntity (entitás); HttpResponse response = httpClient.execute (kérés);
Ez a tesztkód a csonk érvényesítéséhez:
ellenőrizze (postRequestedFor (urlEqualTo ("/ baeldung / wiremock")) .withHeader ("Content-Type", equalTo ("application / json"))); assertEquals (200, response.getStatusLine (). getStatusCode ());
4.5. Csonkprioritás
Az előző alfejezetek olyan helyzetekkel foglalkoznak, amikor a HTTP-kérés csak egy csonknak felel meg. Bonyolultabb lenne, ha egy kérésnél több is van, mint egyezés. Alapértelmezés szerint a legutóbb hozzáadott csonk élvez elsőbbséget ilyen esetben. A felhasználók azonban testreszabhatják ezt a viselkedést, hogy jobban ellenőrizzék a WireMock csonkjait.
Bemutatjuk a WireMock szerver működését, amikor egy érkező kérés egyidejűleg két különböző csonkhoz illeszkedik, prioritási szint beállításával és anélkül. Mindkét forgatókönyv a következő magánsegítő módszert használja:
privát HttpResponse generatorClientAndReceiveResponseForPriorityTests () dobja az IOException {CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet request = new HttpGet ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("Elfogadás", "text / xml"); return httpClient.execute (kérés); }
Először konfiguráljon két csonkot a prioritási szint figyelembevétele nélkül:
stubFor (get (urlPathMatching ("/ baeldung /.*")) .willReturn (aResponse () .WithStatus (200))); stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Elfogadás", egyezés ("szöveg /.*")) .willReturn (aResponse () .WithStatus (503)));
Ezután hozzon létre egy HTTP klienst, és hajtson végre egy kérést a fent leírt segítő módszerrel:
HttpResponse httpResponse = generálClientAndReceiveResponseForPriorityTests ();
A következő kódrészlet ellenőrzi, hogy az utoljára konfigurált csonk alkalmazva van-e, függetlenül attól, hogy korábban definiálták-e, amikor egy kérés megfelel mindkettőjüknek:
ellenőrizze (getRequestedFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ());
Térjünk át a prioritási szintek beállítására szolgáló csonkokra, ahol az alacsonyabb szám magasabb prioritást jelent:
stubFor (get (urlPathMatching ("/ baeldung /.*")) .atPriority (1) .willReturn (aResponse () .withStatus (200))); stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .atPriority (2) .withHeader ("Accept", megfelelő ("text /.*")) .willReturn (aResponse () .withStatus (503)));
HTTP-kérelem létrehozása és végrehajtása:
HttpResponse httpResponse = generálClientAndReceiveResponseForPriorityTests ();
A következő kód érvényesíti a prioritási szintek hatását, ahol az első konfigurált csonkot alkalmazzák az utolsó helyett:
ellenőrizze (getRequestedFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (200, httpResponse.getStatusLine (). getStatusCode ());
5. Következtetés
Ez az oktatóanyag bemutatta a WireMock programot, valamint a könyvtár beállítását és konfigurálását a REST API-k teszteléséhez különféle technikák alkalmazásával, beleértve az URL, a kérés fejlécének és a törzsnek az egyeztetését.
Az összes példa és kódrészlet megvalósítása megtalálható egy GitHub projektben.