Articles

Specflow Tutorial: La guida definitiva allo strumento BDD

Una guida completa per Specflow e Behavior Driven Development (BDD) Tutorial:

Che cosa è Specflow?

Specflow è un framework di test che supporta le pratiche BDD in. NET framework. È un framework open source ospitato su GitHub. Aiuta a utilizzare ATDD (Acceptance test driver development) per le applicazioni.NET. Con questo, possiamo definire lo scenario in inglese semplice definito dal linguaggio Gherkin che è chiaramente comprensibile da chiunque.

Ci sono vari strumenti per la scrittura di test in BDD approccio come il Cetriolo/JBehave per Java, Lattuga per Python, Gelsomino per Javascript, Specflow per .NET.

Specflow e BDD

BDD (Comportamento Driven Development) è un insieme di pratiche o di un approccio simile a TDD (Test Driven Development), che mira a colmare il divario di comunicazione tra i diversi attori, come Prodotto, Sviluppatori e Tester.

L’obiettivo finale dell’approccio BDD è quello di creare requisiti di business che potrebbero essere compresi da tutto il team in modo da evitare malintesi e aiuta a spedire la funzionalità sviluppata nel modo più accettabile.

Una serie completa di tutorial Specflow:

Leggere la serie completa di formazione Specflow per una migliore comprensione del concetto.

Tutorial #1: Introduzione allo strumento BDD Specflow(Questo tutorial)
Tutorial #2: Specflow e Selenio Esempio
Tutorial #3: Specflow Binding & Concetti avanzati
Tutorial # 4: Step Argomento Trasformazioni& Tabelle Specflow
Tutorial #5: Specflow Living Documentation with Pickles
Tutorial #6: Specflow Report Generator
Tutorial #7: Specflow Interview questions

Una breve panoramica dei tutorial nella serie Specflow:

Tutorial # Descrizione
1 Introduzione alla Specflow BDD Strumento (Questo Tutorial)
Questo tutorial introduttivo ti spiegherà tutto su Specflow in dettaglio. Specflow è un framework di test che supporta le pratiche BDD in. NET framework. È un framework open source ospitato su GitHub. Aiuta a utilizzare ATDD (Acceptance test driver development) per le applicazioni.NET.
2 Specflow e Selenium Example
Questo tutorial si concentrerà sull’integrazione di Selenium con Specflow framework attraverso un semplice scenario di test di ricerca video sull’applicazione Youtube. Controllerai anche come condividere i dati tra diversi binding attraverso campi di classe privati.
3 Specflow e Selenium Example
Questo tutorial si concentrerà sull’integrazione di Selenium con Specflow framework attraverso un semplice scenario di test di ricerca video sull’applicazione Youtube. Controllerai anche come condividere i dati tra diversi binding attraverso campi di classe privati.
4 Passo Argomento Trasformazioni & Specflow Tabelle
si tratta di un’informativa Specflow tutorial vi expalin in dettaglio il Passo Argomento trasformazioni che consentono di personalizzare il tipo di conversioni per Specflow argomenti per evitare di codice standard e Specflow tabelle tornare utile quando si ha bisogno di passare in un sacco di campi/dati in singolo passaggio di un facile da usare formato tabulare.
5 Specflow Living Documentation with Pickles
Da questo tutorial Specflow si arriva a sapere come generare bella documentazione vivente attraverso un framework open source chiamato pickles utilizzando i file Specflow esistenti.
6 Generatore di report Specflow
In questo tutorial di reporting Specflow, imparerai i modi di eseguire test di funzionalità Specflow insieme alla generazione di report HTML attraverso l’eseguibile Specflow.
7 Domande intervista Specflow
Un elenco delle più popolari domande intervista Specflow e risposte con esempi sono inclusi in questo tutorial per voi di rompere qualsiasi intervista Specflow con successo al primo tentativo.

Iniziamo con il primo tutorial di questa serie.

Introduzione allo strumento BDD Specflow

Guarda il video Tutorial:

Ecco un video tutorial su Specflow e sviluppo guidato dal comportamento:

Caratteristiche di BDD

Le caratteristiche principali di BDD sono illustrate di seguito:

#1) Cerca di definire il comportamento del sistema o della funzionalità in fase di sviluppo attraverso un esempio o uno scenario. Ad esempio, se stai costruendo una semplice applicazione Calcolatrice, i diversi comportamenti includono addizione, moltiplicazione, divisione, ecc.

