Testovanie REST API s karate

1. Prehľad

V tomto článku si predstavíme Karate, testovací rámec pre behaviorálny vývoj (BDD) pre Java.

2. Karate a BDD

Karate jepostavené na vrchole uhorky, ďalší rámec pre testovanie BDD, a zdieľa niektoré rovnaké koncepty. Jedným z nich je použitie súboru Gherkin, ktorý popisuje testovanú funkciu. Na rozdiel od Cucumbera však testy nie sú napísané v jazyku Java a sú úplne popísané v súbore Gherkin.

Súbor s okurkou sa uloží s „.funkcia “ predĺženie. Začína sa to Funkcia kľúčové slovo, za ktorým nasleduje názov prvku v rovnakom riadku. Obsahuje tiež rôzne testovacie scenáre, každý sa začína kľúčovým slovom Scenár a pozostáva z viacerých krokov s kľúčovými slovami Dané, Kedy, Potom, Aa ale.

Viac o uhorke a ostružinovej štruktúre nájdete tu.

3. Závislosti Maven

Aby sme mohli využiť Karate v projekte Maven, musíme pridať karate-apache závislosť od pom.xml:

 com.intuit.karate karate-apache 0.6.0 

Budeme tiež potrebovať karate-junit4 závislosť na uľahčení testovania JUnit:

 com.intuit.karate karate-junit4 0,6.0 

4. Tvorba testov

Začneme tým, že v Gherkinovi napíšeme testy pre niektoré bežné scenáre Funkcia spis.

4.1. Testovanie stavového kódu

Poďme napísať scenár, ktorý testuje koncový bod GET a skontroluje, či vráti a 200 (OK) Stavový kód HTTP:

Scenár: Testovanie platného koncového bodu GET Daná adresa URL '// localhost: 8097 / user / get' When method GET Then status 200

Toto samozrejme funguje so všetkými možnými stavovými kódmi HTTP.

4.2. Testovanie odpovede

Napíšme ďalší scenár, ktorý testuje, že koncový bod REST vráti konkrétnu odpoveď:

Scenár: Testovanie presnej odpovede koncového bodu GET Daná adresa URL '// localhost: 8097 / user / get' When method GET Then status 200 And match $ == {id: "1234", name: "John Smith"}

The zápas operácia sa používa na validáciu kde '$' predstavuje odpoveď. Vyššie uvedený scenár teda kontroluje, či sa odpoveď presne zhoduje „{id: ”1234 ″, meno:” John Smith ”} '.

Môžeme tiež špeciálne skontrolovať hodnotu id lúka:

A priradiť $ .id == "1234"

The zápas možno tiež použiť na kontrolu, či odpoveď obsahuje určité polia. To je užitočné, keď je potrebné skontrolovať iba určité polia alebo ak nie sú známe všetky polia odpovede:

Scenár: Testovanie, či odpoveď GET obsahuje konkrétne pole Daná adresa URL '// localhost: 8097 / user / get' When method GET Then status 200 And match $ contains {id: "1234"}

4.3. Validácia hodnôt odpovedí pomocou značiek

V prípade, že nevieme presnú hodnotu, ktorá sa vráti, môžeme ju stále overiť pomocou značkovače - zástupné symboly pre zodpovedajúce polia v odpovedi.

Napríklad môžeme použiť značku na označenie, či očakávame a nulový hodnota alebo nie:

  • #nulový
  • #notnull

Alebo môžeme použiť značku na priradenie určitého typu hodnoty v poli:

  • #boolean
  • # číslo
  • #string

K dispozícii sú ďalšie značky, keď očakávame, že pole obsahuje objekt alebo pole JSON:

  • # pole
  • #objekt

A existujú značky pre zhodu v určitom formáte alebo regulárnom výraze a také, ktoré vyhodnocuje boolovský výraz:

  • #uuid - hodnota zodpovedá formátu UUID
  • #regex STR - hodnota sa zhoduje s regulárnym výrazom STR
  • #? EXPR - tvrdí, že výraz JavaScript EXPR hodnotí na pravda

Nakoniec, ak nechceme žiadny druh kontroly na poli, môžeme použiť #ignorovať značka.

Prepíšeme vyššie uvedený scenár a skontrolujeme, či id pole nie je nulový:

Scenár: Test Získať presnú odpoveď Získať url '// localhost: 8097 / user / get' When method GET Then status 200 And match $ == {id: "# notnull", name: "John Smith"}

4.4. Testovanie koncového bodu POST s telom žiadosti

Pozrime sa na posledný scenár, ktorý testuje koncový bod POST a vezme telo žiadosti:

Scenár: Testovanie koncového bodu POST s telom žiadosti Daná adresa URL '// localhost: 8097 / user / create' And request {id: '1234', name: 'John Smith'} When method POST Then status 200 And match $ contains {id : "# notnull"}

5. Bežecké testy

Teraz, keď sú testovacie scenáre hotové, môžeme spustiť naše testy integráciou Karate s JUnit.

Použijeme @CucumberOptions anotácia na určenie presného umiestnenia súboru Funkcia súbory:

@RunWith (Karate.class) @CucumberOptions (features = "classpath: karate") verejná trieda KarateUnitTest {// ...}

Na demonštráciu rozhrania REST API použijeme server WireMock.

V tomto príklade zosmiešňujeme všetky koncové body, ktoré sa testujú v metóde s poznámkami @BeforeClass. Vypneme server WireMock spôsobom s anotáciou @Po hodine:

private static WireMockServer wireMockServer = nový WireMockServer (WireMockConfiguration.options (). port (8097)); @BeforeClass public static void setUp () vyvolá výnimku {wireMockServer.start (); configureFor ("localhost", 8097); stubFor (get (urlEqualTo ("/ user / get")) .willReturn (aResponse () .withStatus (200) .withHeader ("Content-Type", "application / json") .withBody ("{\" id \ " : \ "1234 \", meno: \ "John Smith \"} "))); stubFor (post (urlEqualTo ("/ user / create")) .withHeader ("content-type", equalTo ("application / json")) .withRequestBody (obsahujúce ("id")) .willReturn (aResponse () .withStatus (200) .withHeader ("Content-Type", "application / json") .withBody ("{\" id \ ": \" 1234 \ ", meno: \" John Smith \ "}"))); } @AfterClass public static void tearDown () vyvolá výnimku {wireMockServer.stop (); }

Keď spustíme KarateUnitTest triedy, koncové body REST vytvorí server WireMock a spustia sa všetky scenáre v zadanom súbore funkcií.

6. Záver

V tomto tutoriáli sme sa pozreli na to, ako testovať rozhrania REST API pomocou testovacieho rámca Karate.

Kompletný zdrojový kód a všetky útržky kódu pre tento článok nájdete na GitHub.