step argument transformations specflow tables
Výukový program pro tabulky transformací argumentů a tabulky Specflow:
Náš předchozí výukový program Specflow nás všechny informoval Sdílené a vymezené vázání, háčky a opakované použití podrobně. Tady v tomto kurzu prozkoumáme více o transformacích argumentů kroku ve Specflow.
Neváhejte si přečíst naše Kompletní průvodce tréninkem Specflow pro začátečníky pro jasné pochopení pojmu. Funkce Specflow pro transformaci argumentů kroku umožňuje uživateli poskytnout vlastní transformaci pro parametry dodávané v krocích.
Umožňuje přidat vlastní logiku pro převod vstupních parametrů na konkrétní parametr. Například, můžete přímo vytvořit objekt třídy z parametrů a vrátit vytvořený objekt z transformační funkce.
Další funkcí Specflow, na kterou se podíváme, jsou tabulky Specflow, které umožňují předávání vstupních dat v tabulkové formě jediným krokem a pomocníci tabulky mohou podle potřeby mapovat přímo na instanci objektu.
Podívejte se na VIDEO:
Tady je videonávod k tabulkám Transformace argumentů a tabulky Specflow:
Co se naučíte:
Krokové transformace argumentů
Abychom lépe porozuměli transformacím argumentů, zkusme nejprve zjistit, jak přesně Specflow odpovídá parametrům. Jak jsme viděli v našich předchozích článcích, pro příklad vyhledávání na YouTube jsme hledaný výraz předávali jako parametr pro provedení scénáře.
Shoda parametrů se obvykle děje pomocí regulárního výrazu a odpovídající regulární výraz má za následek nastavení parametru metody na zadaný hledaný výraz v kroku.
Nejprve se pokusíme pochopit, jaké jsou výchozí podporované převody ve Specflow a kdy mohou být užitečné transformace argumentů.
Podporované převody
Specflow podporuje mnoho konverzí po vybalení z krabice, při pohledu na samotný datový typ po shodě regulárního výrazu. Může se automaticky postarat o převody jako - String, integer, GUID, Enums atd.
Níže uvádíme příklad některý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
Ve výše uvedeném ukázce kódu jsme zvýraznili různé typy vstupu, které předáváme v krocích, a v implementacích kroků se tyto převádějí na příslušné datové typy.
Podívejme se na krokové implementace pro tyto níže (pro jednoduchost jsme právě pro každý z kroků vytvořili konzolu, abychom ilustrovali, že zadaný argument se automaticky převede na očeká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());
Při provádění výše uvedeného scénáře výstup vytiskne všechny hodnoty úspěšně tím, že indikuje, že automatický převod argumentů na očekávané datové typy byl úspěšný.
Takto vypadá 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)
Transformace argumentů
Podívejme se na příklad v akci, abychom tomu porozuměli. Podpora, máte aplikaci, která převede daný čas a převede jej na minuty. Příklad: Pokud je uživatelský vstup 1 den - výstup je - 1440, pokud je uživatelský vstup 1 den 2 hodiny 2 minuty, pak by výstup měl být 1562.
Nyní je vidět, že k podpoře různých typů vstupů bude třeba psát různé implementace vazeb v závislosti na typu vstupů. Například: Pro vstupy, které mají pouze denní část, bude existovat samostatná kroková implementace, pro vstupy, které mají denní, měsíční část - bude samostatná kroková implementace atd.
Podívejme se, jak to lze implementovat pomocí jednokrokové implementace prostřednictvím transformace Step Argument a zadaný vstup se jednoduše převede na objekt časové značky a vrátí se k původnímu kroku, který se nazývá kroková transformace.
Přemýšlejte o tom jako o první úrovni regex skenování vašeho vstupu, který vrací částečně transformovanou hodnotu do volajícího kroku.
Podívejte se na soubor funkcí, který má 3 různé varianty vstupu, s jedinou transformací převedením na úplný objekt časového rozsahu a návratem zpět.
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
Podívejte se na zvýrazněné hodnoty ve výše uvedeném příkladu kódu. Všechny z nich se postarají o přesně stejnou transformaci a konečným výsledkem bude transformovaná vstupní hodnota TimeSpan, která se odešle zpět do volajícího Specflow Step.
Podívejme se na implementaci Transformace níže:
(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 věděl, že se jedná o transformační vazbu, je třeba do metody implementující převod Argument přidat atribut StepArgumentTransformation.
Další důležité body, které je třeba si všimnout ohledně konverzí Argumentu, jsou:
# 1) Transformace argumentů kroku probíhají pro každý odpovídající krok, tj. Bez ohledu na typ kroku, tj. Zda je daný, kdy nebo poté, transformace proběhne pro každý odpovídající regulární výraz.
#dva) V závislosti na typu návratu transformovaného výstupu, pokud skutečný krok volání nemá odpovídající typ návratu pro vstupní parametr, transformace neproběhne.
Co to znamená, předpokládejme, že volající krok vyžaduje transformovaný vstup, ale má uvedené časové razítko vstupu jako něco, co neodpovídá návratovému typu transformované metody, pak bude přepsána shoda regexu a převod se neuskuteční.
Podívejme se na implementaci volání kroku „Dáno“:
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Podívejte se zde na typ vstupního parametru, tj. Jeho TimeSpan, který odpovídá typu vrácenému z kroku transformace, pokud se změní na jiný typ. Například String, pak nedojde k převodu argumentu a shoda regex bude přepsána původní implementací Step.
Profesionální tip: Důležitým bodem, který je zde třeba poznamenat, je, že celý text, který je třeba transformovat, by měl být přiváděn / porovnáván pomocí transformace krokových argumentů. Proto daný krok nyní zabalí všechny možné vstupní formáty do jednoho řetězce a transformační regulární výraz jej převede na objekt TimeSpan a vrátí se zpět.Tabulky Specflow
Tabulky Specflow jsou způsob, jak předat seznam hodnot do funkce implementace kroku. V našich předchozích článcích jsme se podívali na způsob implementace testů založených na datech pomocí osnovy scénáře a příkladů. Ale to bylo primárně provést scénář s různými vstupy.
Tady v tabulkách jde o předávání všech dat najednou v tabulkové formě k krokové implementaci, která dodává data.
Zvažte například příklad, kdy testujete systém správy studentů a za účelem vytvoření nového objektu studenta budete požádáni o vyplnění mnoha podrobností, jako je jméno, příjmení, věk, rok narození atd.
Jedním ze způsobů je předat každou z těchto informací jako samostatný krok, což bude v podstatě spousta standardních kódů, a v každém kroku nakonec aktualizujete stejný objekt, který je třeba otestovat. Dalším způsobem může být vytvoření komplexního regulárního výrazu a pokus o předání všech dat ve stejném kroku, ale je poměrně náchylný k chybám a šupinatý.
Zde nám pomáhají tabulky. Všechna vstupní data týkající se studentů mohou být zaslána do stejného kroku implementace pěkným tabulkovým způsobem prostřednictvím funkce tabulky specflow.
Podívejme se níže na ukázku kódu pro implementaci funkcí a kroků:
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
Data tabulky jsou zvýrazněna ve výše uvedeném kroku scénáře.
jak spustit java jar soubor
Specflow poskytuje mnoho TableHelpers, které přímo umožňují užitečné funkce, jako je vytvoření instance objektu ze vstupních dat dodaných uživatelem, spíše než vlastní analýza jednotlivých polí.
Podívejme se na implementaci níže:
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(); }
Podívejte se na zvýrazněnou část výše. Zde je jen jeden malý řádek kódu, celý objekt StudentInfo (což je POCO obsahující datová pole studentů, tj. Křestní jméno, příjmení, věk, rok narození atd.)
Níže jsou uvedeny některé další funkce / koncepty související s tabulkami Specflow:
# 1) Tabulky mohou být vodorovné nebo svislé. Vertikální tabulky jsou spíš jako páry klíč-hodnota a ve výše uvedeném scénáři spíše jako mapování název-hodnota, zatímco horizontální tabulky obsahují všechna data pro objekt v jednom řádku (stejně jako jsme viděli v našem příkladu).
#dva) Vertikální tabulky lze mapovat pouze na jeden objekt .NET, zatímco horizontální tabulky lze také mapovat na sadu nebo kolekci objektů.
# 3) Každá hodnota pole v tabulce by měla být atomová, protože bude mapována na jedno odpovídající pole v analyzovaném objektu.
Zde je důležité si uvědomit, že i když automaticky generovat krokové vazby s tabulkovými daty, generátor vazeb Specflow automaticky zohlední takové typy vstupu a rozpozná je jako platná tabulková data.
Závěr
V tomto článku jsme se pokusili vysvětlit 2 důležité a užitečné koncepty ve Specflow.
Prvním krokem je Transformace argumentů kroku které umožňují vlastní převody typů pro argumenty Specflow, aby se zabránilo standardizovanému kódu (a umožňuje, aby testovací skript vypadal více modularizovaný a logický) a druhou funkcí, na kterou jsme se podívali, je Tabulky Specflow které se hodí, když potřebujete předat spoustu polí / dat v jednom kroku v uživatelsky přívětivém tabulkovém formátu.
V našem nadcházejícím tutoriálu se dozvíme více o tom, jak můžete automaticky generovat krásnou dokumentaci pomocí Specflow v různých formátech pomocí nástrojů open source, jako je Pickles, které mohou sloužit jako snadná reference pro všechny zúčastněné strany projektu.
Výukový program PREV | DALŠÍ výuka
Doporučené čtení
- Nasazení v MongoDB: Podrobný návod
- Krok za krokem instalace a nastavení Appium Studio
- Specflow a Selenium Webdriver End to End Příklad
- Podrobný průvodce integrací QTP s ALM / QC
- Top 15 populárních dotazů Specflow Interview
- Advanced Specflow Shared & Scoped Bindings, Hooks and Step Reuse
- Nainstalujte MongoDB na Windows: Podrobný průvodce
- Jak integrovat JIRA s qTest: Průvodce krok za krokem