Testovanie rozhrania REST API s programom JBehave

1. Úvod

V tomto článku sa rýchlo pozrieme na JBehave a potom sa zameriame na testovanie rozhrania REST API z pohľadu BDD.

2. JBehave a BDD

JBehave je vývojový rámec založený na správaní. Zámerom je poskytnúť intuitívny a prístupný spôsob automatizovaného testovania prijatia.

Ak nie ste oboznámení s BDD, je dobré začať týmto článkom, ktorý sa zaoberá ďalším testovacím rámcom BDD - Cucumber, v ktorom predstavujeme všeobecnú štruktúru a vlastnosti BDD.

Podobne ako iné rámce BDD, aj JBehave prijíma nasledujúce koncepcie:

  • Príbeh - predstavuje automaticky spustiteľný prírastok obchodnej funkčnosti, obsahuje jeden alebo viac scenárov
  • Scenáre - predstavujú konkrétne príklady správania sa systému
  • Kroky - predstavujú skutočné správanie pomocou klasických kľúčových slov BDD: Dané, Kedy a Potom

Typický scenár by bol:

Je daný predpoklad Ak dôjde k udalosti, potom by mal byť zachytený výsledok

Každý krok v scenári zodpovedá anotácii v JBehave:

  • @ Uvedené: iniciovať kontext
  • @Kedy: urobte akciu
  • @Tak: otestujte očakávaný výsledok

3. Maven závislosť

Aby sme mohli využiť JBehave v našom projekte maven, závislosť jbehave-core by mala byť zahrnutá do pom:

 org.jbehave test jbehave-core 4.1 

4. Rýchly príklad

Ak chcete používať program JBehave, musíme postupovať podľa nasledujúcich krokov:

  1. Napíšte príbeh používateľa
  2. Mapujte kroky z príbehu používateľa do kódu Java
  3. Konfigurujte príbehy používateľov
  4. Spustite testy JBehave
  5. Skontrolujte výsledky

4.1. Príbeh

Začnime týmto jednoduchým príbehom: „Ako používateľ chcem zvýšiť počítadlo, aby som mohol zvýšiť hodnotu počítadla o 1“.

Príbeh môžeme definovať v a .príbeh spis:

Scenár: keď používateľ zvýši počítadlo, jeho hodnota sa zvýši o 1 Dané počítadlo A počítadlo má akúkoľvek integrálnu hodnotu Keď používateľ zvýši počítadlo, potom hodnota počítadla musí byť o 1 väčšiu ako predchádzajúca hodnota

4.2. Kroky mapovania

Vzhľadom na kroky, poďme to implementovať do Javy:

public class IncreaseSteps {private int counter; private int previousValue; @Given ("a counter") public void aCounter () {} @Given ("the counter has any integral value") public void counterHasAnyIntegralValue () {counter = new Random (). NextInt (); previousValue = counter; } @Keď ("používateľ zvýši počítadlo") public void increaseTheCounter () {counter ++; } @Then ("hodnota počítadla musí byť o 1 väčšia ako predchádzajúca hodnota") public void theValueOfTheCounterMustBe1Greater () {assertTrue (1 == counter - previousValue); }}

Zapamätaj si to hodnota v anotáciách sa musí presne zhodovať s popisom.

4.3. Konfigurácia nášho príbehu

Aby sme mohli vykonať tieto kroky, musíme pripraviť pôdu pre náš príbeh:

public class IncreaseStoryLiveTest extends JUnitStories {@Override public Configuration configuration () {return new MostUsefulConfiguration () .useStoryLoader (new LoadFromClasspath (this.getClass ())) .useStoryReporterBuilder (new StoryReporterBuilder () .withCodeLocation () .withCodeLocation (). ). withFormats (CONSOLE)); } @Override public InjectableStepsFactory stepsFactory () {return new InstanceStepsFactory (configuration (), new increaseseSteps ()); } @Override chránený zoznam storyPaths () {návrat Arrays.asList ("increase.story"); }}

V storyPaths (), poskytujeme naše .príbeh cesta k súboru, ktorú má analyzovať JBehave. Skutočné kroky sú implementované v stepsFactory (). Potom dovnútra konfigurácia (), správa príbehu a správa príbehu sú správne nakonfigurované.

Teraz, keď máme všetko pripravené, môžeme začať náš príbeh jednoducho spustením: mvn čistý test.

4.4. Kontrola výsledkov testu

Náš výsledok testu môžeme vidieť v konzole. Keď naše testy prešli úspešne, výstup by bol rovnaký s našim príbehom:

Scenár: keď používateľ zvýši počítadlo, jeho hodnota sa zvýši o 1 Dané počítadlo A počítadlo má akúkoľvek integrálnu hodnotu Keď používateľ zvýši počítadlo, potom hodnota počítadla musí byť o 1 väčšiu ako predchádzajúca hodnota

Ak zabudneme implementovať akýkoľvek krok scenára, správa nás o tom informuje. Povedzme, že sme neimplementovali @Kedy krok:

Scenár: keď používateľ zvýši počítadlo, jeho hodnota sa zvýši o 1 Dané počítadlo A počítadlo má akúkoľvek integrálnu hodnotu Keď používateľ zvýši počítadlo (PENDING), potom musí byť hodnota počítadla o 1 väčšia ako predchádzajúca hodnota (NIE JE VYKONANÁ) )
@When („používateľ zvyšuje počítadlo“) @Pending public void whenTheUserIncreasesTheCounter () {// PENDING}

Správa by hovorila o @Kedy čaká sa na krok, a preto @Tak krok by sa nevykonal.

Čo ak náš krok @Then zlyhá? Chybu môžeme spozorovať hneď od správy:

Scenár: keď používateľ zvýši počítadlo, jeho hodnota sa zvýši o 1 Dané počítadlo A počítadlo má akúkoľvek integrálnu hodnotu Keď používateľ zvýši počítadlo, potom hodnota počítadla musí byť o 1 väčšia ako predchádzajúca hodnota (FAILED) (java. lang.AssertionError)

5. Testovanie rozhrania REST API

Teraz sme pochopili základy JBhave; uvidíme, ako s ním otestujeme REST API. Naše testy budú založené na našom predchádzajúcom článku, ktorý pojednáva o testovaní rozhrania REST API v prostredí Java.

V tomto článku sme testovali rozhranie GitHub REST API a zamerali sme sa hlavne na kód odpovede HTTP, hlavičky a užitočné zaťaženie. Pre jednoduchosť ich môžeme napísať do troch samostatných príbehov.

5.1. Testovanie stavového kódu

Príbeh:

Scenár: keď používateľ skontroluje neexistujúceho používateľa na stránkach github, github odpovie „nenájdené“ Daný profil používateľa github API a náhodné neexistujúce používateľské meno Keď hľadám náhodného používateľa prostredníctvom rozhrania API Potom github odpovie: 404 nenájdené Keď hľadám eugenp1 cez api, potom github odpovie: 404 nenájdené Keď hľadám eugenp2 cez api, potom github odpovie: 404 nenájdené

Kroky:

verejná trieda GithubUserNotFoundSteps {private String api; private String nonExistentUser; private int githubResponseCode; @Given ("užívateľský profil github api") public void givenGithubUserProfileApi () {api = "//api.github.com/users/%s"; } @Given ("náhodné neexistujúce meno používateľa") public void givenANonexistentUsername () {nonExistentUser = randomAlphabetic (8); } @When („Vyhľadávam náhodného používateľa prostredníctvom rozhrania API“) public void whenILookForTheUserViaTheApi () hodí IOException {githubResponseCode = getGithubUserProfile (api, nonExistentUser) .getStatusLine () .getStatusCode (); } @When („Hľadám používateľa $ prostredníctvom rozhrania API“) public void whenILookForSomeNonExistentUserViaTheApi (String user) throws IOException {githubResponseCode = getGithubUserProfile (api, user) .getStatusLine () .getStatusCode (); } @Then ("github response: 404 not found") public void thenGithubRespond404NotFound () {assertTrue (SC_NOT_FOUND == githubResponseCode); } // ...}

Všimnite si, ako pri implementácii krokov použili sme funkciu vkladania parametrov. Argumenty extrahované z kandidáta na krok sa len zhodujú v prirodzenom poradí s parametrami v anotovanej metóde Java.

Podporované sú aj anotované pomenované parametre:

@Keď ("Hľadám $ používateľské meno cez API") verejná neplatnosť, keďILookForSomeNonExistentUserViaTheApi (@Named ("používateľské meno") reťazec) hodí IOException

5.2. Testovanie typu média

Tu je jednoduchý príbeh o testovaní typu MIME:

Scenár: keď používateľ skontroluje platný profil používateľa na stránkach github, github odpovie na údaje json Dané github profil používateľa api a platné užívateľské meno Keď hľadám používateľa cez api Potom github odpovie na údaje typu json

A tu sú kroky:

verejná trieda GithubUserResponseMediaTypeSteps {private String api; private String validUser; private String mediaType; @Given ("užívateľský profil github api") public void givenGithubUserProfileApi () {api = "//api.github.com/users/%s"; } @Given ("platné používateľské meno") public void givenAValidUsername () {validUser = "eugenp"; } @When ("Vyhľadávam používateľa prostredníctvom rozhrania API") public void whenILookForTheUserViaTheApi () hodí IOException {mediaType = ContentType .getOrDefault (getGithubUserProfile (api, validUser) .getEntity ()) .getMimeType (); } @Then ("údaje odpovedajúce na github typu json") public void thenGithubRespondDataOfTypeJson () {assertEquals ("application / json", mediaType); }}

5.3. Testovanie užitočného zaťaženia JSON

Potom posledný príbeh:

Scenár: keď používateľ skontroluje platný profil používateľa na github, odpoveď github by mala obsahovať prihlasovacie užitočné zaťaženie s rovnakým používateľským menom Dané github užívateľský profil api Keď hľadám eugenp cez api Potom odpoveď github obsahuje „prihlasovacie“ užitočné zaťaženie rovnaké ako eugenp

A jednoduchá implementácia priamych krokov:

verejná trieda GithubUserResponsePayloadSteps {private String api; súkromný zdroj GitHubUser; @Given ("užívateľský profil github api") public void givenGithubUserProfileApi () {api = "//api.github.com/users/%s"; } @When („Hľadám používateľa $ prostredníctvom rozhrania API“) public void whenILookForEugenpViaTheApi (String user) throws IOException {HttpResponse httpResponse = getGithubUserProfile (api, user); resource = RetrieveUtil.retrieveResourceFromResponse (httpResponse, GitHubUser.class); } @Then ("odpoveď githubu obsahuje užitočné zaťaženie 'prihlásenia' rovnaké ako $ username") public void thenGithubsResponseContainsAloginPayloadSameAsEugenp (meno používateľa v reťazci) {assertThat (meno používateľa, Matchers.is (resource.getLogin ())); }}

6. Zhrnutie

V tomto článku sme v krátkosti predstavili program JBehave a implementovali testy REST API v štýle BDD.

V porovnaní s naším obyčajným testovacím kódom Java vyzerá kód implementovaný v JBehave oveľa jasnejšie a intuitívnejšie a správa o výsledku testu vyzerá oveľa elegantnejšie.

Vzorový kód nájdete ako vždy v projekte Github.


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