Quindi attraverso BDD, tutte le parti interessate si incontreranno prima per decidere il comportamento dell’applicazione come Aggiunta e avranno scenari come mostrato di seguito.

Given, I have 2 numbers 30 and 50 as inputWhen I add these 2 numbersThen I should get an output of 80

Se vedi la rappresentazione sopra è uno scenario in inglese chiaro che è chiaramente comprensibile da chiunque e rende chiari i requisiti per una caratteristica (secondo i criteri di accettazione). Quindi il primo passo è quello di articolare questi requisiti.

#2) Ora con una serie di questi scenari, il QA scrive test contro questi e questo inizialmente fallirà poiché la funzionalità non è ancora stata sviluppata.

#3) Ora, lo sviluppatore scrive un codice di funzionalità ed esegue nuovamente questi test.

#4) I test possono passare o fallire. Se falliscono-refactoring codice e ripetere il processo

#5) Una volta che il codice refactoring è completo tutti gli scenari/test dovrebbero passare.

Quindi, in sostanza, BDD utilizza l’approccio TDD e lo porta al livello successivo avendo alcune specifiche comuni facilmente comprensibili sotto forma di scenari. Essi rappresentano anche la documentazione caratteristica in sé.

Ci sono vari strumenti per scrivere test nell’approccio BDD come Cucumber/JBehave per Java, Lattuga per Python, Jasmine per Javascript, Specflow per .NET.

In questo tutorial, ci concentreremo su Specflow.

Leggi anche =>Top BDD Tools and Testing Framework

Le parole chiave – Date, quando&Quindi

Dal mondo dei test unitari, la maggior parte di noi ha familiarità con 3 A, cioè Arrange, Act e Assert. Ora, Dato, Quando e poi sono le sostituzioni per questi nel mondo BDD.

Prendiamo un esempio per comprendere ciascuno di questi. Supponiamo che tu stia elencando uno scenario per convalidare un prodotto che viene aggiunto al carrello di un’applicazione di e-commerce che richiede l’accesso come pre-requisito.

La specifica può essere scritta come segue:

Scenario: Products get added to cart for a logged in customerGiven I have a logged-in customer on my applicationWhen I add 2 quantity of a product to my shopping cartThen the shopping cart should get updated and have the right product and quantity 

Dato: Questo è usato per descrivere un insieme di pre-condizioni per lo scenario da definire. Ad esempio, nell’esempio, il pre-requisito dello scenario è un cliente connesso. Quindi confrontando con l’analogia di Arrangiamento in un test unitario, l’implementazione del passo dovrà garantire che ci sia un cliente registrato.

Quando: Viene usato per descrivere un’azione o un passaggio di esecuzione. Nell’esempio, mostra che il cliente sta cercando di aggiungere un prodotto al suo carrello. Quindi l’implementazione passo per questo passaggio si prenderà cura del codice di simulazione per aggiungere un prodotto al carrello. Questo può essere paragonato alla fase Act nei test unitari.

Allora: Questo è usato per descrivere il risultato dello scenario ed essenzialmente dove devono essere collocate le convalide. Può essere paragonato al passo Assert nel mondo dei test unitari. Nell’esempio qui, l’implementazione del passo affermerà se il prodotto è stato effettivamente aggiunto e la quantità è la stessa scelta dal cliente.

Il file di funzionalità

Il file di funzionalità è essenzialmente un raggruppamento di più scenari per l’applicazione in fase di sviluppo o test. Può anche essere semplicemente pensato come diversi moduli dell’applicazione con cui l’applicazione può essere logicamente separata.

Ad esempio:

Un’applicazione di e-commerce può decidere di avere diversi file di funzionalità di alto livello come:

  • Funzionalità di login/Logout
  • Carrello
  • Pagamento ecc.

Che cos’è Specflow?

Specflow è uno strumento che supporta le pratiche BDD in.NET framework. È un framework open source ospitato su GitHub. Aiuta a utilizzare ATDD (Acceptance test driver development) per le applicazioni.NET.

I requisiti aziendali vincolanti per un’applicazione utilizzando il paradigma Specification By Example aiutano a comprendere meglio il comportamento dell’applicazione da parte di tutti gli stakeholder e quindi si traducono nella spedizione del prodotto con aspettative corrette.

Fa uso della sintassi Gherkin per la creazione di funzionalità& scenari. Ha anche un forum di discussione/sviluppatore attivo.

Specflow – Guida introduttiva

