step argument transformations specflow tables
Tutorial de transformacions d'arguments de pas i taules de flux de dades:
El nostre anterior tutorial Specflow ens va informar de tot Enquadernacions compartides i abastades, ganxos i reutilització de passos en detall. Aquí, en aquest tutorial, explorarem més sobre les transformacions d’arguments de pas a Specflow.
No dubteu a llegir el nostre document Guia completa de formació Specflow per a principiants per a una comprensió clara del concepte. La funció Transformació de l’argument del pas de Specflow permet a l’usuari proporcionar una transformació personalitzada per als paràmetres proporcionats als passos.
Permet afegir lògica personalitzada per convertir els paràmetres d’entrada en un paràmetre específic. Per exemple, podeu crear directament un objecte de classe a partir dels paràmetres i tornar l'objecte construït des de la funció de transformació.
Una altra característica de Specflow que l’observarem són les taules Specflow que permeten passar les dades d’entrada en forma de tabla amb un sol pas i els ajudants de taules poden obtenir-les mapades directament a una instància d’Objecte segons es desitgi.
Mira el vídeo:
Aquí teniu un vídeo tutorial sobre les taules Transformacions d'arguments de pas i Specflow:
Què aprendreu:
Transformacions de l’argument de pas
Per entendre millor les transformacions dels arguments, primer intentem esbrinar com coincideix exactament Specflow amb els paràmetres. Com hem vist en els nostres articles anteriors, per exemple de cerca de YouTube, passàvem el terme de cerca com a paràmetre per a l'execució de l'escenari.
La coincidència de paràmetres normalment es produeix mitjançant una expressió regular i la coincidència regex resulta en establir el paràmetre del mètode al terme de cerca proporcionat al pas.
Primer intentem comprendre quines són les conversions admeses per defecte a Specflow i quan poden ser útils les transformacions d’arguments.
Conversions admeses
Specflow admet moltes conversions fora de la caixa, en mirar el tipus de dades en si mateix després de la concordança regular. Es pot fer càrrec automàticament de conversions com: cadena, enter, GUID, Enums, etc.
A continuació, vegem un exemple d'alguns d'aquests:
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
A l'exemple de codi anterior, hem ressaltat diferents tipus d'entrada que passem als passos i, en les implementacions de passos, es converteixen als tipus de dades respectius.
Vegem les implementacions de passos següents (per simplicitat, acabem de fer una consola per a cadascun dels passos per il·lustrar que l'argument subministrat es converteix automàticament al tipus esperat):
(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());
En executar l'escenari anterior, la sortida imprimeix tots els valors amb èxit indicant que la conversió automàtica d'arguments als tipus de dades esperats ha estat correcta.
Així és com es veu la sortida:
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)
Transformacions argumentals
Vegem un exemple en acció per entendre-ho. Assistència, teniu una aplicació que converteix el temps donat i el converteix en minuts. Exemple: Si l'entrada d'usuari és d'1 dia, la sortida és de - 1440, si l'entrada d'usuari és d'1 dia, 2 hores i 2 minuts, la sortida hauria de ser 1562.
Ara es pot veure que per donar suport a diferents tipus d’entrades, caldrà escriure diferents implementacions d’enquadernació en funció del tipus d’entrades. Per exemple: Per a les entrades que només tinguin una part diürna, hi haurà una implementació de passos separada, per a les entrades que tinguin una part de dia, un mes, hi haurà una implementació de passos separada, etc.
Vegem com es pot implementar mitjançant una implementació d’un sol pas mitjançant la transformació de l’argument de pas i l’entrada proporcionada es converteix simplement en objecte de marca de temps i es torna al pas original que s’anomena transformació de passos.
Penseu en això com un escaneig de regex de primer nivell a la vostra entrada que retorna el valor parcialment transformat al pas de trucada.
Mireu el fitxer de funcions que té 3 variants d’entrada diferents, amb una única transformació convertint-lo en objecte complet de temps i retornant-lo.
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
Mireu els valors ressaltats a l'exemple de codi anterior. Tots aquests es faran càrrec de la mateixa transformació i el resultat final serà un valor d’entrada TimeSpan transformat que s’enviarà de nou al pas Specflow de trucada.
Vegem la implementació de la transformació a continuació:
(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); }
Perquè el marc sàpiga que és una unió de transformació, cal afegir StepArgumentTransformation Attribute al mètode que implementa la conversió d'Argument.
Els altres punts importants que cal tenir en compte sobre les conversions d’arguments són:
# 1) Les transformacions d’arguments de pas s’executen per a cada pas de coincidència, és a dir, independentment del tipus de pas, és a dir, si es dóna, quan o llavors, es produirà transformació per a cada regla de coincidència.
# 2) Depenent del tipus de retorn de la sortida transformada, si el pas de trucada real no té el tipus de retorn coincident per al paràmetre d'entrada, la transformació no tindrà lloc.
El que vol dir això és, suposem que el pas de trucada requereix una entrada transformada, però té la marca de temps mencionada d’entrada com una cosa que no coincideix amb el tipus de retorn del mètode transformat, llavors la coincidència regex s’anul·larà i la conversió no tindrà lloc.
Vegem la implementació de la trucada al pas 'Donat':
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Mireu aquí el tipus de paràmetre d’entrada, és a dir, el seu TimeSpan, que coincideix amb el tipus retornat del pas de transformació si es canvia a un altre tipus. Per exemple, String, la conversió d'arguments no es produirà i la implementació del pas original anul·larà la coincidència regex.
Consell professional: Un punt important a tenir en compte aquí és que tot el text que cal transformar s’hauria d’alimentar / fer coincidir mitjançant la transformació d’arguments de pas. Per tant, el pas Donat ara embolicarà tots els formats d’entrada possibles en una sola cadena i la transformació regex el convertirà en un objecte TimeSpan i tornarà enrere.Taules Specflow
Les taules Specflow són una manera de passar una llista dels valors a la funció d'implementació de passos. En els nostres articles anteriors, examinàvem la manera d’implementar proves basades en dades mitjançant l’esquema i exemples d’escenari. Però això consistia principalment a executar l'escenari amb diferents entrades.
Aquí, a les taules, es tracta de passar totes les dades alhora en forma de tabla a la implementació del pas que proporciona dades.
Per exemple, penseu en un exemple en què proveu un sistema de gestió d’estudiants i, per crear un nou objecte d’estudiant, se us demana que empleneu moltes dades, com ara nom, cognoms, edat, any de naixement, etc.
Una manera és passar cadascuna d’aquesta informació com un pas separat que serà essencialment un munt de codi de la caldera i, en cada pas, acabareu actualitzant el mateix objecte que cal provar. Una altra manera pot ser construir una regla regular complexa i intentar passar totes les dades en el mateix pas, però és força propens als errors i escamós.
Les taules venen al nostre rescat aquí. Totes les dades d'entrada relacionades amb els estudiants es poden enviar a la implementació del mateix pas d'una manera tabular agradable a través de la funció de taula de specflow.
Vegem un exemple de codi a continuació per a la implementació de funcions i passos:
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
Les dades de la taula es ressalten al pas de l’escenari anterior.
és la clau de seguretat de xarxa igual que la contrasenya
Specflow proporciona una gran quantitat de TableHelpers, que permeten directament funcions útils com crear una instància d'objecte a partir de les dades d'entrada subministrades per l'usuari en lloc d'analitzar cada camp pel vostre compte.
Vegem la implementació del pas a continuació:
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(); }
Mireu la secció ressaltada anterior. Aquí només hi ha una petita línia de codi, l’objecte StudentInfo sencer (que és un POCO que conté els camps de dades de l’alumne, és a dir, nom, cognoms, edat, any de naixement, etc.)
A continuació es mostren algunes altres característiques / conceptes relacionats amb les taules Specflow:
# 1) Les taules poden ser horitzontals o verticals. Les taules verticals s’assemblen més als parells clau-valor i, a l’escenari anterior, a les assignacions de valor-nom, mentre que les taules horitzontals contenen totes les dades d’un objecte en una sola fila (tal com hem vist al nostre exemple).
# 2) Les taules verticals es poden assignar a un sol objecte .NET, mentre que les taules horitzontals també es poden assignar a un conjunt o col·lecció d’objectes.
# 3) Cada valor de camp de la taula ha de ser atòmic, ja que es maparà a un sol camp corresponent de l'objecte analitzat.
Un punt important a tenir en compte aquí és que fins i tot si ho feu generació automàtica enllaços de pas amb les dades tabulars, el generador d’enllaços Specflow tindrà automàticament en compte aquests tipus d’entrada i el reconeixerà com a dades tabulars vàlides.
Conclusió
En aquest article, hem intentat explicar dos conceptes importants i útils a Specflow.
El primer pas és el Pas Transformacions argumentals que permeten conversions de tipus personalitzades per als arguments Specflow per evitar el codi boilerplate (i permet que l'script de prova tingui un aspecte més modular i lògic) i la segona característica que vam examinar és Taules Specflow que són útils quan cal passar molts camps / dades en un sol pas en un format tabular fàcil d'utilitzar.
Al nostre proper tutorial, aprendrem més sobre com podeu generar automàticament documentació preciosa mitjançant Specflow en diferents formats mitjançant eines de codi obert com Pickles, que poden servir de referència fàcil per a tots els grups d'interès del projecte.
PREV Tutorial | NEXT Tutorial
Lectura recomanada
- Desplegament a MongoDB: tutorial pas a pas
- Instal·lació i configuració pas a pas d’Appium Studio
- Specflow i Selenium Webdriver Exemple d'extrem a extrem
- Una guia pas a pas per integrar QTP amb ALM / QC
- Top 15 de les preguntes més populars de l'entrevista Specflow
- Enllaços, ganxos i reutilització compartits i abastats de flux de dades avançats
- Instal·leu MongoDB al Windows: una guia pas a pas
- Com integrar JIRA amb qTest: una guia pas a pas