step argument transformations specflow tables
Steg Argument Transformations & Specflow Tables Tutorial:
Vår tidigare Specflow-handledning informerade oss allt om Delade och omfattade bindningar, krokar och stegåteranvändning i detalj. Här i denna handledning kommer vi att utforska mer om Step Argument Transformations in Specflow.
Läs gärna igenom vår Komplett Specflow Training Guide för nybörjare för en klar förståelse av konceptet. Step Argument Transformation-funktionen i Specflow, tillåter en användare att tillhandahålla anpassad transformation för parametrarna som tillhandahålls i stegen.
Det gör att anpassad logik kan läggas till för att konvertera ingångsparametrar till en specifik parameter. Till exempel, Du kan skapa ett klassobjekt direkt från parametrarna och returnera det konstruerade objektet från transformationsfunktionen.
En annan funktion i Specflow som vi kommer att titta på är Specflow-tabeller som gör det möjligt att skicka indata i tabellform med ett enda steg och tabellhjälpare kan få den mappad direkt till en objektinstans efter önskemål.
Titta på videon:
Här är en videohandledning om Step Argument Transformations & Specflow-tabeller:
Vad du kommer att lära dig:
Step Argument Transformations
För att förstå argumentförändringar på ett bättre sätt, låt oss först försöka ta reda på hur exakt Specflow matchar parametrarna. Som vi har sett i våra tidigare artiklar skickade vi för sökningsexempel på YouTube söktermen som en parameter för scenariot att utföra.
Parametermatchningen sker vanligtvis genom ett reguljärt uttryck och matchande regex resulterar i att metodparametern ställs in till den medföljande söktermen i steget.
Låt oss först försöka förstå vilka standardkonverteringar som stöds i Specflow och när argumenttransformationer kan vara till hjälp.
Konverteringar som stöds
Specflow stöder många konverteringar ur lådan genom att titta på själva datatypen efter regex-matchning. Det kan automatiskt ta hand om konverteringar som - String, heltal, GUID, Enums, etc.
Låt oss se ett exempel på några av dessa nedan:
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
I ovanstående kodprov har vi markerat olika ingångstyper som vi skickar i stegen, och i stegimplementeringarna konverteras dessa till respektive datatyper.
Låt oss se stegimplementeringarna för dessa nedan (för enkelhetens skull har vi precis gjort en konsol för vart och ett av stegen för att illustrera att det tillhandahållna argumentet automatiskt omvandlas till den förväntade typen):
(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());
Vid utförandet av ovanstående scenario skriver utgången alla värden framgångsrikt genom att indikera att den automatiska omvandlingen av argument till de förväntade datatyperna lyckades.
Så här ser utgången ut:
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)
Argumentförändringar
Låt oss se ett exempel i handling för att förstå detta. Support, du har en applikation som konverterar den angivna tiden och konverterar den till minuter. Exempel: Om användarinmatningen är 1 dag - utmatningen är 1440, om användarinmatningen är 1 dag 2 timmar 2 minuter, bör utgången vara 1562.
Nu kan man se att man måste skriva olika bindande implementeringar för att stödja olika typer av ingångar beroende på typen av ingångar. Till exempel: För ingångar som bara har dagdel kommer det att finnas ett separat stegimplementering, för ingångar som har en dag, månadsdel - det kommer att finnas separat stegimplementering etc.
Låt oss se hur detta kan implementeras genom en enstegsimplementering genom Step Argument-transformation och den tillhandahållna ingången omvandlas helt enkelt till tidsstämpelobjekt och returneras till det ursprungliga steget som kallas stegtransformationen.
Tänk på det som en första nivå regex-skanning till din ingång som returnerar det delvis transformerade värdet till samtalssteget.
Titta på funktionsfilen som har tre olika inmatningsvarianter, med en enda omvandling genom att konvertera den till ett komplett tidsintervallobjekt och återvända.
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
Titta på de markerade värdena i ovanstående exempel på kod. Alla dessa kommer att ta hand om exakt samma transformation och slutresultatet blir ett transformerat TimeSpan-ingångsvärde som skickas tillbaka till det anropande Specflow-steget.
Låt oss titta på implementeringen av Transformationen nedan:
(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); }
För att ramverket ska veta att det är en transformationsbindning måste StepArgumentTransformation-attribut läggas till i metoden som implementerar Argument-konverteringen.
De andra viktiga punkter som ska noteras när det gäller argumentkonvertering är:
# 1) Steg Argumenttransformationer körs för varje matchningssteg, dvs oavsett vilken typ av steg det vill säga om det ges, När eller Då kommer Transformation att ske för varje matchande regex.
#två) Beroende på returtypen för den transformerade utgången, om det faktiska anropssteget inte har den matchande returtypen för ingångsparametern, kommer transformering inte att ske.
Vad detta betyder är, antar att anropssteget kräver en transformerad ingång men den har den nämnda tidsstämpeln för ingång som något som inte matchar returtypen för den transformerade metoden, då kommer regex-matchningen att åsidosättas och konverteringen kommer inte att ske.
Låt oss titta på implementeringen av att kalla steget 'given':
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Titta på typen av inmatningsparameter här, dvs. dess TimeSpan, som matchar typen som returneras från omvandlingssteget om detta ändras till någon annan typ. Till exempel String, då kommer inte konvertering av argument att ske och regex-matchningen kommer att åsidosättas av den ursprungliga stegimplementeringen.
Proffstips: En viktig punkt att notera här är att hela texten som behöver transformeras ska matas / matchas genom transformation av stegargument. Följaktligen kommer det givna steget nu att slå alla möjliga inmatningsformat in i en enda sträng och transformationsregex kommer att konvertera det till ett TimeSpan-objekt och återvända tillbaka.Specflow-tabeller
Specflow-tabeller är ett sätt att skicka en lista över värden till stegimplementeringsfunktionen. I våra tidigare artiklar tittade vi på sättet att implementera datadrivna tester med Scenario-översikt och exempel. Men det var att främst utföra scenariot med olika ingångar.
Här, i tabeller, handlar det om att skicka all data på en gång i tabellform till stegimplementeringen som levererar data.
Tänk till exempel på ett exempel där du testar ett studenthanteringssystem och för att skapa ett nytt studentobjekt ombeds du fylla i många detaljer som förnamn, efternamn, ålder, födelseår etc.
Ett sätt är att skicka var och en av denna information som ett separat steg som i huvudsak kommer att vara mycket pannkodskod och i varje steg kommer du att sluta uppdatera samma objekt som behöver testas. Ett annat sätt kan vara att bygga en komplex regex och försöka skicka all data i samma steg men det är ganska felbenäget och fläckigt.
Här räddas bord. Alla studentrelaterade indata kan skickas till samma stegimplementering på ett trevligt tabellformat genom tabellfunktionen i specflow.
Låt oss se ett kodexempel nedan för implementering av funktioner och steg:
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
Tabelldata markeras i ovanstående scenaristeg.
öppen källkod webbtjänst testverktyg
Specflow tillhandahåller många TableHelpers, som direkt möjliggör användbara funktioner som att skapa en objektinstans från de användarinmatade indata i stället för att analysera varje fält på egen hand.
Låt oss se stegimplementeringen nedan:
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(); }
Titta på det markerade avsnittet ovan. Här är bara en liten kodrad, hela StudentInfo-objektet (som är en POCO som innehåller studentdatafälten, dvs förnamn, efternamn, ålder, födelseår, etc)
Några andra funktioner / begrepp relaterade till Specflow-tabeller visas nedan:
# 1) Tabellerna kan vara horisontella eller vertikala. Vertikala tabeller är mer som nyckel-värde-par och i ovanstående scenario mer som namn-värde-mappningar medan horisontella tabeller innehåller all data för ett objekt i en enda rad (precis som vi såg i vårt exempel).
#två) Vertikala tabeller kan mappas till bara ett .NET-objekt medan horisontella tabeller också kan mappas till en uppsättning eller samling objekt.
# 3) Varje fältvärde i tabellen ska vara atomiskt eftersom det mappas till ett motsvarande fält i det analyserade objektet.
En viktig punkt att notera här är att även om du automatiskt generera stegbindningar med tabelldata kommer Specflow-bindningsgeneratorn automatiskt att ta hänsyn till sådana ingångstyper och känna igen den som en giltig tabelldata.
Slutsats
I den här artikeln försökte vi förklara två viktiga och praktiska koncept i Specflow.
Det första steget är Steg Argumenttransformationer som tillåter anpassade typkonverteringar för Specflow-argument för att undvika pannkodskod (och gör det möjligt för testskriptet att se mer modulärt och logiskt ut) och den andra funktionen vi tittade på är Specflow-tabeller som är praktiska när du behöver skicka in många fält / data i ett enda steg i ett användarvänligt tabellformat.
I vår kommande handledning lär vi oss mer om hur du automatiskt kan skapa vacker dokumentation med hjälp av Specflow i olika format med hjälp av öppen källkodsverktyg som Pickles som kan fungera som en enkel referens för alla intressenter i projektet.
PREV-handledning | NÄSTA självstudie
Rekommenderad läsning
- Distribution i MongoDB: Steg-för-steg-handledning
- Steg-för-steg-installation och installation av Appium Studio
- Specflow och Selenium Webdriver End to End Exempel
- En steg-för-steg-guide för att integrera QTP med ALM / QC
- Topp 15 populära specflow-intervjufrågor
- Avancerad specflow-delad och scoped-bindning, krokar och stegåteranvändning
- Installera MongoDB på Windows: En steg-för-steg-guide
- Hur man integrerar JIRA med qTest: En steg-för-steg-guide