Articles

Specflow Tutorial: Den ultimata guiden till BDD Tool

en komplett Guide till Specflow och Behavior Driven Development (BDD) handledning:

vad är Specflow?

Specflow är ett testramverk som stöder BDD-praxis i. NET framework. Det är ett open source-ramverk som finns på GitHub. Det hjälper till att använda ATDD (Acceptance test driver development) för.NET-applikationer. Med detta kan vi definiera scenario på vanlig engelska definierat av Gurkinspråk som är tydligt förståeligt av någon.

det finns olika verktyg för att skriva tester i BDD-metoden som gurka/JBehave för Java, sallad för Python, Jasmine för Javascript, Specflow för .NET.

Specflow och BDD

BDD (Behavior Driven Development) är en uppsättning metoder eller ett tillvägagångssätt som liknar TDD (Test Driven Development), som syftar till att överbrygga kommunikationsgapet mellan olika intressenter som produkt, utvecklare och testare.slutmålet med BDD-metoden är att skapa affärskrav som kan förstås av hela teamet för att undvika missförstånd och hjälper till att skicka funktionen som utvecklas på det mest acceptabla sättet.

en komplett Specflow Tutorial Series:

Läs igenom hela Specflow Training Series för bättre förståelse av konceptet.

Tutorial #1: Introduktion till Specflow BDD Tool(denna handledning)
Tutorial # 2: Specflow och selen exempel
Tutorial # 3: Specflow bindande & avancerade koncept
Tutorial # 4: Steg Argument transformationer & Specflow tabeller
Tutorial # 5: Specflow levande dokumentation med Pickles
Tutorial # 6: Specflow Report Generator
Tutorial # 7: Specflow intervjufrågor

en kort översikt över Tutorials i Specflow serien:

handledning # beskrivning
1 introduktion till specflow BDD tool (denna handledning)
denna inledande handledning kommer att förklara allt om specflow i detalj. Specflow är ett testramverk som stöder BDD-praxis i. NET framework. Det är ett open source-ramverk som finns på GitHub. Det hjälper till att använda ATDD (Acceptance test driver development) för.NET-applikationer.
2 Specflow och Selenium exempel
denna handledning kommer att fokusera på integrationen av selen med Specflow framework genom ett enkelt testscenario för videosökning på Youtube-applikationen. Du kommer också att kontrollera hur du delar data över olika bindningar via privata klassfält.
3 Specflow och Selenium exempel
denna handledning kommer att fokusera på integrationen av selen med Specflow framework genom ett enkelt testscenario för videosökning på Youtube-applikationen. Du kommer också att kontrollera hur du delar data över olika bindningar via privata klassfält.
4 steg Argument transformationer & Specflow tabeller
denna informativa Specflow handledning kommer expalin i detalj om steg Argument transformationer som tillåter anpassade typ omvandlingar för Specflow argument för att undvika standardtext kod och Specflow tabeller komma till hands när du behöver passera i en hel del fält/data i ett enda steg i ett användarvänligt tabellformat.
5 Specflow levande dokumentation med Pickles
från denna Specflow handledning kommer du att få veta hur man genererar snygg levande dokumentation genom en öppen källkod ram som kallas pickles med dina befintliga Specflow filer.
6 Specflow Report Generator
i denna Specflow rapportering handledning, kommer du att lära dig hur att utföra Specflow funktionstester tillsammans med att generera HTML-rapporter genom Specflow körbara.
7 Specflow intervjufrågor
en lista över de mest populära Specflow Intervju Frågor och svar med exempel ingår i denna handledning för dig att knäcka någon Specflow intervju framgångsrikt vid första försöket.

låt oss börja med den första handledningen i denna serie.

introduktion till Specflow BDD Tool

titta på videohandledningen:

Här är en videohandledning om Specflow och Beteendedriven utveckling:

funktioner i BDD

de viktigaste funktionerna i BDD informeras nedan:

# 1) det försöker definiera beteendet hos systemet eller funktionen som utvecklas genom ett exempel eller scenario. Till exempel, om du bygger en enkel kalkylator ansökan då de olika beteenden inkluderar addition, multiplikation, division, etc.

därför genom BDD kommer alla intressenter först att träffas för att bestämma beteendet hos applikationen som tillägg och kommer att ha scenarier som visas nedan.

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

