step argument transformations specflow tables
Trinargumenttransformationer og specflowtabellevejledning:
Vores tidligere Specflow-vejledning orienterede os alt om Delt og scoped bindinger, kroge og tringenbrug i detaljer. Her i denne vejledning vil vi udforske mere om trinargumenttransformationer i Specflow.
Du er velkommen til at læse gennem vores Komplet Specflow træningsvejledning til begyndere for en klar forståelse af konceptet. Trin Argument Transformation-funktion i Specflow giver brugeren mulighed for at levere tilpasset transformation til de parametre, der leveres i trinene.
Det gør det muligt at tilføje brugerdefineret logik for at konvertere inputparametre til en bestemt parameter. For eksempel, Du kan oprette et klasseobjekt direkte fra parametrene og returnere det konstruerede objekt fra transformationsfunktionen.
Et andet træk ved Specflow, som vi vil se på, er Specflow-tabeller, der tillader overførsel af inputdata i tabelform med et enkelt trin, og tabelhjælpere kan få det kortlagt direkte til en objektforekomst efter ønske.
Se videoen:
Her er en videovejledning om Step Argument Transformations & Specflow-tabeller:
Hvad du lærer:
Trinargumenttransformationer
For at forstå argumenttransformationer på en bedre måde, lad os først prøve at finde ud af, hvordan Specflow nøjagtigt matcher parametrene. Som vi har set i vores tidligere artikler, for eksempel på YouTube-søgning, sendte vi søgeudtrykket som en parameter for scenariet, der skal udføres.
Parameteroverensstemmelse sker normalt gennem et regulært udtryk, og den matchende regex resulterer i at indstille metodeparameteren til det medfølgende søgeudtryk i trinnet.
Lad os først prøve at forstå, hvad der er standardunderstøttede konverteringer i Specflow, og hvornår argumenttransformationer kan være nyttige.
Understøttede konverteringer
Specflow understøtter ikke mange konverteringer ud af boksen ved at se på selve datatypen efter regex-match. Det kan automatisk tage sig af konverteringer som - String, heltal, GUID, Enums osv.
Lad os se et eksempel på nogle af disse nedenfor:
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 ovenstående kodeeksempel har vi fremhævet forskellige inputtyper, som vi sender i trinene, og i trinimplementeringerne bliver disse konverteret til de respektive datatyper.
Lad os se trinimplementeringerne for disse nedenfor (for at gøre det nemmere har vi netop lavet en konsol ud for hvert af trinene for at illustrere, at det leverede argument konverteres automatisk til den forventede type):
(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());
Ved udførelse af ovenstående scenario udskriver output alle værdier med succes ved at indikere, at den automatiske konvertering af argumenter til de forventede datatyper var vellykket.
Sådan ser output ud:
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)
Argumenttransformationer
Lad os se et eksempel i aktion for at forstå dette. Support, du har en applikation, der konverterer den givne tid og konverterer den til minutter. Eksempel: Hvis brugerinput er 1 dag - output er - 1440, hvis brugerinput er 1 dag 2 time 2 minutter, skal output være 1562.
Nu kan det ses, at man for at understøtte forskellige typer input er nødt til at skrive forskellige bindende implementeringer afhængigt af typen af input. For eksempel: For input, der kun har dagdel, vil der være en separat trinimplementering, for input, der har en dag-, månedsdel - der vil være separat trinimplementering osv.
Lad os se, hvordan dette kan implementeres gennem et enkelt trin implementering gennem Step Argument transformation, og det leverede input simpelthen konverteres til tidsstempel objekt og returneres til det oprindelige trin, der kaldes trin transformation.
Tænk på det som et første niveau regex-scanning til dit input, som returnerer den delvist transformerede værdi til opkaldstrinet.
Se på funktionsfilen med 3 forskellige inputvarianter med en enkelt transformation ved at konvertere den til et komplet tidsrumsobjekt og vende tilbage.
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
Se på de fremhævede værdier i ovenstående kodeeksempel. Alle disse vil blive taget hånd om den nøjagtige samme transformation, og slutresultatet bliver en transformeret TimeSpan-inputværdi, der sendes tilbage til det kaldende Specflow-trin.
Lad os se på implementeringen af transformationen nedenfor:
(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); }
For at rammen skal vide, at det er en transformationsbinding, skal StepArgumentTransformation Attribute føjes til metoden, der implementerer Argumentkonverteringen.
De andre vigtige punkter, der skal bemærkes med hensyn til argumentkonvertering, er:
# 1) Trinargumenttransformationer kører for hvert matchende trin, dvs. uanset typen af trin, dvs. om det er givet, hvornår eller derefter, vil der ske transformation for hver matchende regex.
#to) Afhængigt af den transformerede udgangs returtype, hvis det aktuelle opkaldstrin ikke har den matchende returtype for inputparameteren, vil transformation ikke finde sted.
Hvad dette betyder er, antag at opkaldstrinet kræver en transformeret input, men den har den nævnte tidsstempel for input som noget, der ikke matcher returtypen for den transformerede metode, så vil regex-matchet blive tilsidesat, og konverteringen finder ikke sted.
Lad os se på implementeringen af at kalde 'givet' trin:
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Se på typen af inputparameter her, dvs. dens TimeSpan, der matcher typen, der returneres fra transformationstrinet, hvis dette ændres til en anden type. For eksempel String, så sker ikke konvertering af argumenter, og regex-matchet bliver tilsidesat af den oprindelige Step-implementering.
Pro Tip: Et vigtigt punkt at bemærke her er, at hele teksten, der skal transformeres, skal fodres / matches gennem trinargumenttransformation. Derfor vil det givne trin nu pakke alle mulige inputformater ind i en enkelt streng, og transformation regex vil konvertere det til et TimeSpan-objekt og vende tilbage.Specflow-tabeller
Specflow-tabeller er en måde at sende en liste over værdierne til trinimplementeringsfunktionen. I vores tidligere artikler kiggede vi på, hvordan man implementerer datadrevne tests ved hjælp af Scenario disposition og eksempler. Men det var primært at udføre scenariet med forskellige input.
Her i tabeller handler det om at overføre alle dataene på én gang i tabelform til den trinimplementering, der leverer data.
Overvej f.eks. Et eksempel, hvor du tester et Student Management System, og for at oprette et nyt Student-objekt, bliver du bedt om at udfylde mange detaljer som fornavn, efternavn, alder, fødselsår osv.
En måde er at videregive hver af disse oplysninger som et separat trin, der i det væsentlige vil være en masse kedelpladekode, og i hvert trin ender du med at opdatere det samme objekt, der skal testes. En anden måde kan være at opbygge en kompleks regex og forsøge at videregive alle data i samme trin, men det er ret udsat for fejl og skællet.
Tabeller kommer os til undsætning her. Alle studenterelaterede inputdata kan sendes til samme trinimplementering på en flot tabelform gennem tabelfunktionen i specflow.
Lad os se en kodeeksempel nedenfor til implementering af funktioner og trin:
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
Tabeldata fremhæves i ovenstående scenarie-trin.
hvordan åbner man xml-filer
Specflow giver mange TableHelpers, som direkte giver mulighed for nyttige funktioner som at oprette en objektforekomst fra de brugerleverede inputdata i stedet for at analysere hvert felt alene.
Lad os se trinimplementeringen nedenfor:
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(); }
Se på det fremhævede afsnit ovenfor. Her er kun en lille linje kode, hele StudentInfo-objektet (som er en POCO, der indeholder studentens datafelter, dvs. fornavn, efternavn, alder, fødselsår osv.)
Nogle andre funktioner / koncepter relateret til Specflow-tabeller er vist nedenfor:
# 1) Tabeller kan være vandrette eller lodrette. Lodrette tabeller er mere som nøgleværdipar og i ovenstående scenarie mere som navne-værditilknytninger, mens vandrette tabeller indeholder alle data for et objekt i en enkelt række (ligesom vi så i vores eksempel).
#to) Lodrette tabeller kan kortlægges til kun et enkelt .NET-objekt, mens vandrette tabeller også kan kortlægges til et sæt eller en samling objekter.
# 3) Hver feltværdi i tabellen skal være atomisk, da den kortlægges til et tilsvarende felt i det parsede objekt.
Et vigtigt punkt at bemærke her er, at selvom du generer automatisk trinbindinger med tabeldata, vil Specflow-bindingsgenerator automatisk tage højde for sådanne inputtyper og genkende det som gyldige tabeldata.
Konklusion
I denne artikel forsøgte vi at forklare 2 vigtige og praktiske koncepter i Specflow.
Det første skridt er Trin Argumenttransformationer som tillader tilpassede konverteringer til Specflow-argumenter for at undgå kedelpladekode (og gør det muligt for testscriptet at se mere modulariseret og logisk ud) og den anden funktion, vi kiggede på, er Specflow-tabeller som er nyttige, når du har brug for at videregive mange felter / data i et enkelt trin i et brugervenligt tabelformat.
I vores kommende vejledning lærer vi mere om, hvordan du automatisk kan generere smuk dokumentation ved hjælp af Specflow i forskellige formater ved hjælp af open source-værktøjer som Pickles, som kan tjene en nem reference for alle interessenter i projektet.
PREV-vejledning | NÆSTE vejledning
Anbefalet læsning
- Implementering i MongoDB: Trin-for-trin vejledning
- Trin-for-trin installation og opsætning af Appium Studio
- Specflow og Selen Webdriver ende til slut eksempel
- En trin-for-trin vejledning til integration af QTP med ALM / QC
- Top 15 populære specflow-interviewspørgsmål
- Avanceret Specflow Shared & Scoped-bindinger, kroge og tringenbrug
- Installer MongoDB på Windows: En trin-for-trin guide
- Sådan integreres JIRA med qTest: En trinvis vejledning