Tabuľky s uhorkami

1. Úvod

Cucumber je rámec založený na vývoji správania (BDD), ktorý umožňuje vývojárom vytvárať textové testovacie scenáre pomocou jazyka Gherkin. V mnohých prípadoch tieto scenáre vyžadujú falošné údaje na vykonanie funkcie, ktorej vloženie môže byť nepríjemné - najmä pri zložitých alebo viacerých záznamoch.

V tomto výučbe sa pozrieme na to, ako používať tabuľky s údajmi o uhorke na čitateľné zahrnutie falošných údajov.

2. Syntax scenára

Pri definovaní scenárov uhorky často vkladáme testovacie údaje použité vo zvyšku scenára:

Scenár: Správny nenulový počet kníh nájdených podľa autora Vzhľadom na to, že v obchode mám knihu Diabol v bielom meste od Erika Larsona Keď hľadám knihy od autora Erika Larsona, nájdem 1 knihu

2.1. Údajové tabuľky

Zatiaľ čo vložené údaje postačujú pre jednu knihu, náš scenár môže byť pri pridávaní viacerých kníh neprehľadný. Aby sme to zvládli, v našom scenári vytvoríme údajovú tabuľku:

Scenár: Správny nenulový počet kníh nájdených autorom Vzhľadom na to, že v obchode mám tieto knihy | Diabol v Bielom meste Erik Larson | | Lev, čarodejnica a šatník C.S. Lewis | | V záhrade zvierat Erik Larson | Keď hľadám knihy od autora Erika Larsona, nájdem 2 knihy

Našu dátovú tabuľku definujeme ako súčasť našej Dané doložka od odsadenie tabuľky pod textom súboru Dané doložka. Pomocou tejto tabuľky údajov môžeme do nášho obchodu pridať ľubovoľný počet kníh - vrátane iba jednej knihy - pridaním alebo odstránením riadkov.

Navyše, údajové tabuľky je možné použiť s ktoroukoľvek klauzulou - nie len Dané doložky.

2.2. Vrátane nadpisov

Je zrejmé, že prvý stĺpec predstavuje názov knihy a druhý stĺpec predstavuje autora knihy. Význam každého stĺpca však nie je vždy taký zrejmý.

Ak je potrebné objasnenie, môžeme zahrnúť hlavičku pridaním nového prvého riadku:

Scenár: Správny nenulový počet kníh nájdených autorom Vzhľadom na to, že v obchode mám tieto knihy | názov | autor | | Diabol v Bielom meste Erik Larson | | Lev, čarodejnica a šatník C.S. Lewis | | V záhrade zvierat Erik Larson | Keď hľadám knihy od autora Erika Larsona, nájdem 2 knihy

Aj keď sa hlavička javí iba ako ďalší riadok v tabuľke, tento prvý riadok má zvláštny význam keď rozoberieme našu tabuľku na zoznam máp v nasledujúcej časti.

3. Definície krokov

Po vytvorení nášho scenára implementujeme Dané definícia kroku. V prípade kroku, ktorý obsahuje údajovú tabuľku, naše metódy implementujeme pomocou a Údajová tabuľka argument:

@Given („nejaká fráza“) public void somePhrase (tabuľka DataTable) {// ...}

The Údajová tabuľka objekt obsahuje tabuľkové údaje z údajovej tabuľky, ktoré sme definovali v našom scenári, ako aj metódy transformácie týchto údajov na použiteľné informácie. Spravidla existujú tri spôsoby transformácie údajovej tabuľky v Cucumber: (1) zoznam zoznamov, (2) zoznam máp a (3) transformátor tabuľky.

Na demonštráciu každej techniky použijeme jednoduchú Kniha trieda domény:

public class Book {private String title; súkromný autor reťazcov; // štandardné konštruktory, getre a setre ...}

Ďalej vytvoríme BookStore trieda, ktorá riadi Kniha objekty:

public class BookStore {private List books = new ArrayList (); public void addBook (Book book) {books.add (book); } public void addAllBooks (zbierkové knihy) {this.books.addAll (knihy); } public List booksByAuthor (autor reťazcov) {return books.stream () .filter (kniha -> Objects.equals (autor, book.getAuthor ())) .collect (Collectors.toList ()); }}

Pre každý z nasledujúcich scenárov začneme základnou definíciou kroku:

public class BookStoreRunSteps {private BookStore store; nájdený súkromný zoznamKnihy; @ Pred public void setUp () {store = new BookStore (); foundBooks = new ArrayList (); } // Definície kedy a potom ...}

3.1. Zoznam zoznamov

Najzákladnejšou metódou na spracovanie tabuľkových údajov je prevod súboru Údajová tabuľka argument do zoznamu zoznamov. Môžeme vytvoriť tabuľku bez hlavičky, aby sme demonštrovali:

Scenár: Opravte nenulový počet kníh nájdených podľa autora podľa zoznamu Vzhľadom na to, že mám v obchode nasledujúce knihy podľa zoznamu | Diabol v Bielom meste Erik Larson | | Lev, čarodejnica a šatník C.S. Lewis | | V záhrade zvierat Erik Larson | Keď hľadám knihy od autora Erik Larson, potom nájdem 2 knihy

Uhorka prevádza vyššie uvedenú tabuľku na a zoznam zoznamov, s ktorým sa každý riadok zaobchádza ako so zoznamom hodnôt stĺpcov. Uhorka teda analyzuje každý riadok na zoznam, ktorý obsahuje ako prvý prvok názov knihy a ako druhý autor:

[[„„ Diabol v Bielom meste “,„ Erik Larson “], [„ Lev, čarodejnica a šatník “,„ C.S. Lewis “], [„ V záhrade zvierat “,„ Erik Larson “]]

Používame ako Zoznamy metóda - dodávka a Reťazec.trieda argument - previesť Údajová tabuľka argument k a Zoznam. Toto Trieda argument informuje ako Zoznamy metóda, aký dátový typ očakávame od každého prvku. V našom prípade chceme, aby bol názov a autor String hodnoty. Dodávame teda Reťazec.trieda:

@Given ("^ Mám v obchode nasledujúce knihy podľa zoznamu $") public void haveBooksInTheStoreByList (tabuľka DataTable) {Zoznam riadky = table.asLists (String.class); pre (Zoznam stĺpcov: riadky) {store.addBook (nová kniha (columns.get (0), columns.get (1))); }}

Potom iterujeme každý prvok podzoznamu a vytvoríme zodpovedajúci Kniha objekt. Na záver pridáme každý vytvorený Kniha namietať proti nášmu BookStore objekt.

Ak sme analyzovali údaje obsahujúce nadpis, prvý rad by sme preskočili pretože Uhorka pri zozname zoznamov nerozlišuje medzi nadpismi a údajmi o riadkoch.

3.2. Zoznam máp

Zatiaľ čo zoznam zoznamov poskytuje základný mechanizmus na extrahovanie prvkov z dátovej tabuľky, implementácia tohto kroku môže byť záhadná. Uhorka poskytuje zoznam mechanizmov máp ako čitateľnejšiu alternatívu.

V tomto prípade, musíme zadať smer pre náš stôl:

Scenár: Opravte nenulový počet kníh nájdených autorom podľa mapy Vzhľadom na to, že v obchode mám tieto knihy | názov | autor | | Diabol v Bielom meste Erik Larson | | Lev, čarodejnica a šatník C.S. Lewis | | V záhrade zvierat Erik Larson | Keď hľadám knihy od autora Erika Larsona, nájdem 2 knihy

Podobne ako v prípade mechanizmu zoznamov, aj uhorka vytvorí zoznam obsahujúci každý riadok, ale namiesto toho mapuje hlavičku stĺpca na každú hodnotu stĺpca. Uhorka opakuje tento proces pre každý nasledujúci riadok:

[{"title": "Diabol v bielom meste", "autor": "Erik Larson"}, {"title": "Lev, čarodejnica a šatník", "autor": "CS Lewis"} , {"title": "V záhrade zvierat", "autor": "Erik Larson"}]

Používame akoMapy metóda - dodanie dvoch Reťazec.trieda argumenty - previesť Údajová tabuľka argument k a Zoznam. Prvý argument označuje dátový typ kľúča (hlavičky) a druhý označuje dátový typ každej hodnoty stĺpca. Dodávame teda dva Reťazec.trieda argumenty, pretože všetky naše hlavičky (kľúč) a názov a autor (hodnoty) sú všetky Strings.

Potom každú iterujeme Mapa objekt a extrahujte každú hodnotu stĺpca pomocou hlavičky stĺpca ako kľúča:

@Given ("^ Mám v obchode nasledujúce knihy podľa mapy $") public void haveBooksInTheStoreByMap (tabuľka DataTable) {Zoznam riadky = table.asMaps (String.class, String.class); pre (Map stĺpce: riadky) {store.addBook (nová kniha (columns.get ("názov"), columns.get ("autor"))); }}

3.3. Stolový transformátor

Posledným (a najbohatším) mechanizmom na prevod tabuliek s údajmi na použiteľné objekty je vytvorenie a TableTransformer. A TableTransformer je objekt, ktorý dáva pokyn Cucumberovi, ako prevádzať a Údajová tabuľka objekt na požadovaný doménový objekt:

Pozrime sa na príklad scenára:

Scenár: Opravte nenulový počet kníh nájdených autorom s transformátorom Vzhľadom na to, že mám v obchode s transformátorom nasledujúce knihy | názov | autor | | Diabol v Bielom meste Erik Larson | | Lev, čarodejnica a šatník C.S. Lewis | | V záhrade zvierat Erik Larson | Keď hľadám knihy od autora Erika Larsona, nájdem 2 knihy

Aj keď je zoznam máp so svojimi kľúčovými údajmi v stĺpci presnejší ako zoznam zoznamov, stále definujeme náš krok s logikou prevodu. Namiesto toho mali by sme definovať náš krok s požadovaným objektom domény (v tomto prípade a BookCatalog) ako argument:

@Given ("^ Mám v obchode nasledujúce knihy s transformátorom $") public void haveBooksInTheStoreByTransformer (katalóg BookCatalog) {store.addAllBooks (catalog.getBooks ()); }

Urobiť toto, musíme vytvoriť vlastnú implementáciu TypeRegistryConfigurer rozhranie.

Táto implementácia musí vykonávať dve veci:

  1. Vytvorte nový TableTransformer implementácia.
  2. Zaregistrujte túto novú implementáciu pomocou configureTypeRegistry metóda.

Ak chcete zachytiť Údajová tabuľka do použiteľného objektu domény, vytvoríme a BookCatalog trieda:

public class BookCatalog {private List books = new ArrayList (); public void addBook (Book book) {books.add (book); } // štandardný getter ...}

Na vykonanie transformácie implementujme TypeRegistryConfigurer rozhranie:

verejná trieda BookStoreRegistryConfigurer implementuje TypeRegistryConfigurer {@Override public Locale locale () {return Locale.ENGLISH; } @Override public void configureTypeRegistry (TypeRegistry typeRegistry) {typeRegistry.defineDataTableType (new DataTableType (BookCatalog.class, new BookTableTransformer ())); } // ...

a potom implementovať TableTransformer rozhranie pre našu BookCatalog trieda:

 súkromná statická trieda BookTableTransformer implementuje TableTransformer {@Override verejná transformácia BookCatalog (tabuľka DataTable) hodí Throwable {BookCatalog catalog = new BookCatalog (); table.cells () .stream () .skip (1) // Preskočiť riadok hlavičky .map (polia -> nová kniha (fields.get (0), fields.get (1))) .forEach (katalóg :: addBook ); katalóg na vrátenie tovaru; }}}

Upozorňujeme, že transformujeme anglické údaje z tabuľky, a preto vrátime anglické miestne nastavenie z nášho miestne nastavenie () metóda. Pri analýze údajov v inom národnom prostredí musíme zmeniť návratový typ súboru miestne nastavenie () metódu na príslušné miestne nastavenie.

Keďže sme do nášho scenára zahrnuli hlavičku tabuľky s údajmi, pri iterácii nad bunkami tabuľky musíme prvý riadok preskočiť (teda preskočiť (1) hovor). Odstránili by sme preskočiť (1) hovor, ak naša tabuľka neobsahovala hlavičku.

V predvolenom nastavení je Predpokladá sa, že kód lepidla spojený s testom je v rovnakom balíku ako trieda bežcov. Ak teda zahrnieme našu, nie je potrebná žiadna ďalšia konfigurácia BookStoreRegistryConfigurer v rovnakom balíku ako naša trieda bežcov. Ak pridáme konfigurátor do iného balíka, balíček musíme výslovne zahrnúť do @CucumberOptionslepidlo lúka pre triedu bežcov.

4. Záver

V tomto článku sme sa zamerali na to, ako definovať Gherkinov scenár s tabuľkovými údajmi pomocou údajovej tabuľky. Ďalej sme preskúmali tri spôsoby implementácie definície kroku, ktorá spotrebuje údajovú tabuľku uhorky.

Zatiaľ čo pre základné tabuľky stačí zoznam zoznamov a zoznam máp, transformátor tabuliek poskytuje oveľa bohatší mechanizmus schopný zvládnuť zložitejšie údaje.

Celý zdrojový kód tohto článku nájdete na GitHub.


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