Om du ser ovanstående representation är det ett scenario på vanlig engelska som är klart förståeligt av någon och gör kraven för en funktion tydlig (enligt acceptanskriterierna). Därför är det första steget att formulera dessa krav.

#2) nu med en uppsättning av dessa scenarier skriver QA tester mot dessa och detta kommer initialt att misslyckas eftersom funktionen ännu inte är utvecklad.

#3) nu skriver utvecklaren en funktionskod och utför dessa tester igen.

#4) testerna kan passera eller misslyckas. Om de misslyckas – refactor kod och upprepa processen

#5) när kod refactoring är klar alla scenarier/tester ska passera.

därför använder BDD i huvudsak TDD-tillvägagångssätt och tar det till nästa nivå genom att ha några vanliga lättförståeliga SPECIFIKATIONER i form av scenarier. De representerar också funktionsdokumentationen i sig.

det finns olika verktyg för att skriva tester i BDD-metoden som gurka/JBehave för Java, sallad för Python, Jasmine för Javascript, Specflow för .NET.

i denna handledning kommer vi att fokusera på Specflow.

Läs också = > Top BDD Tools and Testing Framework

nyckelorden – Given, när & sedan

från enhetstestvärlden är de flesta av oss bekanta med 3 A, dvs ordna, agera och hävda. Nu, givet, när och då är ersättningarna för dessa i BDD-världen.

låt oss ta ett exempel för att förstå var och en av dessa. Antag att du listar ett scenario för att validera en produkt som läggs till i kundvagnen för en e-handelsapplikation som kräver att du är inloggad som en förutsättning.

specifikationen kan skrivas enligt följande:

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 

givet: detta används för att beskriva en uppsättning förutsättningar för det scenario som definieras. Till exempel i exemplet är scenariets förutsättning en inloggad kund. Därför jämföra med ordna analogi i ett enhetstest, steg genomförandet kommer att behöva se till att det finns en inloggad kund.

När: detta används för att beskriva en åtgärd eller exekveringssteg. I exemplet visar det att kunden försöker lägga till en produkt i sin kundvagn. Därför kommer stegimplementeringen för detta steg att ta hand om simuleringskoden för att lägga till en produkt i kundvagnen. Detta kan jämföras med Act-steget i Enhetstesterna.

sedan: detta används för att beskriva resultatet av scenariot och i huvudsak där valideringarna ska placeras i. Det kan jämföras med Assert-steget i Enhetstestvärlden. I exemplet här kommer stegimplementeringen att hävda om produkten faktiskt har lagts till och kvantiteten är densamma som den som valts av kunden.

Funktionsfilen

funktionsfilen är i huvudsak en gruppering av flera scenarier för applikationen under utveckling eller test. Det kan också helt enkelt betraktas som olika moduler i applikationen genom vilken applikationen logiskt kan separeras.

till exempel:

en e-handelsapplikation kan välja att ha olika högnivåfunktioner som:

  • logga in/Logga ut funktionalitet
  • kundvagn
  • betalning etc.

Vad är Specflow?

Specflow är ett verktyg som stöder BDD-praxis i. NET framework. Det är ett open source-ramverk som finns på GitHub. Det hjälper till att använda ATDD (Acceptance test driver development) för.NET-applikationer.

bindande affärskrav för en applikation med specifikation genom exempel paradigm hjälper till att bättre förstå applikationsbeteendet hos alla intressenter och resulterar därmed i att produkten levereras med korrekta förväntningar.

den använder sig av gurka syntax för att skapa funktioner & scenarier. Det har också ett aktivt diskussions – / utvecklarforum.

Specflow-komma igång

i det här avsnittet kommer vi att undersöka installera specflow i Visual Studio IDE och skapa funktionsfiler för ett enkelt Strängverktyg.

om Exempelapplikation

Vi kommer att illustrera olika funktioner i Specflow-ramverket i denna handledning med hjälp av en Kalkylatorapplikation som har funktioner/gränssnitt för att tillhandahålla olika operationer som:

  1. lägga till 2 nummer.
  2. subtrahera 2 siffror.
  3. dela och multiplicera 2 siffror.
  4. hitta kvadratroten för det angivna numret.

Specflow Installationsguide

Specflow installation är en 2-stegsprocess

