Articles

SpecFlow Tutorial: najlepszy przewodnik po narzędziu BDD

kompletny przewodnik po Specflow i Behavior Driven Development (BDD) Tutorial:

Co to jest Specflow?

Specflow to framework testowy wspierający praktyki BDD w.NET framework. Jest to framework open source hostowany na GitHub. Pomaga w użyciu ATDD (Acceptance test driver development) dla aplikacji. NET. Dzięki temu możemy zdefiniować scenariusz w prostym języku angielskim zdefiniowanym przez język Gherkin, który jest zrozumiały dla każdego.

istnieją różne narzędzia do pisania testów w podejściu BDD, takie jak Cucumber/JBehave dla Javy, Lettuce dla Pythona, jaśmin dla Javascript, Specflow dla .NET.

Specflow i BDD

BDD (Behavior Driven Development) to zestaw praktyk lub podejście podobne do TDD (Test Driven Development), które ma na celu wypełnienie luki komunikacyjnej między różnymi interesariuszami, takimi jak produkt, Programiści i testery.

celem końcowym podejścia BDD jest stworzenie wymagań biznesowych, które mogą być zrozumiane przez cały zespół, aby uniknąć nieporozumień i pomóc w dostarczaniu rozwijanej funkcji w najbardziej akceptowalny sposób.

Pełna seria samouczków Specflow:

Przeczytaj całą serię szkoleń Specflow, aby lepiej zrozumieć koncepcję.

Tutorial # 1: Wprowadzenie do narzędzia SpecFlow BDD (ten Tutorial)
Tutorial #2: przykład SpecFlow i Selenium
Tutorial # 3: Wiązanie Specflow & Zaawansowane koncepcje
Tutorial # 4: Step Argument Transformations & tabele Specflow
Tutorial # 5: SpecFlow Living Documentation with Pickles
Tutorial # 6: SpecFlow Report Generator
Tutorial # 7: SpecFlow Interview questions

krótki przegląd samouczków z serii Specflow:

Tutorial # opis
1 wprowadzenie do narzędzia SpecFlow BDD (ten poradnik)
ten poradnik wprowadzający wyjaśni Ci wszystko o SpecFlow w szczegółach. Specflow to framework testowy wspierający praktyki BDD w. NET framework. Jest to framework open source hostowany na GitHub. Pomaga w użyciu ATDD (Acceptance test driver development) dla aplikacji. NET.
2 SpecFlow i Selenium przykład
ten poradnik skupi się na integracji Selenium z frameworkiem Specflow poprzez prosty scenariusz testowy wyszukiwania wideo w aplikacji Youtube. Sprawdzisz również, jak udostępniać dane w różnych powiązaniach za pomocą pól klasy prywatnej.
3 SpecFlow i Selenium przykład
ten poradnik skupi się na integracji Selenium z frameworkiem Specflow poprzez prosty scenariusz testowy wyszukiwania wideo w aplikacji Youtube. Sprawdzisz również, jak udostępniać dane w różnych powiązaniach za pomocą pól klasy prywatnej.
4 Step Argument Transformations& tabele Specflow
ten pouczający samouczek SpecFlow szczegółowo omówi transformacje argumentów Step, które umożliwiają konwersję niestandardowych typów argumentów SpecFlow, aby uniknąć kodu boilerplate i tabele Specflow przydają się, gdy musisz przekazać wiele pól / danych w jednym kroku w przyjaznym dla użytkownika formacie tabelarycznym.
5 Specflow Living Documentation with Pickles
z tego samouczka SpecFlow dowiesz się, jak wygenerować dobrze wyglądającą dokumentację życia za pomocą otwartego szkieletu o nazwie pickles przy użyciu istniejących plików Specflow.
6 Generator raportów Specflow
w tym samouczku raportowania Specflow poznasz sposoby wykonywania testów funkcji SpecFlow wraz z generowaniem raportów HTML za pośrednictwem pliku wykonywalnego Specflow.
7 SpecFlow Interview questions
lista najpopularniejszych pytań i odpowiedzi SpecFlow interview wraz z przykładami znajduje się w tym samouczku, aby złamać dowolny Wywiad SpecFlow przy pierwszej próbie.

