Testovanie REST API s uhorkou

1. Prehľad

Tento tutoriál predstavuje úvod do Cucumber, bežne používaného nástroja na testovanie prijatia používateľom, a ako ho používať v testoch REST API.

Okrem toho, aby bol článok samostatný a nezávislý od akýchkoľvek externých služieb REST, použijeme WireMock, stububujúcu a posmešnú knižnicu webových služieb. Ak sa chcete dozvedieť viac informácií o tejto knižnici, prečítajte si úvod do aplikácie WireMock.

2. Uhorka - jazyk uhorky

Cucumber je testovací rámec, ktorý podporuje vývoj založený na správaní (Behavior Driven Development - BDD) a umožňuje používateľom definovať operácie aplikácií vo formáte obyčajného textu. Funguje na základe jazyka Gherkin Domain Specific Language (DSL). Táto jednoduchá, ale výkonná Gherkinova syntax umožňuje vývojárom a testerom písať zložité testy, pričom je zrozumiteľná aj netechnickým používateľom.

2.1. Úvod do uhorky

Gherkin je jazyk zameraný na riadky, ktorý na definovanie dokumentov používa konce riadkov, odsadenie a kľúčové slová. Každý neprázdny riadok zvyčajne začína kľúčovým slovom Gherkin, za ktorým nasleduje ľubovoľný text, ktorým je zvyčajne popis kľúčového slova.

Celá štruktúra musí byť zapísaná do súboru s vlastnosť rozšírenie uhorka rozpozná.

Tu je jednoduchý príklad dokumentu Gherkin:

Funkcia: Krátky popis požadovanej funkčnosti Scenár: Obchodná situácia Daný predpoklad A ďalší predpoklad Keď dôjde k udalosti A stane sa aj iná udalosť Potom sa dosiahne testovateľný výsledok A dokončí sa aj niečo iné

V nasledujúcich častiach si popíšeme niekoľko najdôležitejších prvkov v Gherkinovej štruktúre.

2.2. Funkcia

Pomocou súboru Gherkin popisujeme funkčnosť aplikácie, ktorú je potrebné vyskúšať. Súbor obsahuje Funkcia kľúčové slovo na samom začiatku, za ktorým nasleduje názov prvku v rovnakom riadku a voliteľný popis, ktorý môže obsahovať viac riadkov pod ním.

Analyzátor uhoriek preskočí všetok text okrem Funkcia kľúčové slovo a obsahuje ho iba na účely dokumentácie.

2.3. Scenáre a kroky

Gherkinova štruktúra môže pozostávať z jedného alebo viacerých scenárov rozpoznaných organizáciou Scenár kľúčové slovo. Scenár je v podstate test umožňujúci používateľom overiť schopnosť aplikácie. Mal by popisovať počiatočný kontext, udalosti, ktoré sa môžu stať, a očakávané výsledky vytvorené týmito udalosťami.

Tieto veci sa vykonávajú pomocou krokov identifikovaných jedným z piatich kľúčových slov: Dané, Kedy, Potom, Aa ale.

  • Dané: Týmto krokom je uviesť systém do presne definovaného stavu predtým, ako používatelia začnú interagovať s aplikáciou. A Dané klauzulu možno považovať za predpoklad prípadu použitia.
  • Kedy: A Kedy Tento krok sa používa na opísanie udalosti, ktorá sa stane s aplikáciou. Môže to byť akcia vykonaná používateľmi alebo udalosť vyvolaná iným systémom.
  • Potom: Týmto krokom je určiť očakávaný výsledok testu. Výsledok by mal súvisieť s obchodnými hodnotami testovanej funkcie.
  • A a ale: Tieto kľúčové slová možno použiť na nahradenie vyššie uvedených kľúčových slov v prípade, že existuje viac krokov rovnakého typu.

Uhorka v skutočnosti nerozlišuje tieto kľúčové slová, stále však existujú, aby bola funkcia čitateľnejšia a konzistentnejšia so štruktúrou BDD.

3. Implementácia uhorky-JVM

Uhorka bola pôvodne napísaná v jazyku Ruby a bola prenesená do Javy s implementáciou Cucumber-JVM, ktorá je predmetom tejto časti.

3.1. Maven závislosti

Aby bolo možné použiť Cucumber-JVM v projekte Maven, je potrebné do POM zahrnúť nasledujúcu závislosť:

 io.cucumber uhorka-java 6.8.0 test 

Na uľahčenie testovania JUnit s uhorkou musíme mať ešte jednu závislosť:

 io.cucumber uhorka-junit 6.8.0 

Prípadne môžeme použiť iný artefakt na využitie výhod výrazov lambda v prostredí Java 8, ktorým sa tento návod nebude venovať.