# 1) Installera nödvändiga plugins i Visual Studio IDE.

  • för att installera specflow plugin navigera till Verktyg – > Extension & uppdateringar.
  • Klicka nu på ”Online” på den vänstra panelen.
  • Sök nu efter specflow i den högra panelen.
  • från sökresultaten väljer du ”Specflow för Visual Studio 2017”.

Specflow-Plugin Installation

#2) Ställa in projektet med funktionsfiler och stegdefinitioner.

  • skapa ett enkelt nytt projekt i Visual Studio. Vi kan skapa alla typer av projekt som klassbibliotek / konsolprogram / Enhetstestprojekt etc. För enkelhetens skull tar vi upp ett Klassbiblioteksprojekt. Namnge projektet som”SpecflowBasic”.
  • för att kunna köra Specflow-scenarierna som vi ska skapa behöver vi en testlöpare. Specflow ger en löpare ur lådan som heter Specflow + Runner (som är en betald version och den fria versionen introducerar en fördröjning).

(andra löpare är också tillgängliga för NUnit och MsTest som vi kommer att se i de ytterligare artiklarna i denna serie).

för att installera Specflow + Runner – navigera till Verktyg – > NuGet Package Manager -> Package Manager Console.

När Pakethanterarens konsol öppnas – Kör kommandot.

 Install-Package SpecRun.SpecFlow

Specrun-Installation

  • för att hävda värdena behöver vi också hjälp av ett testramverk. NUnit kan vara ett av alternativen och de andra inkluderar MsTest, etc. För att installera NUnit framework till programmet, öppna Package Manager-konsolen och skriv kommandot.
 Install-Package NUnit 

#3) Skapa en ny klass med namnet” CalculatorApplication ” som kommer att bli vår applikation under test. Detta är en enkel klass som har funktioner för att utföra addition/multiplikation/division/kvadratrot etc., för den givna ingången. Så här ser Kalkylatornapplikationsklass ut.

#4) när paketet blir installerat, Skapa 2 mappar i projektet och namnge dem som funktioner och steg definitioner för att lagra funktionsfiler och steg bindningar respektive. Vi kommer att diskutera i detalj orsaken till den här mapporganisationen för funktionen & stegdefinitioner.

#5) Lägg nu till en ny Funktionsfil i mappen funktioner och namnge den som CalculatorFeature.

Kalkylatorfunktion

du skulle se att funktionsfilen som standard har någon beskrivning i funktion och Scenario.

ersätt det med vad vi ska testa.

 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) generera steg definitioner: Specflow ger ett automatiserat sätt att generera bindningar/genomförande för de olika stegen i funktion fil scenarier. Detta kan uppnås genom att högerklicka på funktionsfilen och klicka på ”Generera Stegdefinitioner”.

generera Stegdefinition

detta steg garanterar inte en implementering för alla steg, men det försöker sitt bästa för att gruppera de vanliga stegen i scenarier och återanvända så många bindningar det kan. Det gör dock jobbet att undvika standardkodskod varje gång när ett scenariosteg behöver implementeras.

Efter att ha klickat på” Generera Stegdefinitioner ” visas ett fönster som visar de identifierade stegimplementeringarna som processorn har upptäckt. Man kan välja eller avmarkera enligt kraven.

generera Step Definition Skeleton

i de senare avsnitten kommer vi att undersöka mer information om rullgardinsmenyn stil som visas i ovanstående skärmdump.

För nu, låt oss hålla dem alla valda med standardinställningar. Genom att klicka på förhandsgranskningen visas en ögonblicksbild av hur implementeringen kommer att se ut.

Snapshot of Implementation

Efter att ha skapat stegdefinitioner, har Funktionsfilerna fortfarande, om det finns några icke-implementerade steg, ett visuellt sätt att identifiera de un-implementerade applikationerna. Det visar dessa steg i en annan färg genom att göra det helt enkelt att veta att det finns några steg som inte har en implementering ännu (eller har några tvetydiga stegdefinitioner).

en Exempelskärm visar det nedan:

saknad implementering

Obs: stegdefinitionerna kan också skapas manuellt – alla .cs-fil som har attribut är en stegimplementeringsklass och Gherkinsyntaxen kommer att leta efter att matcha implementeringen av det givna scenariosteget

exekvering