Zacznijmy od pierwszego samouczka z tej serii.

Wprowadzenie do narzędzia SpecFlow BDD

Obejrzyj samouczek wideo:

Oto samouczek wideo na temat Specflow i Behavior Driven Development:

cechy BDD

kluczowe cechy BDD są opisane poniżej:

#1) próbuje zdefiniować zachowanie systemu lub funkcji rozwijanej za pomocą przykładu lub scenariusza. Na przykład, jeśli budujesz prostą aplikację kalkulatora, różne zachowania obejmują dodawanie, mnożenie, dzielenie itp.

dlatego za pośrednictwem BDD wszyscy interesariusze najpierw spotkają się, aby zdecydować o zachowaniu aplikacji, takim jak dodawanie i będą mieli scenariusze, jak pokazano poniżej.

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

Jeśli widzisz powyższą reprezentację, jest to scenariusz w prostym języku angielskim, który jest zrozumiały dla każdego i sprawia, że wymagania dotyczące funkcji są jasne (zgodnie z kryteriami akceptacji). Stąd pierwszym krokiem jest sformułowanie tych wymagań.

#2) Teraz z zestawem tych scenariuszy, QA pisze testy przeciwko nim i to początkowo nie powiedzie się, ponieważ funkcja nie jest jeszcze rozwijana.

#3) Teraz programista pisze kod funkcji i ponownie wykonuje te testy.

#4) testy mogą przejść lub nie. Jeśli się nie uda-refaktoryzacja kodu i powtórzenie procesu

# 5)Po zakończeniu refaktoryzacji kodu wszystkie scenariusze / testy powinny przejść.

stąd, w istocie, BDD wykorzystuje podejście TDD i przenosi je na wyższy poziom poprzez posiadanie wspólnych, łatwo zrozumiałych specyfikacji w postaci scenariuszy. Reprezentują one również dokumentację funkcji samą w sobie.

istnieją różne narzędzia do pisania testów w podejściu BDD, takie jak Cucumber/JBehave dla Javy, Lettuce dla Pythona, Jasmine dla Javascript, Specflow dla .NET.

w tym tutorialu skupimy się na Specflow.

przeczytaj również => najlepsze narzędzia BDD i Framework testowy

słowa kluczowe – podane, gdy& następnie

ze świata testów jednostkowych większość z nas zna 3 A, tj. Teraz, biorąc pod uwagę, kiedy i wtedy są zamiennikami dla tych w świecie BDD.

weźmy przykład dla zrozumienia każdego z nich. Załóżmy, że wymieniasz scenariusz walidacji produktu, który zostanie dodany do koszyka aplikacji e-commerce, która wymaga zalogowania się jako warunek wstępny.

specyfikację można zapisać w następujący sposób:

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 

Podane: służy do opisania zestawu warunków wstępnych dla zdefiniowanego scenariusza. Dla przykładu warunkiem wstępnym scenariusza jest zalogowany klient. Stąd w porównaniu do analogii aranżacji w teście jednostkowym, wdrożenie kroku będzie musiało zapewnić, że jest zalogowany klient.

When: służy do opisania akcji lub kroku wykonania. W przykładzie pokazuje, że klient próbuje dodać produkt do swojego koszyka. Dlatego implementacja kroku dla tego kroku zajmie się kodem symulacji, aby dodać produkt do koszyka. Można to porównać do etapu Act w testach jednostkowych.

Then: this is used to describe the result of the scenario and essentially where the validations should be placed in. Można go porównać do etapu Assert w świecie testów jednostkowych. W poniższym przykładzie krok implementacji będzie stwierdzał, czy produkt został rzeczywiście dodany, a ilość jest taka sama, jak wybrana przez Klienta.