In questa sezione, esploreremo l’installazione di specflow nell’IDE di Visual Studio e la creazione di file di funzionalità per una semplice applicazione di utilità stringa.

Informazioni sull’applicazione di esempio

Illustreremo diverse caratteristiche del framework Specflow in questo tutorial utilizzando un’applicazione calcolatrice che ha funzioni/interfacce per fornire diverse operazioni come:

  1. Aggiunta di 2 numeri.
  2. Sottraendo 2 numeri.
  3. Dividendo e moltiplicando 2 numeri.
  4. Trovare la radice quadrata del numero dato.

Guida all’installazione di Specflow

L’installazione di Specflow è un processo in 2 fasi

#1) Installare i plugin necessari nell’IDE di Visual Studio.

  • Per installare il plugin specflow passare a Strumenti- > Estensione& Aggiornamenti.
  • Ora fai clic su “Online” sul pannello di sinistra.
  • Ora cerca specflow nel pannello di destra.
  • Dai risultati della ricerca selezionare “Specflow per Visual Studio 2017”.

Installazione Specflow-Plugin

#2) Impostazione del progetto con file di funzionalità e definizioni dei passaggi.

  • Crea un semplice nuovo progetto in Visual Studio. Possiamo creare qualsiasi tipo di progetto come libreria di classi / applicazione console / progetto di test unitario ecc. Per semplicità, stiamo prendendo un progetto di libreria di classi. Denominare il progetto come “SpecflowBasic”.
  • Per eseguire gli scenari Specflow che stiamo per creare, abbiamo bisogno di un test runner. Specflow fornisce un corridore fuori dalla scatola chiamato Specflow + Runner (che è una versione a pagamento e la versione gratuita introduce un ritardo).

(Altri corridori sono disponibili anche per NUnit e MsTest che vedremo negli ulteriori articoli di questa serie).

Per installare Specflow + Runner – Vai a Strumenti- > Gestore pacchetti NuGet- > Console Gestore pacchetti.

Una volta aperta la console di gestione pacchetti, eseguire il comando.

 Install-Package SpecRun.SpecFlow

Specrun-Installation

  • Inoltre, per affermare i valori, avremo bisogno dell’aiuto di un framework di test. NUnit può essere una delle opzioni e gli altri includono MsTest, ecc. Per installare il framework NUnit nell’applicazione, aprire la console di Gestione pacchetti e digitare il comando.
 Install-Package NUnit 

#3) Creare una nuova classe denominata “CalculatorApplication” che diventerà la nostra applicazione in prova. Questa è una classe semplice con funzioni per eseguire addizione/moltiplicazione/divisione / radice quadrata ecc., per l’input dato. Ecco come appare la classe CalculatorApplication.

#4) Una volta installato il pacchetto, creare 2 cartelle nel progetto e denominarle come Caratteristiche e definizioni dei passaggi per la memorizzazione rispettivamente dei file di funzionalità e dei binding dei passaggi. Discuteremo in dettaglio il motivo di questa organizzazione di cartelle per le definizioni dei passaggi &.

#5) Ora nella cartella caratteristiche, aggiungere un nuovo file di funzionalità e il nome come CalculatorFeature.

Funzione calcolatrice

Vedrai che per impostazione predefinita il file di funzionalità ha una descrizione in Funzionalità e Scenario.

Sostituiscilo con quello che stiamo per testare.

 Feature: CalculatorFeatureIn order to test my applicationAs a developerI want to validate different operations of the applicationScenario: Add two numbersGiven I have provided 70 and 20 as the inputsWhen I press addThen the result should be 90Scenario: Substract two numbersGiven I have provided 70 and 20 as the inputsWhen I press substractThen the result should be 50Scenario: Multiply two numbersGiven I have provided 70 and 20 as the inputsWhen I press multiplyThen the result should be 1400Scenario: Divide two numbersGiven I have provided 70 and 20 as the inputsWhen I press divideThen the result should be 3.5Scenario: SquareRoot of numberGiven I have provided 70 as inputWhen I press squarerootThen the result should be 8.37

#6) Generating Step Definitions: Specflow fornisce un modo automatico per generare associazioni / implementazione per i diversi passaggi in scenari di file di funzionalità. Questo può essere ottenuto facendo clic destro sul file di funzionalità e facendo clic su “Genera definizioni passo”.

Genera Step Definition

Questo passaggio non garantisce un’implementazione per tutti i passaggi, ma fa del suo meglio per raggruppare i passaggi comuni in scenari e riutilizzare il maggior numero di binding possibile. Tuttavia, rende il lavoro di evitare il codice boilerplate ogni volta che è necessario implementare una fase di scenario.