som vi redan har lagt till Specflow+ Runner i ovanstående avsnitt är det ganska enkelt att utföra scenarierna (eftersom det är en utvärderingsversion av Specrun, introducerar den en variabel fördröjning på 10-20 innan scenarierna körs. , Denna fördröjning är inte närvarande för registrerade varianter och andra smaker av Specrun runner som NUnit och MsTest).

om alla steg inte har implementerats och om det fortfarande finns bindningar som har ett väntande tillstånd. Då kommer utmatningen att visas som väntande.

Låt oss försöka köra dessa tester/scenarier vid denna tidpunkt när det inte finns någon implementering för bindningarna, och scenarierna är alla väntande.

väntande scenarier

låt oss nu försöka implementera CalculatorApplication class med de metoder som vi vill testa, dvs lägga till, subtrahera, multiplicera, dela och sqrt.

nedan är ett kodexempel på hur vår CalculatorApplication class ser ut:

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; } } } 

när applikationen är klar, låt oss försöka lista ut sätten att implementera bindningarna för vart och ett av scenariostegen.

Låt oss se steg för steg-metoden för att implementera dessa:

  • först måste vi ha en instans av applikationen som måste testas. För enkelhet kan vi instantiera AUT (Application Under Test class) I stegbindningar och använda instansierad instans för att faktiskt ringa olika metoder/funktioner enligt det steg som implementeras.
  • för att fånga input och output förklarar vi variabler för att hålla dessa värden för att ringa funktioner på Applikationsinstansen.

Låt oss se implementeringen från början till slut för alla bindningar som är involverade i att validera tilläggsfunktionen (resten av scenarierna utvidgar helt enkelt detta).

Lägg till scenario ser ut som visas nedan:

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

Låt oss se stegimplementeringen för vart och ett av dessa enskilda steg. För användning av alla stegimplementeringar förklarar vi en instans av applikation under test samt variabler för att hålla inmatnings-och utgångsvariabler som visas nedan:

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

Låt oss se implementeringen av scenariosteg en efter en.

Steg 1: med tanke på att jag har tillhandahållit 70 och 20 som ingångar.

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

Här har vi just initierat inmatningsvariablerna med värdena som skickas in från scenariostegen. p0 och p1 är de värden som skickas in från scenariosteget och kommer att initieras som 70 & 20 respektive.

steg 2: när jag trycker på Lägg till.

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

detta är Exekveringssteget (eller Act) där den faktiska metoden anropas på applikationen som testas. Lägg märke till att eftersom inmatningsvariablerna input1 och input2 redan innehåller de värden som skickas i steg 1 kan applikationsinstansen anropa metoden med dessa variabler.

steg 3: – Då ska resultatet vara 90.

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

detta är Valideringssteget (eller Assert) där utmatningen genereras av metoden call on och Applikationsinstansen valideras mot den förväntade utmatningen.

Observera att det använda nyckelordet Assert är från NUnit Framework, vilket returnerar sant eller falskt beroende på validering/förväntan som är inställd. Om det returnerar false kommer det att leda till att stegimplementeringen misslyckas och det visar scenarioresultatet som misslyckas.

Observera också att utmatningsvariabeln får värdet från föregående steg där den faktiska metoden anropades på applikationsinstansen.

I likhet med ovanstående utförs Stegimplementeringar för resten av scenariostegen på samma sätt, skillnaden är att ringa olika metoder på applikationsinstansen och hävda olika utgångsvärden.

När alla Scenariosteg har implementerats kan testerna utföras.

den resulterande utgången kommer att se ut som visas nedan:

konsoliderad Ouput

Du kan också se utmatningen från det enskilda scenariot som också listar utmatningen från enskilda steg:

Scenarioutmatning

slutsats

hoppas att den här artikeln skulle ha gett dig en grundläggande förståelse för vad BDD är och vad BDD är vilka är verktygen som stöder BDD för.net där vi täckte specflow.

vi diskuterade också att installera och köra Specflow-funktionsfiler med hjälp av en exempelapplikation.

kodfiler

kodfilerna som används i applikationen visas nedan:

CalculatorFeatureSteps.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);}}} 

CalculatorApplication.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;}}} 

paket.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>

vår kommande handledning kommer att informera dig från början till slut exempel på att använda Specflow och Selenium Webdriver!

nästa handledning