plik funkcji

plik funkcji jest zasadniczo grupowaniem wielu scenariuszy dla aplikacji w fazie rozwoju lub testowania. Można go również po prostu traktować jako różne moduły aplikacji, za pomocą których aplikacja może być logicznie oddzielona.

na przykład:

aplikacja e-commerce może zdecydować się na różne pliki funkcji wysokiego poziomu, takie jak:

  • funkcja logowania/wylogowania
  • koszyk na zakupy
  • Płatność itp.

co to jest Specflow?

Specflow jest narzędziem wspierającym praktyki BDD w.NET framework. Jest to framework open source hostowany na GitHub. Pomaga w użyciu ATDD (Acceptance test driver development) dla aplikacji. NET.

Wiązanie wymagań biznesowych dla aplikacji przy użyciu specyfikacji przez przykładowy paradygmat pomaga w lepszym zrozumieniu zachowania aplikacji przez wszystkich interesariuszy, a tym samym skutkuje wysyłką produktu z prawidłowymi oczekiwaniami.

wykorzystuje składnię Gherkin do tworzenia funkcji& scenariuszy. Posiada również aktywne forum dyskusyjne / programistyczne.

Specflow – pierwsze kroki

w tej sekcji przyjrzymy się instalacji specflow w Visual Studio IDE i stworzymy pliki funkcji dla prostej aplikacji String Utility.

o przykładowej aplikacji

w tym samouczku będziemy ilustrować różne funkcje frameworka Specflow za pomocą aplikacji kalkulatora, która ma funkcje/interfejsy zapewniające różne operacje, takie jak:

  1. dodawanie 2 liczb.
  2. odejmowanie 2 liczb.
  3. dzielenie i mnożenie 2 liczb.
  4. znalezienie pierwiastka kwadratowego z podanej liczby.

Instrukcja Instalacji Specflow

instalacja Specflow to dwuetapowy proces

#1) Instalacja wymaganych wtyczek w Visual Studio IDE.

  • aby zainstalować wtyczkę specflow, przejdź do Narzędzia- >rozszerzenie & aktualizacje.
  • teraz kliknij „Online” w lewym panelu.
  • teraz wyszukaj specflow w prawym panelu.
  • z wyników wyszukiwania wybierz „Specflow for Visual Studio 2017”.

SpecFlow-Instalacja wtyczki

#2) Konfigurowanie projektu z plikami funkcji i definicjami kroków.

  • Utwórz prosty nowy projekt w Visual Studio. Możemy stworzyć dowolny projekt, jak Biblioteka klas / aplikacja konsolowa / projekt testu jednostkowego itp. Dla uproszczenia, podejmujemy się projektu biblioteki klasowej. Nazwij projekt jako „SpecflowBasic”.
  • aby uruchomić scenariusze Specflow, które zamierzamy stworzyć, potrzebujemy biegacza testowego. Specflow zapewnia biegacza po wyjęciu z pudełka o nazwie SpecFlow + Runner (który jest wersją płatną, a wersja bezpłatna wprowadza opóźnienie).

(dostępne są również inne biegacze NUnit i MsTest, które zobaczymy w kolejnych artykułach z tej serii).

aby zainstalować SpecFlow + Runner – przejdź do Narzędzia- > Menedżer pakietów NuGet- > Konsola Menedżera pakietów.

Po otwarciu konsoli Menedżera pakietów – Uruchom polecenie.

 Install-Package SpecRun.SpecFlow

Specrun-instalacja

  • ponadto, w celu stwierdzenia wartości, będziemy potrzebować pomocy frameworka testowego. NUnit może być jedną z opcji, a pozostałe to MsTest itp. Aby zainstalować framework NUnit w aplikacji, otwórz konsolę menedżera pakietów i wpisz polecenie.
 Install-Package NUnit 

