Tablice podataka o krastavcima

1. Uvod

Krastavac je okvir za ponašanje usmjeren na ponašanje (BDD) koji programerima omogućuje stvaranje testnih scenarija temeljenih na tekstu pomoću jezika Gherkin. U mnogim slučajevima ovi scenariji zahtijevaju lažne podatke da bi izvršili značajku, što može biti nezgodno ubrizgati - posebno kod složenih ili višestrukih unosa.

U ovom ćemo uputstvu pogledati kako koristiti tablice podataka s krastavcima kako bi na čitljiv način uključili lažne podatke.

2. Sintaksa scenarija

Kada definiramo scenarije krastavca, često ubrizgavamo testne podatke koje koristi ostatak scenarija:

Scenarij: Ispravan ne-nulan broj knjiga koje je autor pronašao S obzirom da u trgovini imam knjigu pod nazivom The Devil in the White City, autora Erika Larsona Kada tražim knjige autora Erika Larsona Tada pronalazim 1 knjigu

2.1. Tablice podataka

Iako su umetnuti podaci dovoljni za jednu knjigu, naš scenarij može postati pretrpan dodavanjem više knjiga. Da bismo to riješili, u našem scenariju izrađujemo tablicu podataka:

Scenarij: Točan broj knjiga koje autor nije pronašao nije nula S obzirom da u trgovini imam sljedeće knjige | Đavao u bijelom gradu | Erik Larson | | Lav, vještica i ormar | C.S. Lewis | | U vrtu zvijeri | Erik Larson | Kada tražim knjige autora Erika Larsona Tada pronalazim 2 knjige

Našu tablicu podataka definiramo kao dio naše S obzirom klauzula od uvlačenje tablice ispod teksta S obzirom klauzula. Pomoću ove tablice podataka u našu trgovinu možemo dodati proizvoljan broj knjiga - uključujući samo jednu knjigu dodavanjem ili uklanjanjem redaka.

Dodatno, tablice podataka mogu se koristiti s bilo kojom klauzulom - ne samo S obzirom klauzule.

2.2. Uključujući naslove

Očito je da prvi stupac predstavlja naslov knjige, a drugi stupac autora knjige. Značenje svakog stupca ipak nije uvijek tako očito.

Kada je potrebno pojašnjenje, možemo uključiti zaglavlje dodavanjem novog prvog retka:

Scenarij: Točan broj knjiga koje autor nije pronašao nije nula S obzirom da u trgovini imam sljedeće knjige | naslov | autor | | Đavao u bijelom gradu | Erik Larson | | Lav, vještica i ormar | C.S. Lewis | | U vrtu zvijeri | Erik Larson | Kada tražim knjige autora Erika Larsona Tada pronalazim 2 knjige

Iako se čini da je zaglavlje samo još jedan redak u tablici, ovaj prvi red ima posebno značenje kada svoju tablicu raščlanimo na popis karata u sljedećem odjeljku.

3. Definicije koraka

Nakon stvaranja našeg scenarija, implementiramo S obzirom definicija koraka. U slučaju koraka koji sadrži tablicu podataka, svoje metode provodimo s a DataTable argument:

@Given ("neki izraz") javna void somePhrase (tablica tablice podataka) {// ...}

The DataTable objekt sadrži tablične podatke iz tablice podataka koju smo definirali u našem scenariju, kao i metode za pretvaranje ovih podataka u korisne informacije. Općenito postoje tri načina za transformiranje tablice podataka u Krastavcu: (1) popis popisa, (2) popis karata i (3) transformator tablice.

Za demonstraciju svake tehnike poslužit ćemo se jednostavnom Knjiga klasa domene:

knjiga javnog razreda {naslov privatnog niza; privatni autor niza; // standardni konstruktori, getteri i postavljači ...}

Uz to ćemo stvoriti i Knjižara razred koji upravlja Knjiga objekti:

javna klasa BookStore {privatni popis knjiga = novi ArrayList (); public void addBook (Knjiga knjiga) {books.add (knjiga); } public void addAllBooks (knjige iz zbirke) {this.books.addAll (knjige); } javni popis booksByAuthor (autor niza) {return books.stream () .filter (book -> Objects.equals (author, book.getAuthor ())) .collect (Collectors.toList ()); }}

Za svaki od sljedećih scenarija započet ćemo s osnovnom definicijom koraka:

javni razred BookStoreRunSteps {privatna trgovina BookStore; privatni popis foundBooks; @Prije javne void setUp () {store = new BookStore (); foundBooks = novi ArrayList (); } // Kada i tada definicije ...}

3.1. Popis popisa

Najosnovnija metoda za rukovanje tabličnim podacima je pretvaranje DataTable argument u popis popisa. Možemo stvoriti tablicu bez zaglavlja kako bismo demonstrirali:

Scenarij: Ispravan ne-nulti broj knjiga koje je autor pronašao prema popisu S obzirom da u trgovini imam sljedeće knjige po popisu | Đavao u bijelom gradu | Erik Larson | | Lav, vještica i ormar | C.S. Lewis | | U vrtu zvijeri | Erik Larson | Kada tražim knjige autora Erika Larsona Tada pronalazim 2 knjige

Krastavac pretvara gornju tablicu u Popis popisa tretirajući svaki redak kao popis vrijednosti stupaca. Dakle, Krastavac raščlanjuje svaki redak na popis koji sadrži naslov knjige kao prvi element, a autor kao drugi:

[["Đavo u bijelom gradu", "Erik Larson"], ["Lav, vještica i ormar", "C.S. Lewis"], ["U vrtu zvijeri", "Erik Larson"]]

Koristimo asPopisi metoda - opskrba a String.razred argument - pretvoriti DataTable argument a Popis. Ovaj Razred argument obavještava asPopisi metoda kakav tip podataka očekujemo da bude svaki element. U našem slučaju želimo da bude naslov i autor Niz vrijednosti. Dakle, mi isporučujemo String.razred:

@Given ("^ Imam sljedeće knjige u trgovini po popisu $") javna praznina haveBooksInTheStoreByList (tablica DataTable) {Popis redovi = table.asLists (String.class); za (Stupci popisa: retci) {store.addBook (nova Knjiga (columns.get (0), columns.get (1))); }}

Zatim prelazimo preko svakog elementa podspiska i stvaramo odgovarajući Knjiga objekt. Na kraju dodajemo svako stvoreno Knjiga prigovoriti našem Knjižara objekt.

Ako smo raščlanili podatke koji sadrže naslov, preskočili bismo prvi red budući da Krastavac ne razlikuje naslove i podatke redaka za popis popisa.

3.2. Popis karata

Iako popis popisa pruža temeljni mehanizam za izdvajanje elemenata iz tablice podataka, implementacija koraka može biti tajna. Krastavac nudi popis mehanizama karata kao čitljiviju alternativu.

U ovom slučaju, moramo osigurati naslov za naš stol:

Scenarij: Ispravan ne-nulti broj knjiga koje je autor pronašao prema karti S obzirom da u trgovini imam sljedeće knjige prema karti | naslov | autor | | Đavao u bijelom gradu | Erik Larson | | Lav, vještica i ormar | C.S. Lewis | | U vrtu zvijeri | Erik Larson | Kada tražim knjige autora Erika Larsona Tada pronalazim 2 knjige

Slično mehanizmu popisa popisa, i Krastavac stvara popis koji sadrži svaki redak, ali umjesto toga preslikava naslov stupca na svaku vrijednost stupca. Krastavac ponavlja postupak za svaki sljedeći red:

[{"title": "Vrag u bijelom gradu", "author": "Erik Larson"}, {"title": "Lav, vještica i ormar", "author": "CS Lewis"} , {"title": "U vrtu zvijeri", "author": "Erik Larson"}]

Koristimo asMaps metoda - opskrba dvoje String.razred argumenti - za pretvaranje DataTable argument a Popis. Prvi argument označava vrstu podataka ključa (zaglavlja), a drugi označava vrstu podataka svake vrijednosti stupca. Dakle, isporučujemo dvije String.razred argumenti jer su naša zaglavlja (ključ) i naslov i autor (vrijednosti) Nizs.

Zatim ponovimo svaku Karta objekt i izdvojite svaku vrijednost stupca koristeći zaglavlje stupca kao ključ:

@Given ("^ Imam sljedeće knjige u trgovini prema mapi $") javna praznina haveBooksInTheStoreByMap (tablica DataTable) {Popis redovi = table.asMaps (String.class, String.class); za (Stupci mape: redovi) {store.addBook (nova Knjiga (kolone.get ("naslov"), stupci.get ("autor"))); }}

3.3. Stolni transformator

Konačni (i najbogatiji) mehanizam za pretvaranje tablica podataka u korisne objekte je stvaranje a TableTransformer. A TableTransformer je objekt koji upućuje Krastavac kako pretvoriti a DataTable objekt željenom objektu domene:

Pogledajmo primjer scenarija:

Scenarij: Ispravan ne-nulti broj knjiga koje je autor pronašao s transformatorom S obzirom da imam sljedeće knjige u trgovini s transformatorom | naslov | autor | | Đavao u bijelom gradu | Erik Larson | | Lav, vještica i ormar | C.S. Lewis | | U vrtu zvijeri | Erik Larson | Kada tražim knjige autora Erika Larsona Tada pronalazim 2 knjige

Iako je popis karata s ključnim podacima stupca precizniji od popisa, definiciju koraka i dalje pretrpavamo logikom pretvorbe. Umjesto toga, trebali bismo definirati svoj korak sa željenim objektom domene (u ovom slučaju, a BookCatalog) kao argument:

@Given ("^ Imam sljedeće knjige u trgovini s transformatorima $") javna praznina haveBooksInTheStoreByTransformer (katalog BookCatalog) {store.addAllBooks (catalog.getBooks ()); }

Uraditi ovo, moramo stvoriti prilagođenu implementaciju TypeRegistryConfigurer sučelje.

Ova implementacija mora izvesti dvije stvari:

  1. Stvori novo TableTransformer provedba.
  2. Registrirajte ovu novu implementaciju pomoću configureTypeRegistry metoda.

Za hvatanje DataTable u korisni objekt domene, stvorit ćemo BookCatalog razred:

public class BookCatalog {privatni popis knjiga = novi ArrayList (); public void addBook (Knjiga knjiga) {books.add (knjiga); } // standardni getter ...}

Da bismo izvršili transformaciju, provedimo TypeRegistryConfigurer sučelje:

javna klasa BookStoreRegistryConfigurer implementira TypeRegistryConfigurer {@Napravite javni lokalni jezik () {return Locale.ENGLISH; } @Override public void configureTypeRegistry (TypeRegistry typeRegistry) {typeRegistry.defineDataTableType (new DataTableType (BookCatalog.class, new BookTableTransformer ())); } // ...

a zatim implementirati TableTransformer sučelje za naš BookCatalog razred:

 privatna statička klasa BookTableTransformer implementira TableTransformer {@Override javna BookCatalog transformacija (tablica DataTable) baca Throwable {BookCatalog catalog = new BookCatalog (); table.cells () .stream () .skip (1) // Preskoči redak zaglavlja .map (polja -> nova knjiga (polja.get (0), polja.get (1))). forEach (katalog :: addBook ); povratni katalog; }}}

Imajte na umu da transformiramo podatke iz engleskog iz tablice, pa stoga vraćamo engleski jezik iz našeg lokalitet () metoda. Kad raščlanjujemo podatke na drugom jeziku, moramo promijenite vrstu povrata lokalitet () metodu na odgovarajući jezik.

Budući da smo u naš scenarij uključili zaglavlje tablice podataka, moramo preskočiti prvi redak kada se prevlačimo preko ćelija tablice (dakle preskočiti (1) poziv). Uklonili bismo preskočiti (1) nazovite ako naša tablica nije sadržavala zaglavlje.

Prema zadanim postavkama Kôd ljepila povezan s testom pretpostavlja se da je u istom paketu kao i klasa trkača. Stoga nije potrebna dodatna konfiguracija ako uključimo našu BookStoreRegistryConfigurer u istom paketu kao i naša klasa trkača. Ako dodamo configurer u drugi paket, moramo izričito uključiti paket u @CucumberOptionsljepilo polje za klasu trkača.

4. Zaključak

U ovom smo članku pogledali kako definirati Gherkinov scenarij s tabličnim podacima pomoću tablice podataka. Uz to, istražili smo tri načina implementacije definicije koraka koja troši tablicu podataka o krastavcu.

Iako su popis popisa i popis karata dovoljni za osnovne tablice, transformator tablice pruža mnogo bogatiji mehanizam sposoban za obradu složenijih podataka.

Kompletni izvorni kôd ovog članka nalazi se na GitHubu.


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