3.2. Definície krokov

Uhorkové scenáre by boli zbytočné, keby sa nepremietli do činov, a tu prichádzajú k slovu definície krokov. Definícia kroku je v zásade anotovaná metóda Java s pripojeným vzorom, ktorej úlohou je prevádzať Gherkinove kroky vo formáte obyčajného textu na spustiteľný kód. Po analýze dokumentu funkcie Cucumber vyhľadá definície krokov, ktoré zodpovedajú vykonaným preddefinovaným Gherkinovým krokom.

Aby sme to objasnili, pozrime sa na nasledujúci krok:

Vzhľadom na to, že som si zaregistroval kurz v Baeldungu

A definícia kroku:

@Given („Zaregistroval som kurz v Baeldungu“) public void verifyAccount () {// implementácia metódy}

Keď Cucumber prečíta daný krok, bude hľadať definície krokov, ktorých anotačné vzory sa zhodujú s Gherkinovým textom.

4. Tvorba a spustenie testov

4.1. Zápis súboru funkcií

Začnime vyhlásením scenárov a krokov v súbore s názvom končiacim na .funkcia rozšírenie:

Funkcia: Testovanie rozhrania REST API Používatelia by mali byť schopní odosielať žiadosti GET a POST webovej službe predstavovanej scenárom WireMock: Nahrávanie údajov do webovej služby Keď používatelia nahrávajú údaje do projektu, potom by to mal server spracovať a vrátiť stav úspechu Scenár: Získanie údajov z webovej služby Keď chcú používatelia získať informácie o projekte „Uhorka“, požadované údaje sa vrátia

Teraz tento súbor uložíme do adresára s názvom Funkcia, pod podmienkou, že sa adresár za behu načíta do cesty triedy, napr. src / main / resources.

4.2. Konfigurácia JUnit na prácu s uhorkou

Aby mohol JUnit vedieť o uhorke a čítať súbory funkcií, keď je spustený, Uhorka trieda musí byť deklarovaná ako Bežec. Tiež musíme povedať JUnit miesto, kde bude hľadať súbory funkcií a definície krokov.

@RunWith (Cucumber.class) @CucumberOptions (features = "classpath: Feature") verejná trieda CucumberIntegrationTest {}

Ako vidíte, Vlastnosti prvok UhorkaMožnosť vyhľadá predtým vytvorený súbor funkcií. Ďalším dôležitým prvkom, tzv lepidlo, poskytuje cesty k definíciám krokov. Ak sú však definície testovacích prípadov a krokov v rovnakom balíku ako v tomto návode, môže sa tento prvok zrušiť.

4.3. Písanie definícií krokov

Keď Cucumber analyzuje kroky, bude hľadať metódy anotované kľúčovými slovami Gherkin na vyhľadanie zodpovedajúcich definícií krokov.

Výrazom definície kroku môže byť buď regulárny výraz, alebo výraz uhorky. V tomto tutoriále budeme používať výrazy uhorky.

Nasleduje metóda, ktorá sa úplne zhoduje s okurkou. Táto metóda sa použije na zverejnenie údajov do webovej služby REST:

@Keď („používatelia nahrávajú údaje o projekte“) public void usersUploadDataOnAProject () vyvolá IOException {}

A tu je metóda, ktorá zodpovedá kroku Gherkin a vezme argument z textu, ktorý sa použije na získanie informácií z webovej služby REST:

@Keď („používatelia chcú získať informácie o {string} projekte“) public void usersGetInformationOnAProject (reťazec projectName) vyvolá IOException {}

Ako vidíte, usersGetInformationOnAProject metóda vyžaduje a String argument, čo je názov projektu. Tento argument je deklarovaný {string} v anotácii a tu zodpovedá Uhorka v texte kroku.

Prípadne by sme mohli použiť regulárny výraz:

@Keď ("^ používatelia chcú získať informácie o projekte '(. +)' $") Public void usersGetInformationOnAProject (reťazec projectName) vyvolá IOException {}

Všimnite si ‘^' a ‘$' ktoré podľa toho označujú začiatok a koniec regulárneho výrazu. Keďže ‘(.+)' zodpovedá String parameter.

Pracovný kód pre obidve vyššie uvedené metódy poskytneme v nasledujúcej časti.

4.4. Vytváranie a prevádzka testov

Najskôr začneme štruktúrou JSON, ktorá ilustruje údaje nahrané na server požiadavkou POST a stiahnuté do klienta pomocou nástroja GET. Táto štruktúra je uložená v jsonString a zobrazené nižšie:

{"testing-framework": "cucumber", "supported-language": ["Ruby", "Java", "Javascript", "PHP", "Python", "C ++"], "website": "uhorka. io "}

Na demonštráciu rozhrania REST API používame server WireMock:

WireMockServer wireMockServer = nový WireMockServer (options (). DynamicPort ());

Ďalej použijeme API Apache HttpClient na zastupovanie klienta používaného na pripojenie k serveru:

CloseableHttpClient httpClient = HttpClients.createDefault ();

Prejdime teraz k písaniu testovacieho kódu v rámci definícií krokov. Urobíme to pre usersUploadDataOnAProject metóda ako prvá.

Server by mal byť spustený skôr, ako sa k nemu pripojí klient:

wireMockServer.start ();

Použitie rozhrania WireMock API na vyradenie služby REST:

configureFor ("localhost", wireMockServer.port ()); stubFor (post (urlEqualTo ("/ create")) .withHeader ("content-type", equalTo ("application / json")) .withRequestBody (contains ("testing-framework")) .willReturn (aResponse (). withStatus (200)));

Teraz pošlite žiadosť POST s obsahom prevzatým z jsonString pole deklarované vyššie na server:

HttpPost request = new HttpPost ("// localhost:" + wireMockServer.port () + "/ create"); StringEntity entity = new StringEntity (jsonString); request.addHeader ("content-type", "application / json"); request.setEntity (entita); HttpResponse response = httpClient.execute (požiadavka);

Nasledujúci kód tvrdí, že požiadavka POST bola úspešne prijatá a spracovaná:

assertEquals (200, response.getStatusLine (). getStatusCode ()); verifikovať (postRequestedFor (urlEqualTo ("/ create")) .withHeader ("content-type", equalTo ("application / json")));

Server by sa mal po použití zastaviť:

wireMockServer.stop ();

Druhá metóda, ktorú tu implementujeme, je usersGetInformationOnAProject (reťazec projectName). Podobne ako v prvom teste musíme spustiť server a potom ukončiť službu REST:

wireMockServer.start (); configureFor ("localhost", wireMockServer.port ()); stubFor (get (urlEqualTo ("/ projects / cucumber")) .withHeader ("accept", equalTo ("application / json")). willReturn (aResponse (). withBody (jsonString)));

Odoslanie žiadosti GET a prijatie odpovede:

HttpGet request = new HttpGet ("// localhost:" + wireMockServer.port () + "/ projects /" + projectName.toLowerCase ()); request.addHeader ("accept", "application / json"); HttpResponse httpResponse = httpClient.execute (požiadavka);

Prevedieme httpResponse premenná na a String pomocou pomocnej metódy:

Reťazec responseString = convertResponseToString (httpResponse);

Tu je implementácia tejto metódy pomocnej konverzie:

private String convertResponseToString (HttpResponse response) hodí IOException {InputStream responseStream = response.getEntity (). getContent (); Skener skener = nový skener (responseStream, "UTF-8"); Reťazec responseString = scanner.useDelimiter ("\ Z"). Next (); scanner.close (); návrat responseString; }

Celý proces overuje nasledovné:

assertThat (responseString, containsString ("\" testing-framework \ ": \" uhorka \ "")); assertThat (responseString, containsString ("\" web \ ": \" cucumber.io \ "")); verify (getRequestedFor (urlEqualTo ("/ projects / cucumber")) .withHeader ("accept", equalTo ("application / json")));

Nakoniec zastavte server, ako je popísané vyššie.

5. Paralelné fungovanie funkcií

Cucumber-JVM natívne podporuje paralelné vykonávanie testu na viacerých vláknach. Na vykonanie bežcov použijeme JUnit spolu s doplnkom Maven Failsafe. Prípadne by sme mohli použiť Maven Surefire.

JUnit spúšťa súbory funkcií skôr paralelne ako so scenármi, čo znamená všetky scenáre v súbore funkcií sa vykonajú rovnakým vláknom.

Teraz pridajme konfiguráciu pluginu:

 maven-failafe-plugin $ {maven-failafe-plugin.version} CucumberIntegrationTest.java metódy 2 integrácia-test overiť 

Poznač si to:

  • paralelne: môže byť triedy, metódy, alebo oboje - v našom prípade, triedy spôsobí, že každá testovacia trieda bude bežať v samostatnom vlákne
  • threadCount: označuje koľko vlákien by malo byť alokovaných pre toto vykonanie

To je všetko, čo musíme urobiť, aby sme paralelne spustili funkcie uhorky.

6. Záver

V tomto tutoriáli sme sa venovali základom hry Cucumber a tomu, ako tento rámec používa na testovanie rozhrania REST API jazyk špecifický pre doménu Gherkin.

Ako obvykle sú všetky ukážky kódu zobrazené v tomto tutoriále dostupné na GitHub.


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