#3) Utwórz nową klasę o nazwie „Calculateraplication”, która stanie się naszą testowaną aplikacją. Jest to prosta klasa posiadająca funkcje do wykonywania dodawania / mnożenia / dzielenia / pierwiastka kwadratowego itp., dla danego wejścia. Tak wygląda Klasa CalculatorApplication.

# 4)Po zainstalowaniu pakietu Utwórz 2 foldery w projekcie i nazwij je jako funkcje i definicje kroków do przechowywania odpowiednio plików funkcji i wiązań kroków. Omówimy szczegółowo powód organizacji folderu dla funkcji& definicje kroków.

#5) Teraz w folderze funkcje Dodaj nowy plik funkcji i nazwij go jako CalculatorFeature.

funkcja kalkulatora

Domyślnie plik funkcji ma jakiś opis w funkcji i scenariuszu.

Zastąp to tym, co będziemy testować.

 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) generowanie definicji kroków: Specflow zapewnia automatyczny sposób generowania powiązań / implementacji dla różnych kroków w scenariuszach plików funkcji. Można to osiągnąć klikając prawym przyciskiem myszy plik funkcji i klikając „Generuj definicje kroków”.

generowanie definicji kroku

ten krok nie gwarantuje implementacji dla wszystkich kroków, ale stara się jak najlepiej grupować wspólne kroki w scenariuszach i ponownie używać jak największej liczby powiązań. Jednak to sprawia, że zadanie unikania boilerplate kodu za każdym razem, gdy krok scenariusz musi być zaimplementowany.

Po kliknięciu „Generuj definicje kroków” pojawi się okno z listą zidentyfikowanych implementacji kroków, które wykrył procesor. Można wybrać lub usunąć wybór zgodnie z wymaganiami.

Generuj szkielet definicji kroku

w późniejszych sekcjach przyjrzymy się więcej szczegółów na temat rozwijanej listy stylów pokazanej na powyższym zrzucie ekranu.

na razie wybierzmy wszystkie z domyślnymi ustawieniami. Kliknięcie podglądu pokaże migawkę tego, jak będzie wyglądać implementacja.

Migawka implementacji

Po utworzeniu definicji kroków, mimo to, jeśli istnieją pewne niezrealizowane kroki, pliki funkcji mają wizualny sposób identyfikacji niezrealizowanych aplikacji. Pokazuje te kroki w innym kolorze, czyniąc to absolutnie prostym, aby wiedzieć, że istnieją kroki, które nie mają jeszcze implementacji (lub mają jakieś niejednoznaczne definicje kroków).

przykładowy ekran przedstawia to poniżej:

brakująca implementacja

Uwaga: definicje kroków mogą być również tworzone ręcznie – dowolnie .plik cs posiadający atrybut jest klasą implementacji Step i składnia Gherkin będzie szukać dopasowania do implementacji danego scenariusza step

wykonanie

jak już dodaliśmy SpecFlow+ Runner w powyższej sekcji, wykonywanie scenariuszy jest dość proste (ponieważ jest to wersja ewaluacyjna specrun, wprowadza zmienną opóźnienie 10-20s przed wykonaniem scenariuszy. , Opóźnienie to nie występuje w przypadku zarejestrowanych wariantów i innych smaków specrun runner, takich jak NUnit i MsTest).

Jeśli wszystkie kroki nie zostały zaimplementowane i jeśli nadal istnieją powiązania, które mają stan oczekujący. Następnie wyjście będzie wyświetlane jako oczekujące.

spróbujmy uruchomić te testy/scenariusze w tym momencie, gdy nie ma implementacji dla wiązań, a scenariusze są w toku.

oczekujące scenariusze

teraz spróbujmy zaimplementować klasę CalculatorApplication z metodami, które chcemy przetestować, tj. dodać, odjąć, pomnożyć, podzielić i sqrt.

