Uborka adattáblák

1. Bemutatkozás

Az uborka egy viselkedésalapú fejlesztési (BDD) keretrendszer, amely lehetővé teszi a fejlesztők számára, hogy szöveges tesztelési forgatókönyveket készítsenek a Gherkin nyelv segítségével. Sok esetben ezek a szcenáriók megkövetelik az áladatok használatát egy szolgáltatás gyakorlásához, amelyet nehézkes beinjektálni - különösen összetett vagy többszörös bejegyzések esetén.

Ebben az oktatóanyagban megvizsgáljuk, hogyan lehet az uborka adattáblázatait felhasználni az áladatok olvasható módon történő felvételére.

2. Forgatókönyv-szintaxis

Az uborka-forgatókönyvek meghatározásakor gyakran beadunk olyan tesztadatokat, amelyeket a forgatókönyv többi része használ:

Forgatókönyv: Helyes, a szerző által talált könyvek nullától eltérő száma. Mivel van egy könyvem a boltban, Az ördög a fehér városban, Erik Larson, amikor Erik Larson szerző könyveit keresem, akkor találok 1 könyvet

2.1. Adattáblák

Míg a belső adatok elegendőek egyetlen könyvhez, a forgatókönyvünk összezavarodhat, ha több könyvet ad hozzá. Ennek kezelésére létrehozunk egy adattáblát a forgatókönyvünkben:

Forgatókönyv: Helyes, a szerző által talált könyvek nullától eltérő száma. Mivel a következő könyvek vannak a boltban | Az ördög a fehér városban Erik Larson | | Az oroszlán, a boszorkány és a szekrény | C.S. Lewis | | A Vadállatok Kertjében | Erik Larson | Amikor Erik Larson író könyveit keresem, akkor 2 könyvet találok

Adattáblázatunkat az adatrész részeként definiáljuk Adott záradék által behúzva a táblázatot a Adott kikötés. Ennek az adattáblának a segítségével tetszőleges számú könyvet adhatunk üzletünkbe - csak egyetlen könyvet is beleértve - sorok hozzáadásával vagy eltávolításával.

Ezenkívül adattáblák bármilyen záradékkal használhatók - nem csak Adott záradékok.

2.2. Címsorokkal együtt

Nyilvánvaló, hogy az első oszlop a könyv címét, a második oszlop a könyv szerzőjét jelenti. Az egyes oszlopok jelentése azonban nem mindig annyira nyilvánvaló.

Ha pontosításra van szükség, fejlécet vehetünk fel egy új első sor hozzáadásával:

Forgatókönyv: A szerző által talált könyvek helyes száma nem nulla, mivel a következő könyvek vannak a boltban cím | szerző | | Az ördög a fehér városban Erik Larson | | Az oroszlán, a boszorkány és a szekrény | C.S. Lewis | | A Vadállatok Kertjében | Erik Larson | Amikor Erik Larson író könyveit keresem, akkor 2 könyvet találok

Míg a fejléc csak egy másik sornak tűnik a táblázatban, ennek az első sornak különleges jelentése van amikor táblázatunkat a következő szakaszban szereplő térképek listájává elemezzük.

3. Lépésdefiníciók

A forgatókönyvünk elkészítése után megvalósítjuk a Adott lépés meghatározása. Adattáblát tartalmazó lépés esetén: módszereinket a Adattábla érv:

@Given ("néhány kifejezés") public void somePhrase (DataTable táblázat) {// ...}

A Adattábla Az object tartalmazza a forgatókönyvünkben definiált adattáblázat táblázatos adatait, valamint módszerek ezen adatok felhasználható információkká történő átalakítására. Általában háromféle módon lehet átalakítani egy adattáblát az Uborka-ban: (1) listák listája, (2) térképek listája és (3) táblázat transzformátor.

Az egyes technikák bemutatásához egy egyszerűt fogunk használni Könyv domain osztály:

public class Könyv {private String cím; magánhúr-szerző; // szabványos kivitelezők, szerelők és szerelők ...}

Ezenkívül létrehozunk egy Könyvesbolt osztály kezeli Könyv tárgyak:

public class BookStore {private List books = new ArrayList (); public void addBook (Könyvkönyv) {books.add (könyv); } public void addAllBooks (Gyűjteménykönyvek) {this.books.addAll (könyvek); } public Könyvek listájaByAuthor (karakterlánc-készítő) {return books.stream () .filter (könyv -> Objects.equals (szerző, book.getAuthor ())) .collect (Collectors.toList ()); }}

A következő esetek mindegyikéhez egy alapvető lépésdefinícióval kezdünk:

nyilvános osztályú BookStoreRunSteps {privát BookStore áruház; privát List foundBooks; @ Nyilvános void előtt setUp () {store = new BookStore (); foundBooks = new ArrayList (); } // Mikor és akkor definíciók ...}

3.1. Listák listája

A táblázatos adatok kezelésének legalapvetőbb módja a Adattábla argumentumot a listák listájába. Hozhatunk létre egy táblázatot fejléc nélkül, hogy bemutassuk:

Forgatókönyv: A szerzők által listánként talált helyes, nullától eltérő könyvek száma, mivel a következő könyvek vannak a boltban listánként | Az ördög a fehér városban Erik Larson | | Az oroszlán, a boszorkány és a szekrény | C.S. Lewis | | A Vadállatok Kertjében | Erik Larson | Amikor Erik Larson író könyveit keresem, akkor 2 könyvet találok

Az uborka a fenti táblázatot a-vá alakítja listák felsorolása úgy, hogy az egyes sorokat az oszlopértékek listájaként kezeli. Így az uborka minden sort felsorol egy listára, amely első elemként a könyv címét, másodikként a szerzőt tartalmazza:

[["Az ördög a fehér városban", "Erik Larson"], ["Az oroszlán, a boszorkány és a ruhásszekrény", "C.S. Lewis"], ["A fenevadak kertjében", "Erik Larson"]]

Használjuk a asLists módszer - ellátás a Karakterlánc.osztály argumentum - a Adattábla érv a Lista. Ez Osztály érv tájékoztatja a asLists módszer milyen adattípusra számítunk az egyes elemektől. Esetünkben azt akarjuk, hogy a cím és a szerző legyen Húr értékek. Így ellátjuk Karakterlánc.osztály:

@Given ("^ Az áruházban a következő könyvek vannak $ list szerint" ") public void haveBooksInTheStoreByList (DataTable table) {List sorok = table.asLists (karakterlánc.osztály); for (Lista oszlopok: sorok) {store.addBook (új Könyv (oszlopok.get (0), oszlopok.get (1))); }}

Ezután iteráljuk az allista minden elemét, és létrehozunk egy megfelelőt Könyv tárgy. Végül hozzáadunk minden létrehozottat Könyv kifogásolni a mi Könyvesbolt tárgy.

Ha elemezünk egy címsort tartalmazó adatokat, kihagynánk az első sort mivel az uborka nem tesz különbséget a fejlécek és a sorok között a listák listáján.

3.2. Térképek listája

Míg a listák felsorolása megalapozó mechanizmust biztosít az elemek adattáblából történő kinyerésére, a lépés megvalósítása rejtélyes lehet. Uborka olvashatóbb alternatívaként felsorolja a térképek listáját.

Ebben az esetben, címet kell adnunk az asztalunkhoz:

Forgatókönyv: A szerzők által talált térképek helyes, nem nulla száma térkép alapján. A térképen a következő könyvek vannak a boltban | cím | szerző | | Az ördög a fehér városban Erik Larson | | Az oroszlán, a boszorkány és a szekrény | C.S. Lewis | | A Vadállatok Kertjében | Erik Larson | Amikor Erik Larson író könyveit keresem, akkor 2 könyvet találok

A listák listamechanizmusához hasonlóan az Uborka létrehoz egy listát, amely minden sort tartalmaz, de helyette az oszlop fejlécét minden oszlop értékéhez hozzárendeli. Az uborka megismétli ezt a folyamatot minden következő sor esetében:

[{"title": "Az ördög a fehér városban", "szerző": "Erik Larson"}, {"title": "Az oroszlán, a boszorkány és a ruhásszekrény", "author": "CS Lewis"} , {"title": "A vadállatok kertjében", "szerző": "Erik Larson"}]

Használjuk a asMaps módszer - kettő ellátása Karakterlánc.osztály argumentumok - a Adattábla érv a Lista. Az első argumentum a kulcs (fejléc) adattípusát, a második pedig az egyes oszlopértékek adattípusát jelöli. Így kettőt szállítunk Karakterlánc.osztály érvek, mert a fejlécünk (kulcs), a cím és a szerző (az értékek) mind Húrs.

Aztán mindegyiket iteráljuk Térkép objektumot, és vonja ki az egyes oszlopértékeket, az oszlopfejlécet használva kulcsként:

@Given ("^ A következő könyveket tartom a boltban $ térkép alapján") public void haveBooksInTheStoreByMap (DataTable table) {List sorok = table.asMaps (String.osztály, String.osztály); for (Térkép oszlopok: sorok) {store.addBook (új könyv (oszlopok.get ("cím"), oszlopok.get ("szerző"))); }}

3.3. Asztali transzformátor

Az adattáblák használható objektumokká alakításának utolsó (és leggazdagabb) mechanizmusa a TableTransformer. A TableTransformer van egy objektum, amely utasítja az uborkát a konverzióról Adattábla objektum a kívánt tartomány objektummal:

Lássunk egy példát:

Forgatókönyv: A szerző által a transzformátorral talált könyvek helyes száma, nulla nélkül Adott, hogy a következő könyvek vannak a boltban transzformátorral | cím | szerző | | Az ördög a fehér városban Erik Larson | | Az oroszlán, a boszorkány és a szekrény | C.S. Lewis | | A Vadállatok Kertjében | Erik Larson | Amikor Erik Larson író könyveit keresem, akkor 2 könyvet találok

Míg a térképek listája, annak kulcsolt oszlopadataival, pontosabb, mint a listák listája, a lépésdefiníciónkat mégis átalakítjuk a konverziós logikával. Helyette, meg kell határoznunk a lépésünket a kívánt domain objektummal (ebben az esetben a BookCatalog) érvként:

@Given ("^ A következő könyvek vannak a boltban a $ transzformátorral") public void haveBooksInTheStoreByTransformer (BookCatalog catalog) {store.addAllBooks (catalog.getBooks ()); }

Ezt csináld meg, létre kell hoznunk a TypeRegistryConfigurer felület.

Ennek a megvalósításnak két dolgot kell végrehajtania:

  1. Újat csinálni TableTransformer végrehajtás.
  2. Regisztrálja ezt az új megvalósítást a configureTypeRegistry módszer.

A Adattábla használható domain objektummá hozunk létre egy BookCatalog osztály:

public class BookCatalog {private List books = new ArrayList (); public void addBook (Könyvkönyv) {books.add (könyv); } // szokásos getter ...}

Az átalakítás végrehajtásához hajtsuk végre a TypeRegistryConfigurer felület:

public class BookStoreRegistryConfigurer hajtja végre a TypeRegistryConfigurer {@Override public Locale locale () {return Locale.ENGLISH; } @Override public void configureTypeRegistry (TypeRegistry typeRegistry) {typeRegistry.defineDataTableType (new DataTableType (BookCatalog.class, new BookTableTransformer ())); } // ...

majd végrehajtja a TableTransformer felület a mi BookCatalog osztály:

 privát statikus osztály BookTableTransformer megvalósítja a TableTransformer {@Override public BookCatalog transzformáció (DataTable tábla) dobja Throwable {BookCatalog catalog = new BookCatalog (); table.cells () .stream () .skip (1) // A fejléc sorának átugrása .map (mezők -> új könyv (fields.get (0), fields.get (1))) .forEach (catalog :: addBook ); visszatérési katalógus; }}}

Ne feledje, hogy az angol nyelvű adatokat a táblázatból alakítjuk át, ezért visszaküldjük az angol nyelv területi beállításait területi beállítás () módszer. Amikor adatokat elemezünk egy másik nyelven, meg kell tennünk megváltoztatja a területi beállítás () módszer a megfelelő területi beállításra.

Mivel a forgatókönyvünkbe egy adattábla fejlécet is felvettünk, ki kell hagynunk az első sort, amikor iterálunk a táblázat celláin (innen a kihagy (1) hívás). Eltávolítanánk a kihagy (1) hívja, ha táblázatunk nem tartalmazott fejlécet.

Alapértelmezés szerint a A teszthez tartozó ragasztókód feltételezhetően ugyanabban a csomagban van, mint a futóosztály. Ezért nincs szükség további konfigurálásra, ha a sajátunkat belefoglaljuk BookStoreRegistryConfigurer ugyanabban a csomagban, mint a futóosztályunk. Ha a konfigurálót egy másik csomagba vesszük, kifejezetten fel kell tennünk a csomagot a @UborkaOptionsragasztó terület a futóosztály számára.

4. Következtetés

Ebben a cikkben megvizsgáltuk, hogyan definiálhatunk Gherkin-forgatókönyvet táblázatos adatokkal egy adattábla segítségével. Ezenkívül három módszert tártunk fel egy lépésmeghatározás megvalósításához, amely egy uborka adattáblát fogyaszt.

Míg a listák és a térképek listája elegendő az alaptáblákhoz, a táblázattranszformátor sokkal gazdagabb mechanizmust biztosít, amely bonyolultabb adatok kezelésére képes.

A cikk teljes forráskódja megtalálható a GitHub oldalon.