step argument transformations specflow tables
Step Argument Transformations & Specflow Tables Tutorial:
Vår forrige Specflow-opplæring orienterte oss om Delt og scoped bindinger, kroker og trinn gjenbruk i detalj. Her i denne veiledningen vil vi utforske mer om trinnargumenttransformasjoner i Specflow.
Les gjerne gjennom vår Komplett Specflow treningsveiledning for nybegynnere for en klar forståelse av konseptet. Step Argument Transformation-funksjonen i Specflow, lar en bruker tilby tilpasset transformasjon for parametrene som er gitt i trinnene.
Det gjør at tilpasset logikk kan legges til for å konvertere inngangsparametere til en bestemt parameter. For eksempel, du kan direkte opprette et klasseobjekt fra parametrene og returnere det konstruerte objektet fra transformasjonsfunksjonen.
En annen funksjon i Specflow som vi vil se på, er Specflow-tabeller som tillater overføring av inndata i tabellform med et enkelt trinn, og tabellhjelpere kan få dem tilordnet direkte til en objektforekomst etter ønske.
Se videoen:
Her er en videoopplæring om Step Argument Transformations & Specflow-tabeller:
Hva du vil lære:
Step Argument Transformations
For å forstå argumenttransformasjoner på en bedre måte, la oss først prøve å finne ut hvordan nøyaktig Specflow samsvarer med parametrene. Som vi har sett i våre tidligere artikler, for eksempel på YouTube-søk, sendte vi søkeordet som en parameter for scenariet å utføre.
Parameter matching samsvarer vanligvis gjennom et vanlig uttrykk, og den samsvarende regex resulterer i å sette metodeparameteren til det angitte søkeordet i trinnet.
La oss først prøve å forstå hva som er standardkonverteringer som støttes i Specflow, og når argumenttransformasjoner kan være nyttige.
Støttede konverteringer
Specflow støtter mange konverteringer utenom boksen, ved å se på selve datatypen etter regex-samsvar. Det kan automatisk ta vare på konverteringer som - String, heltall, GUID, Enums, etc.
La oss se et eksempel på noen av 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 ovennevnte kodeeksempel har vi markert forskjellige inngangstyper som vi overfører i trinnene, og i trinnimplementeringene blir disse konvertert til de respektive datatypene.
La oss se trinnimplementeringene for disse nedenfor (for enkelhets skyld har vi nettopp gjort en konsoll for hvert av trinnene for å illustrere at det tilførte argumentet automatisk blir konvertert til den forventede 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());
Ved utførelse av scenariet ovenfor skriver utdataene alle verdiene vellykket ved å indikere at den automatiske konverteringen av argumenter til de forventede datatypene var vellykket.
Slik ser utgangen 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)
Argumenttransformasjoner
La oss se et eksempel i aksjon for å forstå dette. Støtte, du har et program som konverterer gitt tid og konverterer den til minutter. Eksempel: Hvis brukerinngangen er 1 dag - utgangen er 1440, hvis brukerinngangen er 1 dag 2 timer og 2 minutter, skal utgangen være 1562.
Nå kan man se at for å støtte forskjellige typer innganger, må man skrive forskjellige bindende implementeringer, avhengig av typen innganger. For eksempel: For innganger som bare har dagdel, vil det være en separat trinnimplementering, for innganger som har en dag, en månedsdel - det vil være en separat trinnimplementering, etc.
La oss se hvordan dette kan implementeres gjennom et enkelt trinns implementering gjennom Step Argument-transformasjon, og den medfølgende inngangen konverteres ganske enkelt til tidsstempelobjekt og returneres til det opprinnelige trinnet som kalles trinntransformasjonen.
Tenk på det som et første nivå regex-skanning til inngangen din som returnerer den delvis transformerte verdien til ringetrinnet.
Se på funksjonsfilen som har 3 forskjellige inngangsvarianter, med en enkelt transformasjon ved å konvertere den til et fullstendig tidsromobjekt og returnere tilbake.
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 uthevede verdiene i kodeeksemplet ovenfor. Alle disse vil bli tatt vare på nøyaktig samme transformasjon, og sluttresultatet vil være en transformert TimeSpan-inngangsverdi som sendes tilbake til det kallende Specflow-trinnet.
La oss se på implementeringen av transformasjonen 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 rammeverket skal vite at det er en transformasjonsbinding, må StepArgumentTransformation Attribute legges til i metoden som implementerer Argumentkonvertering.
De andre viktige punktene som skal bemerkes angående argumentkonvertering er:
#1) Trinn Argumenttransformasjoner kjører for hvert matchende trinn, dvs. uavhengig av trinntype, dvs. om det er gitt, når eller deretter, vil transformasjon skje for hver samsvarende regex.
#to) Avhengig av returtypen til den transformerte utgangen, vil ikke transformasjonen finne sted hvis det faktiske anropstrinnet ikke har den samsvarende returtypen for inngangsparameteren.
Hva dette betyr er, antar at anropstrinnet krever en transformert inngang, men den har den nevnte tidsstempelen for inngang som noe som ikke samsvarer med returtypen til den transformerte metoden, så vil regex-samsvaret bli overstyrt og konverteringen vil ikke finne sted.
La oss se på implementeringen av å kalle 'Gitt' trinnet:
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Se på typen inngangsparameter her, dvs. TimeSpan, som samsvarer med typen som returneres fra transformasjonstrinnet hvis denne endres til en annen type. For eksempel Streng, så vil ikke argumentkonvertering skje, og regex-samsvar vil bli overstyrt av den opprinnelige trinnimplementeringen.
Pro Tips: Et viktig poeng å merke seg her er at hele teksten som må transformeres, skal mates / matches gjennom trinnargumenttransformasjon. Derfor vil det gitte trinnet nå pakke alle mulige inngangsformater inn i en enkelt streng, og transformasjonsregex vil konvertere det til et TimeSpan-objekt og returnere tilbake.Specflow-tabeller
Specflow-tabeller er en måte å sende en liste over verdiene til trinnimplementeringsfunksjonen. I våre tidligere artikler så vi på måten å implementere datadrevne tester ved hjelp av Scenario disposisjon og eksempler. Men det var først og fremst å utføre scenariet med forskjellige innganger.
Her, i tabeller, handler det om å overføre alle dataene samtidig i tabellform til trinnimplementeringen som leverer data.
Tenk for eksempel på et eksempel der du tester et Student Management System, og for å opprette et nytt Student-objekt, blir du bedt om å fylle ut mange detaljer som fornavn, etternavn, alder, fødselsår osv.
En måte er å sende hver av denne informasjonen som et eget trinn, som i det vesentlige vil være mye kjelekode, og i hvert trinn vil du ende opp med å oppdatere det samme objektet som må testes. En annen måte kan være å bygge et komplekst regex og prøve å overføre alle data i samme trinn, men det er ganske utsatt for feil og flassende.
Tabeller kommer oss til unnsetning her. Alle studentrelaterte inndata kan sendes til samme trinns implementering på en fin tabellform gjennom tabellfunksjonen i specflow.
La oss se et kodeeksempel nedenfor for implementering av funksjoner og trinn:
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 er uthevet i ovennevnte scenartrinn.
sql spørring praksis spørsmål svar pdf
Specflow gir mange TableHelpers, som direkte tillater nyttige funksjoner som å lage en objektforekomst fra de brukerleverte inngangsdataene i stedet for å analysere hvert felt alene.
La oss se trinnimplementeringen 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å den uthevede delen ovenfor. Her er bare en liten kodelinje, hele StudentInfo-objektet (som er en POCO som inneholder studentdatafeltene, dvs. fornavn, etternavn, alder, fødselsår osv.)
Noen andre funksjoner / konsepter relatert til Specflow-tabeller er vist nedenfor:
#1) Tabeller kan være horisontale eller vertikale. Vertikale tabeller ligner mer på nøkkelverdipar og i scenariet ovenfor mer som navnverdikartlegginger, mens horisontale tabeller inneholder alle data for et objekt i en enkelt rad (akkurat som vi så i vårt eksempel).
#to) Vertikale tabeller kan kartlegges til bare et .NET-objekt, mens horisontale tabeller også kan kartlegges til et sett eller en samling objekter.
# 3) Hver feltverdi i tabellen skal være atomisk da den blir kartlagt til et enkelt tilsvarende felt i det analyserte objektet.
Et viktig poeng å merke seg her er at selv om du generer automatisk trinnbindinger med tabeldataene, vil Specflow-bindingsgeneratoren automatisk ta hensyn til slike inngangstyper og gjenkjenne det som gyldige tabelldata.
Konklusjon
I denne artikkelen prøvde vi å forklare to viktige og praktiske konsepter i Specflow.
Det første trinnet er Step Argument transformasjoner som tillater tilpassede konverteringstyper for Specflow-argumenter for å unngå kjeleplatekode (og gjør det mulig for testskriptet å se mer modularisert og logisk ut) og den andre funksjonen vi så på er Specflow-tabeller som er nyttige når du trenger å sende inn mange felt / data i et enkelt trinn i et brukervennlig tabellformat.
I vår kommende opplæring vil vi lære mer om hvordan du automatisk kan generere vakker dokumentasjon ved hjelp av Specflow i forskjellige formater ved hjelp av open source-verktøy som Pickles, som kan tjene en enkel referanse for alle interessenter i prosjektet.
PREV Opplæring | NESTE veiledning
Anbefalt lesing
- Distribusjon i MongoDB: trinnvis veiledning
- Trinnvis installasjon og oppsett av Appium Studio
- Specflow og Selen Webdriver End to End Eksempel
- En trinnvis guide for å integrere QTP med ALM / QC
- Topp 15 populære spørsmål om spesifikke intervjuer
- Avansert specflow delt- og scoped-bindinger, kroker og trinngjenbruk
- Installer MongoDB på Windows: En trinnvis guide
- Hvordan integrere JIRA med qTest: En trinnvis guide