podany poniżej jest próbką kodu jak wygląda nasza klasa 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; } } } 

gdy aplikacja jest już gotowa, spróbujmy dowiedzieć się, jak zaimplementować wiązania dla każdego z etapów scenariusza.

zobaczmy krok po kroku, jak je zaimplementować:

  • najpierw musimy mieć instancję aplikacji, która musi zostać przetestowana. Dla uproszczenia, możemy utworzyć instancję AUT (Application Under Test class) w powiązaniach krokowych i użyć instancji instancyjnej do wywołania różnych metod/funkcji zgodnie z wykonywanym krokiem.
  • aby przechwycić dane wejściowe i wyjściowe, deklarujemy, że zmienne przechowują te wartości w celu wywołania funkcji w instancji aplikacji.

zobaczmy implementację od końca do końca dla wszystkich wiązań zaangażowanych w walidację funkcji Add (reszta scenariuszy po prostu ją rozszerza).

scenariusz dodawania wygląda tak, jak pokazano poniżej:

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

zobaczmy implementację kroku dla każdego z tych poszczególnych kroków. Aby użyć wszystkich implementacji step, deklarujemy instancję testowanej aplikacji, a także zmienne, które przechowują zmienne wejściowe i wyjściowe, jak pokazano poniżej:

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

zobaczmy implementację scenariuszy krok po kroku.

Krok 1: biorąc pod uwagę, że podałem 70 i 20 jako wejścia.

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

tutaj właśnie zainicjowaliśmy zmienne wejściowe wartościami przekazanymi z kroków scenariusza. p0 i p1 są wartościami, które są przekazywane z etapu scenariusza i zostaną zainicjowane odpowiednio jako 70 & 20.

Krok 2: po naciśnięciu przycisku Dodaj.

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

jest to krok wykonania (lub działania), w którym w testowanej aplikacji jest wywoływana właściwa metoda. Zauważ, że ponieważ zmienne wejściowe input1 oraz input2 zawierają już wartości przekazane w Kroku 1, instancja aplikacji może wywołać metodę z tymi zmiennymi.

Krok 3: – wtedy wynik powinien wynosić 90.

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

jest to krok walidacji (lub Assert), w którym wyjście jest generowane przez wywołanie metody, a instancja aplikacji jest sprawdzana w stosunku do oczekiwanego wyjścia.

zauważ, że używane słowo kluczowe Assert pochodzi z frameworka NUnit, które zwraca true lub false w zależności od ustawionej walidacji/oczekiwania. W przypadku, gdy zwraca false, spowoduje to niepowodzenie implementacji Step i wyświetli wynik scenariusza jako fail.

należy również pamiętać, że zmienna wyjściowa pobiera wartość z poprzedniego kroku, w którym została wywołana właściwa metoda w instancji aplikacji.

podobnie jak powyżej, implementacje Step dla pozostałych kroków scenariusza są wykonywane w ten sam sposób, różnica polega na wywoływaniu różnych metod na instancji aplikacji i potwierdzaniu różnych wartości wyjściowych.

po zaimplementowaniu wszystkich kroków scenariusza można wykonać testy.

wynik będzie wyglądał jak pokazano poniżej:

Consolidated Ouput

Możesz również wyświetlić wyniki poszczególnych scenariuszy, które zawierają listę wyników poszczególnych kroków:

wyjście scenariusza

wnioski

mam nadzieję, że ten artykuł dałby ci podstawową wiedzę na temat tego, czym jest BDD i co są to narzędzia, które obsługują BDD dla.Net, w których omówiliśmy SpecFlow.

omówiliśmy również instalację i wykonanie plików funkcji Specflow za pomocą przykładowej aplikacji.

pliki kodu

pliki kodu użyte w aplikacji są pokazane poniżej:

Kalkulatorcs

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

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

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

Nasz nadchodzący samouczek przedstawi Ci Przykład użycia Specflow i Selenium Webdriver!

następny Tutorial