Dopo aver fatto clic su “Genera definizioni passo”, Verrà visualizzata una finestra che elenca le implementazioni passo identificati che il processore ha rilevato. Si può selezionare o deselezionare secondo i requisiti.

Genera Step Definition Skeleton

Nelle sezioni successive, esamineremo maggiori dettagli sul menu a discesa Stile mostrato nello screenshot qui sopra.

Per ora, manteniamo tutti selezionati con le impostazioni predefinite. Facendo clic sull’anteprima verrà visualizzata un’istantanea di come sarà l’implementazione.

Istantanea dell'implementazione

Dopo aver creato le definizioni dei passaggi, tuttavia, se ci sono alcuni passaggi non implementati, i file delle funzionalità hanno un modo visivo di identificare le applicazioni non implementate. Mostra questi passaggi in un colore diverso rendendo assolutamente semplice sapere che ci sono alcuni passaggi che non hanno ancora un’implementazione (o che hanno definizioni di passaggi ambigue).

Una schermata di esempio lo descrive di seguito:

Implementazione mancante

Nota: le definizioni dei passaggi possono essere create manualmente, qualsiasi .il file cs con Attributo è una classe di implementazione Step e la sintassi Gherkin cercherà di abbinare l’implementazione dello scenario step

Execution

Come abbiamo già aggiunto Specflow+ Runner nella sezione precedente, l’esecuzione degli scenari è piuttosto semplice (poiché è una versione di valutazione di Specrun, introduce un ritardo variabile di 10-20s prima dell’esecuzione degli scenari. , Questo ritardo non è presente per varianti registrate e altri sapori di Specrun runner come NUnit e MsTest).

Se tutti i passaggi non sono stati implementati e se ci sono ancora binding che hanno uno stato in sospeso. Quindi l’output verrà visualizzato come in sospeso.

Proviamo a eseguire questi test / scenari a questo punto quando non c’è implementazione per i binding e gli scenari sono tutti in sospeso.

Scenari in sospeso

Ora proviamo a implementare la classe CalculatorApplication con i metodi che vogliamo testare cioè aggiungere, sottrarre, moltiplicare, dividere e sqrt.

Di seguito è riportato un esempio di codice di come appare la nostra classe CalculatorApplication:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SpecflowBasic { class CalculatorApplication { public int add(int input1, int input2) { return input1 + input2; } public int subsctract(int input1, int input2) { return input1 - input2; } public int multiply(int input1, int input2) { return input1 * input2; } public double divide(double input1, double input2) { return input2 != 0 ? Math.Round(input1 / input2, 2) : 0; } public double squareRoot(int input1) { return input1 != 0 ? Math.Round(Math.Sqrt(input1), 2) : 0; } } } 

Una volta che l’applicazione è pronta, proviamo a capire i modi per implementare i binding per ciascuno dei passaggi dello scenario.

Vediamo l’approccio passo passo per implementare questi:

  • Innanzitutto, dobbiamo avere un’istanza dell’applicazione che deve essere testata. Per semplicità, possiamo istanziare l’AUT (Application Under Test class) nei binding step e utilizzare l’istanza istanziata per chiamare effettivamente diversi metodi/funzioni secondo il passaggio implementato.
  • Per catturare l’input e l’output stiamo dichiarando variabili per contenere questi valori al fine di chiamare le funzioni sull’istanza dell’applicazione.

Vediamo l’implementazione end to end per tutti i binding coinvolti nella convalida della funzionalità Add (il resto degli scenari sta semplicemente estendendo questo).

Lo scenario Add appare come mostrato di seguito:

Scenario: Add two numbers Given I have provided 70 and 20 as the inputs When I press add Then the result should 

Vediamo l’implementazione del passo per ciascuno di questi singoli passaggi. Per l’uso di tutte le implementazioni di step, stiamo dichiarando un’istanza di applicazione in prova e le variabili per contenere le variabili di input e output come mostrato di seguito:

// instantiating application instance CalculatorApplication app = new CalculatorApplication(); // variables to hold input values and the intermeditate result int input1, input2; double output; 

Vediamo l’implementazione dei passaggi di scenario uno per uno.

Passo 1: Dato che ho fornito 70 e 20 come input.

 public void GivenIHaveProvidedAndAsTheInputs(int p0, int p1) { input1 = p0; input2 = p1; } 

