2015-11-25 10 views
7

Jestem nowy w NUnit i mylony z Frameworkem testowania SpecFlow i NUnit Testing Framework.Nunit Framework kontra SpecFlow Framework

Istniejący projekt korzysta z NUnit, podobnie jak poniżej. Wszystkie metody z [test] atrybutu wyświetlane w Nunit GUI (jeśli usunąć [testu] od sposobu, w przypadku testu nie jest wyświetlana w Nunit GUI)

[TestFixture] 
public class AccountTest 
{ 
    [Test] 
    public void TransferFunds() 
    { 
    Account source = new Account(); 
    source.Deposit(200m); 
    } 

    [Test] 
    public void TransferWithInsufficientFunds() 
    { 
    } 
} 

Kiedy kod z SpecFlow w Ten sam projekt, środowisko SpecFlow jest inne, zaczynając od [Given], [When], [Then]. I każdy scenariusz SpecFlow jest wyświetlany na GUI Nunit.

Co robię, zastępuję każdą metodę [Test] jedną metodą SpecFlow. Np .:

[Test] 
public void TransferFunds() 
{ 
    Account source = new Account(); 
    source.Deposit(200m); 
} 

Okazuje się

[Then(@"I Transfer Funds")] 
public void ITransferFunds() 
{ 
    Account source = new Account(); 
    source.Deposit(200m); 
} 

Oto moje pytanie:

  1. Wygląda SpecFlow nie rozpoznaje atrybuty NUnit [Test] lub [Ustawienia]. Aby wykonać projekt w programie SpecFlow, czy muszę pozbyć się całej struktury NUnit i zastąpić ją ramą SpecFlow?

  2. Widzę, że wiele artykułów mówi o "SpecFlow + NUnit", ale są one albo z SpecFlow [Given], [When], [Then] lub NUnit [Test], [TestCase]. Jak sprawić, by obie prace w jednym projekcie lub moje zrozumienie NUnit było całkowicie błędne?

Moje pytanie może być bardzo podstawowe, dzięki za odpowiedzi!

Odpowiedz

14

Czy muszę pozbyć się całej struktury NUnit i zastąpić ramami SpecFlow?

Pierwszą rzeczą, myślę, że trzeba zrozumieć, że NUnit i SpecFlow nie wykluczają się wzajemnie.

SpecFlow jako całość ma wiele elementów, ale to, co trzeba zrozumieć, że teraz jest SpecFlow służy do związania pliki funkcji napisanych w Gherkin do C# kodu, który może być prowadzony przez biegacza testowym. Ten kod C# składa się z dwóch części: wygenerowanej automatycznie i jednej napisanej przez Ciebie i Twój zespół.


Część napisany przez ciebie są te metody z atrybutami Given, When, a Then.Są to definicje kroków (czytaj więcej here). Wiązania te muszą przestrzegać następujących zasad:

  • Musi być w publicznej klasy, oznaczone atrybutem [Binding].
  • Musi to być metoda publiczna.
  • Może to być metoda statyczna lub instancja. Jeśli jest to metoda instancji, klasa zawierająca * * będzie instancjonowana raz dla każdego scenariusza.
  • Nie można uzyskać lub odmienić parametrów.
  • Nie można uzyskać typu zwrotu.

Automatycznie generowane część generuje testy pisemne z wykorzystaniem metod NUnit, MSTest, xUnit wśród innych dostępnych unit test providers. Jak widać, z tym samym Ogórek (here i here) skończyć z różnych plików generowanych automatycznie (here i here)


Rzućmy okiem na konkretnym scenariuszu (source)

Scenario: One single spare 
    Given a new bowling game 
    When I roll the following series: 3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 
    Then my total score should be 29 

Jeśli Provider test jednostki jest NUnit że krok będzie generować następujące metody badawczej (source):

[NUnit.Framework.TestAttribute()] 
[NUnit.Framework.DescriptionAttribute("One single spare")] 
public virtual void OneSingleSpare() 
{ 
    TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); 
#line 7 
    this.ScenarioSetup(scenarioInfo); 
#line 8 
    testRunner.Given("a new bowling game"); 
#line 9 
    testRunner.When("I roll the following series:\t3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); 
#line 10 
    testRunner.Then("my total score should be 29"); 
#line hidden 
    testRunner.CollectScenarioErrors(); 
} 

Jeśli Provider Test jednostki jest xUnit że krok będzie generować następujące metody badawczej (source):

[Xunit.FactAttribute()] 
[Xunit.TraitAttribute("FeatureTitle", "Score Calculation (alternative forms)")] 
[Xunit.TraitAttribute("Description", "One single spare")] 
public virtual void OneSingleSpare() 
{ 
    TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("One single spare", ((string[])(null))); 
#line 7 
    this.ScenarioSetup(scenarioInfo); 
#line 8 
    testRunner.Given("a new bowling game"); 
#line 9 
    testRunner.When("I roll the following series:\t3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"); 
#line 10 
    testRunner.Then("my total score should be 29"); 
#line hidden 
    testRunner.CollectScenarioErrors(); 
} 

Nieważne co Jednostka Provider testową, której używasz, wasze metody definicje krokiem będzie wyglądać prawie * The samo (jak widać here for NUnit i here for xUnit).

Istnieje kilka różnych stylów definicji kroków, z których można korzystać. Są one opisane wyłącznie jako jedyne różnice, które mogą być twoimi twierdzeniami.

+0

Ta praca dla mnie. +1 – guelo

+0

Wielkie dzięki, mam lepsze zrozumienie specflow teraz – Yan

+0

Czy było coś, czego nie zakryłem w mojej odpowiedzi @Yan? –

2

Rzeczą, którą należy zrozumieć, jest to, że Specflow jest jednostkowym modelem generowania testów. Piszemy pliki funkcji za pomocą składni korniszonowych, a następnie tworzymy metody wiązania przypisane przez [Given], [When] and [Then], a następnie splajn wykorzystujemy je do generowania testów jednostkowych w dowolnym smaku struktury testowania jednostkowego, z której chcesz korzystać (NUnit, MSTest, XUnit itp.)

Gdy zaczniesz używać specflow, nie powinieneś mieszać go z "surowymi" atrybutami NUnit, spowoduje to tylko zamieszanie i problemy z debugowaniem. Dokonaj zmiany w Specflow i pozwól jej zarządzać generowaniem testów.