step argument transformations specflow tables
Esercitazione sulle trasformazioni degli argomenti dei passaggi e sulle tabelle Specflow:
Il nostro precedente tutorial su Specflow ci ha illustrato tutto Rilegature condivise e con ambito, ganci e riutilizzo dei passaggi in dettaglio. In questo tutorial, esploreremo di più sulle trasformazioni degli argomenti dei passaggi in Specflow.
Sentiti libero di leggere il nostro Guida completa alla formazione Specflow per principianti per una chiara comprensione del concetto. La funzionalità di trasformazione degli argomenti dei passaggi di Specflow consente a un utente di fornire una trasformazione personalizzata per i parametri forniti nei passaggi.
Consente di aggiungere logica personalizzata per convertire i parametri di input in un parametro specifico. Per esempio, è possibile creare direttamente un oggetto classe dai parametri e restituire l'oggetto costruito dalla funzione di trasformazione.
Un'altra caratteristica di Specflow che esamineremo sono le tabelle Specflow che consentono di passare i dati di input in forma tabulare con un solo passaggio e gli helper delle tabelle possono farli mappare direttamente a un'istanza di Object come desiderato.
Guarda il video:
Ecco un video tutorial su Step Argument Transformations e Specflow tables:
Cosa imparerai:
Step Argument Transformations
Per comprendere meglio le trasformazioni degli argomenti, proviamo prima a capire in che modo Specflow corrisponde esattamente ai parametri. Come abbiamo visto nei nostri articoli precedenti, per esempio di ricerca su YouTube, stavamo passando il termine di ricerca come parametro per l'esecuzione dello scenario.
La corrispondenza dei parametri di solito avviene tramite un'espressione regolare e la regex corrispondente risulta nell'impostazione del parametro del metodo sul termine di ricerca fornito nel passaggio.
Proviamo prima a capire quali sono le conversioni supportate di default in Specflow e quando le trasformazioni degli argomenti possono essere utili.
Conversioni supportate
Specflow supporta molte conversioni predefinite, osservando il tipo di dati stesso dopo la corrispondenza delle espressioni regolari. Può occuparsi automaticamente di conversioni come: String, integer, GUID, Enums, ecc.
Vediamo un esempio per alcuni di questi di seguito:
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
Nell'esempio di codice sopra, abbiamo evidenziato diversi tipi di input che stiamo passando nei passaggi e nelle implementazioni dei passaggi, questi vengono convertiti nei rispettivi tipi di dati.
Vediamo di seguito le implementazioni dei passaggi per questi (per semplicità abbiamo appena creato una console per ciascuno dei passaggi per illustrare che l'argomento fornito viene convertito automaticamente nel tipo previsto):
(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());
Durante l'esecuzione dello scenario precedente, l'output stampa correttamente tutti i valori indicando che la conversione automatica degli argomenti nei tipi di dati previsti ha avuto esito positivo.
Ecco come appare l'output:
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)
Trasformazioni di argomenti
Vediamo un esempio in azione per capirlo. Supporto, hai un'applicazione che converte il tempo dato e lo converte in minuti. Esempio: Se l'input dell'utente è 1 giorno, l'output è - 1440, se l'input dell'utente è 1 giorno 2 ore 2 minuti, l'output dovrebbe essere 1562.
Ora, si può vedere che per supportare diversi tipi di input, sarà necessario scrivere diverse implementazioni di binding a seconda del tipo di input. Per esempio: Per gli input che hanno solo la fascia oraria, ci sarà un'implementazione a fasi separata, per gli input che hanno una parte per giorno, mese - ci sarà un'implementazione separata per fasi, ecc
Vediamo come questo può essere implementato attraverso l'implementazione di un singolo passaggio tramite la trasformazione Step Argument e l'input fornito viene semplicemente convertito in un oggetto timestamp e restituito al passaggio originale chiamato trasformazione del passaggio.
Considerala come una scansione regex di primo livello per il tuo input che restituisce il valore parzialmente trasformato al passaggio chiamante.
Guarda il file delle caratteristiche con 3 diverse varianti di input, con una singola trasformazione convertendolo in un oggetto timepan completo e tornando indietro.
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
Guarda i valori evidenziati nell'esempio di codice sopra. Tutti questi saranno presi cura della stessa identica trasformazione e il risultato finale sarà un valore di input TimeSpan trasformato che viene inviato di nuovo al passaggio Specflow chiamante.
Diamo un'occhiata all'implementazione della trasformazione di seguito:
(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); }
Affinché il framework sappia che si tratta di un'associazione di trasformazione, è necessario aggiungere l'attributo StepArgumentTransformation al metodo che implementa la conversione dell'argomento.
Gli altri punti importanti da notare riguardo alle conversioni degli argomenti sono:
# 1) Le trasformazioni dell'argomento del passaggio vengono eseguite per ogni passaggio corrispondente, ovvero indipendentemente dal tipo di passaggio, ovvero se è Dato, Quando o Allora, la trasformazione avverrà per ogni espressione regolare corrispondente.
#Due) A seconda del tipo restituito dell'output trasformato, se il passaggio di chiamata effettivo non ha il tipo restituito corrispondente per il parametro di input, la trasformazione non avrà luogo.
Ciò significa che, supponiamo che il passaggio di chiamata richieda un input trasformato ma abbia il timestamp di input menzionato come qualcosa che non corrisponde al tipo di ritorno del metodo trasformato, quindi la corrispondenza regex verrà sovrascritta e la conversione non avrà luogo.
Diamo un'occhiata all'implementazione della chiamata al passaggio 'Dato':
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Guarda il tipo di parametro di input qui, ad esempio il suo TimeSpan, che corrisponde al tipo restituito dalla fase di trasformazione se questo viene modificato in un altro tipo. Ad esempio String, la conversione dell'argomento non avverrà e la corrispondenza regex verrà sovrascritta dall'implementazione Step originale.
Suggerimento professionale: Un punto importante da notare qui è che l'intero testo che deve essere trasformato deve essere alimentato / abbinato attraverso la trasformazione dell'argomento del passaggio. Quindi, il passaggio Dato avvolgerà tutti i possibili formati di input in una singola stringa e la regex di trasformazione lo convertirà in un oggetto TimeSpan e tornerà indietro.Tabelle Specflow
Le tabelle Specflow sono un modo per passare un elenco dei valori alla funzione di implementazione del passaggio. Nei nostri articoli precedenti, abbiamo esaminato il modo per implementare i test basati sui dati utilizzando lo schema dello scenario e gli esempi. Ma quello era principalmente eseguire lo scenario con diversi input.
Qui, nelle tabelle, si tratta di passare tutti i dati contemporaneamente in forma tabulare all'implementazione del passaggio che fornisce i dati.
Ad esempio, considera un esempio in cui stai testando un sistema di gestione degli studenti e per creare un nuovo oggetto Studente, ti viene chiesto di inserire molti dettagli come nome, cognome, età, anno di nascita, ecc.
Un modo è passare ciascuna di queste informazioni come un passaggio separato che sarà essenzialmente un sacco di codice standard e in ogni passaggio si finirà per aggiornare lo stesso oggetto che deve essere testato. Un altro modo può essere la creazione di un'espressione regolare complessa e il tentativo di trasmettere tutti i dati nello stesso passaggio, ma è abbastanza soggetto a errori e instabile.
I tavoli vengono in nostro soccorso qui. Tutti i dati di input relativi agli studenti possono essere inviati nello stesso passaggio di implementazione in un bel modo tabellare attraverso la funzione table di specflow.
Vediamo un esempio di codice di seguito per l'implementazione di funzioni e passaggi:
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
I dati della tabella sono evidenziati nel passaggio dello scenario precedente.
che cos'è una buona app per scaricare mp3 per Android
Specflow fornisce molti TableHelpers, che consentono direttamente funzionalità utili come la creazione di un'istanza di oggetto dai dati di input forniti dall'utente piuttosto che analizzare ogni campo da soli.
Vediamo l'implementazione del passaggio di seguito:
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(); }
Guarda la sezione evidenziata sopra. Ecco solo una piccola riga di codice, l'intero oggetto StudentInfo (che è un POCO contenente i campi dei dati dello studente, ad esempio nome, cognome, età, anno di nascita, ecc.)
Di seguito sono riportate alcune altre funzionalità / concetti relativi alle tabelle Specflow:
# 1) Le tabelle possono essere orizzontali o verticali. Le tabelle verticali sono più simili a coppie chiave-valore e nello scenario precedente più simili a mappature nome-valore, mentre le tabelle orizzontali contengono tutti i dati per un oggetto in una singola riga (proprio come abbiamo visto nel nostro esempio).
#Due) Le tabelle verticali possono essere mappate a un solo oggetto .NET, mentre le tabelle orizzontali possono anche essere mappate a un insieme o una raccolta di oggetti.
# 3) Ciascun valore di campo nella tabella dovrebbe essere atomico poiché verrà mappato a un singolo campo corrispondente nell'oggetto analizzato.
Un punto importante da notare qui è che anche se tu generazione automatica collegamenti a fasi con i dati tabulari, il generatore di collegamenti Specflow terrà conto automaticamente di tali tipi di input e li riconoscerà come dati tabulari validi.
Conclusione
In questo articolo, abbiamo cercato di spiegare 2 concetti importanti e utili in Specflow.
Il primo passo è il file Step Argument trasformazioni che consentono conversioni di tipo personalizzate per gli argomenti Specflow per evitare il codice boilerplate (e consente allo script di test di apparire più modulare e logico) e la seconda caratteristica che abbiamo esaminato è Tabelle Specflow che sono utili quando è necessario trasferire molti campi / dati in un unico passaggio in un formato tabulare intuitivo.
Nel nostro prossimo tutorial, impareremo di più su come generare automaticamente una splendida documentazione utilizzando Specflow in diversi formati utilizzando strumenti open source come Pickles che possono servire un facile riferimento per tutte le parti interessate del progetto.
Tutorial PREV | PROSSIMO Tutorial
Lettura consigliata
- Distribuzione in MongoDB: tutorial passo passo
- Installazione e configurazione passo passo di Appium Studio
- Specflow e Selenium Webdriver End to End Esempio
- Una guida passo passo per integrare QTP con ALM / QC
- Le 15 principali domande di intervista su Specflow
- Binding, Hook e Step Riutilizzo avanzati Specflow condivisi e con ambito
- Installa MongoDB su Windows: una guida passo passo
- Come integrare JIRA con qTest: una guida passo passo