Qui, abbiamo appena inizializzato le variabili di input con i valori passati dai passaggi dello scenario. p0 e p1 sono i valori che vengono passati dal passaggio scenario e verranno inizializzati come 70 & 20 rispettivamente.

Passo 2: Quando premo Aggiungi.

 public void WhenIPressAdd() { output = app.add(input1, input2); } 

Questa è la fase di esecuzione (o Act) in cui viene chiamato il metodo effettivo sull’applicazione in prova. Si noti che poiché le variabili di input input1 e input2 contengono già i valori passati nel passaggio 1, l’istanza dell’applicazione può chiamare il metodo con queste variabili.

Passo 3: – Quindi il risultato dovrebbe essere 90.

 public void ThenTheResultShouldBe(double p0) { Assert.AreEqual(p0, output); }

Questo è il passaggio di convalida (o Assert) in cui l’output viene generato dalla chiamata al metodo e l’istanza dell’applicazione viene convalidata rispetto all’output previsto.

Si noti che la parola chiave Assert utilizzata proviene da NUnit Framework, che restituisce true o false a seconda della convalida / aspettativa impostata. Nel caso in cui restituisca false, l’implementazione del passaggio fallirà e ciò mostrerà il risultato dello scenario come fail.

Inoltre, si noti che la variabile di output ottiene il valore dal passaggio precedente in cui è stato chiamato il metodo effettivo sull’istanza dell’applicazione.

Simile a quanto sopra, le implementazioni dei passaggi per il resto dei passaggi dello scenario vengono eseguite allo stesso modo, la differenza è nel chiamare metodi diversi sull’istanza dell’applicazione e affermare valori di output diversi.

Una volta implementati tutti i passaggi dello scenario, i test possono essere eseguiti.

L’output risultante apparirà come mostrato di seguito:

Consolidato di Uscita

È inoltre possibile visualizzare l’uscita del singolo scenario che elenca l’output delle singole operazioni:

Scenario di Uscita

Conclusione

Spero che questo articolo avrebbe dato una comprensione di base di ciò che BDD è e quali sono gli strumenti che supportano BDD per .NET dove abbiamo coperto Specflow.

Abbiamo anche discusso l’installazione e l’esecuzione di file di funzionalità Specflow con l’aiuto di un’applicazione di esempio.

File di codice

I file di codice utilizzati nell’applicazione sono mostrati di seguito:

calcolatorecaratteristichepassi.cs

using System;using TechTalk.SpecFlow;using NUnit;using NUnit.Framework;namespace SpecflowBasic.StepDefinitions{public class CalculatorFeatureSteps{// instantiating application instanceCalculatorApplication app = new CalculatorApplication();// variables to hold input values and the intermeditate resultint input1, input2;double output;public void GivenIHaveProvidedAndAsTheInputs(int p0, int p1){input1 = p0;input2 = p1;}public void GivenIHaveProvidedAsInput(int p0){input1 = p0;}public void WhenIPressAdd(){output = app.add(input1, input2);}public void WhenIPressSubstract(){output = app.subsctract(input1, input2);}public void WhenIPressMultiply(){output = app.multiply(input1, input2);}public void WhenIPressDivide(){output = app.divide(input1, input2);}public void WhenIPressSquareroot(){output = app.squareRoot(input1);}public void ThenTheResultShouldBe(double p0){Assert.AreEqual(p0, output);}}} 

Applicazione di calcolo.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace SpecflowBasic{class CalculatorApplication{public int add(int input1, int input2){return input1 + input2;}public int subsctract(int input1, int input2){return input1 - input2;}public int multiply(int input1, int input2){return input1 * input2;}public double divide(double input1, double input2){return input2 != 0 ? Math.Round(input1 / input2, 2) : 0;}public double squareRoot(int input1){return input1 != 0 ? Math.Round(Math.Sqrt(input1), 2) : 0;}}} 

pacchetti.config

<?xml version="1.0" encoding="utf-8"?><packages><package version="10.0.3" targetFramework="net461" /><package version="3.11.0" targetFramework="net461" /><package version="2.4.0" targetFramework="net461" /><package version="1.8.5" targetFramework="net461" /><package version="1.8.5" targetFramework="net461" /><package version="1.8.5" targetFramework="net461" /><package version="4.3.0" targetFramework="net461" /></packages>

Il nostro prossimo tutorial ti illustrerà l’esempio di utilizzo di Specflow e Selenium Webdriver!

PROSSIMO tutorial