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
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:
- Újat csinálni TableTransformer végrehajtás.
- 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.