step argument transformations specflow tables
Výukový program pre tabuľky transformácií argumentov a tabuľky Specflow:
Náš predchádzajúci tutoriál Specflow nás všetkých informoval Zdieľané a rozsahované viazanie, háky a opakované použitie podrobne. Tu v tomto tutoriále preskúmame viac informácií o transformáciách argumentov kroku v Specflow.
Pokojne si prečítajte naše Kompletný výcvikový sprievodca Specflow pre začiatočníkov pre jasné pochopenie pojmu. Funkcia Specflow s transformáciou krokových argumentov umožňuje používateľovi poskytnúť vlastnú transformáciu parametrov dodaných v krokoch.
Umožňuje pridať vlastnú logiku na prevod vstupných parametrov na konkrétny parameter. Napríklad, môžete priamo vytvoriť objekt triedy z parametrov a vrátiť vytvorený objekt z transformačnej funkcie.
Ďalšou vlastnosťou Specflow, na ktorú sa pozrieme, sú tabuľky Specflow, ktoré umožňujú odovzdávanie vstupných údajov v tabuľkovej forme jediným krokom a pomocníci s tabuľkami ich môžu podľa potreby namapovať priamo na inštanciu objektu.
Pozri si video:
Tu je videonávod o tabuľkách Transformácie argumentov argumentov a Specflow:
Čo sa dozviete:
Krokové transformácie argumentov
Aby sme transformáciám argumentov porozumeli lepšie, skúsme najskôr zistiť, ako presne Specflow zodpovedá parametrom. Ako sme videli v našich predchádzajúcich článkoch, v príklade vyhľadávania YouTube sme hľadaný výraz odovzdávali ako parameter scenára, ktorý sa má vykonať.
Priraďovanie parametrov sa zvyčajne deje prostredníctvom regulárneho výrazu a výsledkom zodpovedajúceho regulárneho výrazu je nastavenie parametra metódy na zadaný hľadaný výraz v kroku.
Najprv sa pokúsime pochopiť, aké sú predvolené podporované konverzie v Specflow a kedy môžu byť užitočné transformácie argumentov.
Podporované konverzie
Specflow podporuje veľa konverzií po rozbalení, keď sa pozrie na samotný dátový typ po zhode regexu. Môže sa automaticky postarať o konverzie ako - String, integer, GUID, Enums atď.
Nižšie si ukážeme príklad niektorých z nich:
Scenario: Get Transactions in my account Given I have entered customer name as Test Customer And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e And I select sorting order as DESCENDING And I select number of transactions to be displayed as 25 Then I should see my account transactions
Vo vyššie uvedenej ukážke kódu sme zvýraznili rôzne typy vstupu, ktoré prechádzame v krokoch, a v krokových implementáciách sa tieto prevádzajú na príslušné dátové typy.
Pozrime sa na postupové implementácie týchto krokov (pre jednoduchosť sme práve vytvorili konzolu pre každý z krokov, aby sme ilustrovali, že zadaný argument sa automaticky prevedie na očakávaný typ):
[Given(@'I have entered customer name as (.*)')] public void GivenIHaveEnteredCustomerNameAsTestCustomer(String customerName) { Console.Out.WriteLine(customerName); } [Given(@'I have entered customer account id as (.*)')] public void GivenIHaveEnteredCustomerAccountIdAs(Guid accountId) { Console.Out.WriteLine(accountId.ToString()); } [Given(@'I select sorting order as (.*)')] public void GivenISelectSortingOrderAsAscending(SortOrder sortOrder) { Console.Out.WriteLine(sortOrder.ToString()); } [Then(@'I should see my account transactions')] public void ThenIShouldSeeMyAccountTransactions() { Console.Out.WriteLine('success!'); } [Given(@'I select number of transactions to be displayed as (.*)')] public void GivenISelectNumberOfTransactionsToBeDisplayedAs(int p0) { Console.Out.WriteLine(p0.ToString());
Po vykonaní vyššie uvedeného scenára výstup úspešne vytlačí všetky hodnoty indikáciou, že automatická konverzia argumentov na očakávané typy údajov bola úspešná.
Takto vyzerá výstup:
Given I have entered customer name as Test Customer Test Customer -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerNameAsTestCustomer('Test Customer') (0.0s) And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e 0f8fad5b-d9cb-469f-a165-70867728950e -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerAccountIdAs(0f8fad5b-d9cb-469...) (0.0s) And I select sorting order as DESCENDING DESCENDING -> done: SupportedSpecflowConversions.GivenISelectSortingOrderAsAscending(DESCENDING) (0.0s) And I select number of transactions to be displayed as 25 25 -> done: SupportedSpecflowConversions.GivenISelectNumberOfTransactionsToBeDisplayedAs(25) (0.0s) Then I should see my account transactions success! -> done: SupportedSpecflowConversions.ThenIShouldSeeMyAccountTransactions() (0.0s)
Transformácia argumentov
Pozrime sa na príklad v praxi, aby sme tomu porozumeli. Podpora, máte aplikáciu, ktorá prevádza daný čas a prevádza ho na minúty. Príklad: Ak je vstup používateľa 1 deň - výstup je - 1440, ak je vstup používateľa 1 deň 2 hodiny 2 minúty, potom by výstup mal byť 1562.
Teraz je zrejmé, že na podporu rôznych typov vstupov bude potrebné napísať rôzne implementácie väzieb v závislosti od typu vstupov. Napríklad: Pre vstupy, ktoré majú iba časť dňa, bude existovať samostatná kroková implementácia, pre vstupy, ktoré majú dennú, mesačnú časť - bude samostatná kroková implementácia atď.
Pozrime sa, ako to možno implementovať pomocou jednokrokovej implementácie prostredníctvom transformácie argumentov kroku a poskytnutý vstup sa jednoducho prevedie na objekt časovej pečiatky a vráti sa do pôvodného kroku, ktorý sa nazýva kroková transformácia.
Berte to ako regexové skenovanie prvej úrovne podľa vášho zadania, ktoré vráti čiastočne transformovanú hodnotu do volajúceho kroku.
Pozrite sa na súbor funkcií, ktorý má 3 rôzne varianty vstupu, s jedinou transformáciou tak, že sa prevedie na kompletný objekt časového rozsahu a vráti sa späť.
Scenario: Convert timestamp to minutes - variant 1 Given I have entered 50 days into the timestamp to minute converter When I press calculate Then the result should be 72000.00 on the screen Scenario: Convert timestamp to minutes - variant 2 Given I have entered 1 day, 2 hours, 3 minutes into the timestamp to minute converter When I press calculate Then the result should be 1563.00 on the screen Scenario: Convert timestamp to minutes - variant 3 Given I have entered 1 day, 1 hour, 1 minute, 30 seconds into the timestamp to minute converter When I press calculate Then the result should be 1501.50 on the screen
Pozrite sa na zvýraznené hodnoty vo vyššie uvedenom príklade kódu. Všetky z nich sa postarajú o úplne rovnakú transformáciu a konečným výsledkom bude transformovaná vstupná hodnota TimeSpan, ktorá sa odošle späť do volajúceho Specflow Step.
Pozrime sa na implementáciu Transformácie nižšie:
[StepArgumentTransformation(@'(?:(d*) day(?:s)?(?:, )?)?(?:(d*) hour(?:s)?(?:, )?)?(?:(d*) minute(?:s)?(?:, )?)?(?:(d*) second(?:s)?(?:, )?)?')] public TimeSpan convertToTimeSpan(String days, String hours, String minutes, String seconds) { int daysValue; int hoursValue; int minutesValue; int secondsValue; int.TryParse(days, out daysValue); int.TryParse(hours, out hoursValue); int.TryParse(minutes, out minutesValue); int.TryParse(seconds, out secondsValue); return new TimeSpan(daysValue, hoursValue, minutesValue, secondsValue); }
Aby rámec vedel, že ide o transformačnú väzbu, je potrebné do metódy implementujúcej prevod Argumentu pridať atribút StepArgumentTransformation.
Medzi ďalšie dôležité body, ktoré je potrebné poznamenať v súvislosti s konverziou argumentov, patria:
# 1) Transformácie argumentov kroku prebiehajú pre každý zhodný krok, t. J. Bez ohľadu na typ kroku, t. J. Či je daný, kedy alebo potom, pre každý zodpovedajúci regulárny výraz dôjde k transformácii.
#dva) V závislosti od návratového typu transformovaného výstupu, ak skutočný krok volania nemá zodpovedajúci návratový typ pre vstupný parameter, transformácia sa neuskutoční.
Čo to znamená, predpokladajme, že krok volania vyžaduje transformovaný vstup, ale má uvedenú časovú pečiatku vstupu ako niečo, čo sa nezhoduje s návratovým typom transformovanej metódy, potom bude regulárna zhoda prepísaná a konverzia sa neuskutoční.
Pozrime sa na implementáciu volania kroku „Dané“:
private TimeSpan ts; [Given(@'I have entered (.*) into the timestamp to minute converter')] public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Tu sa pozrite na typ vstupného parametra, tj. Jeho TimeSpan, ktorý sa zhoduje s typom vráteným z transformačného kroku, ak sa zmení na iný typ. Napríklad String, potom nedôjde ku konverzii argumentov a pôvodná implementácia Stepu prepíše zhodu regexu.
Profesionálny tip: Dôležitým bodom, ktorý si tu treba uvedomiť, je, že celý text, ktorý je potrebné transformovať, by sa mal vkladať / spájať prostredníctvom transformácie krokových argumentov. Preto daný krok teraz zabalí všetky možné vstupné formáty do jedného reťazca a transformačný regulárny výraz ho prevedie na objekt TimeSpan a vráti sa späť.Tabuľky Specflow
Tabuľky Specflow sú spôsobom, ako odovzdať zoznam hodnôt funkcii krokovej implementácie. V našich predchádzajúcich článkoch sme sa pozreli na spôsob implementácie testov na základe údajov pomocou prehľadu Scenár a príkladov. To však malo byť predovšetkým vykonanie scenára s rôznymi vstupmi.
Tu v tabuľkách ide o prenos všetkých údajov naraz v tabuľkovej podobe k krokovej implementácii, ktorá dodáva dáta.
Zvážte napríklad príklad, keď testujete systém správy študentov a za účelom vytvorenia nového objektu študenta sa vyžaduje vyplnenie mnohých podrobností, ako je meno, priezvisko, vek, rok narodenia atď.
Jedným zo spôsobov je odovzdať každú z týchto informácií ako samostatný krok, ktorým bude v podstate veľa štandardného kódu, a v každom kroku nakoniec aktualizujete rovnaký objekt, ktorý je potrebné vyskúšať. Ďalším spôsobom môže byť vytvorenie komplexného regulárneho výrazu a pokus o odovzdanie všetkých údajov v rovnakom kroku, ale je dosť náchylný na chyby a šupinatý.
Tu sa nám zachraňujú tabuľky. Všetky vstupné údaje týkajúce sa študentov možno poslať do implementácie toho istého kroku pekným tabuľkovým spôsobom prostredníctvom funkcie tabuľky specflow.
Pozrime sa na ukážku kódu nižšie pre implementáciu funkcií a krokov:
Scenario: Pass data through Specflow tables for StudentInfo object Given I have entered following info for Student | FirstName | LastName | Age | YearOfBirth | | test | student | 20 | 1995 | When I press add Then i student should get added to database and entered info should be displayed on the screen
Údaje tabuľky sú zvýraznené vo vyššie uvedenom kroku scenára.
vytvoriť pole reťazcov
Specflow poskytuje veľa nástrojov TableHelpers, ktoré priamo umožňujú užitočné funkcie, ako je vytvorenie inštancie objektu zo vstupných údajov dodaných používateľom, a nie analýza jednotlivých polí vlastnými silami.
Pozrime sa na nasledujúcu implementáciu:
private StudentInfo studInfo; [Given(@'I have entered following info for Student')] public void GivenIHaveEnteredFollowingInfoForStudent(Table table) { // converting supplied input data directly to instance of StudentInfo object studInfo = table.CreateInstance(); }
Pozrite sa na zvýraznenú časť vyššie. Tu je iba jeden malý riadok kódu, celý objekt StudentInfo (čo je POCO obsahujúci údajové polia študentov, t. J. Meno, priezvisko, vek, rok narodenia atď.)
Niektoré ďalšie funkcie / koncepty týkajúce sa tabuliek Specflow sú uvedené nižšie:
# 1) Tabuľky môžu byť vodorovné alebo zvislé. Vertikálne tabuľky sú viac ako páry kľúč - hodnota a vo vyššie uvedenom scenári skôr ako mapovanie názvu a hodnoty, zatiaľ čo horizontálne tabuľky obsahujú všetky údaje o objekte v jednom riadku (rovnako ako sme to videli v našom príklade).
#dva) Vertikálne tabuľky je možné mapovať iba na jeden objekt .NET, zatiaľ čo horizontálne tabuľky je možné mapovať aj na množinu alebo kolekciu objektov.
# 3) Každá hodnota poľa v tabuľke by mala byť atómová, pretože bude namapovaná na jedno zodpovedajúce pole v analyzovanom objekte.
Tu je dôležité poznamenať, že aj keď vy automaticky generovať krokové väzby s tabuľkovými údajmi, generátor väzieb Specflow automaticky zohľadní tieto typy vstupu a rozpozná ich ako platné tabuľkové údaje.
Záver
V tomto článku sme sa pokúsili vysvetliť 2 dôležité a užitočné pojmy v Specflow.
Prvým krokom je Transformácie argumentov kroku ktoré umožňujú vlastné prevody typu pre argumenty Specflow, aby sa zabránilo štandardnému kódu (a umožňuje testovaciemu skriptu vyzerať modulárnejšie a logickejšie) a druhou funkciou, na ktorú sme sa pozreli, je Tabuľky Specflow ktoré prídu vhod, keď potrebujete odovzdať veľa polí / údajov v jednom kroku v užívateľsky príjemnom tabuľkovom formáte.
V našom pripravovanom výučbe sa dozvieme viac o tom, ako môžete automaticky generovať krásnu dokumentáciu pomocou Specflow v rôznych formátoch pomocou nástrojov otvoreného zdroja, ako je Pickles, ktoré môžu slúžiť ako ľahká referencia pre všetky zúčastnené strany projektu.
Výukový program PREV | NEXT Tutorial
Odporúčané čítanie
- Nasadenie v MongoDB: Výukový program krok za krokom
- Podrobná inštalácia a nastavenie aplikácie Appium Studio
- Specflow a selénový webový ovládač Príklad typu end to end
- Podrobný sprievodca integráciou QTP s ALM / QC
- Top 15 populárnych otázok ohľadom Specflow Interview
- Pokročilé zdieľané a rozsahované viazanie Specflow, háky a opakované použitie
- Nainštalujte MongoDB do systému Windows: Podrobný sprievodca
- Ako integrovať JIRA s qTest: Sprievodca krok za krokom