2015-11-25 19 views
7

Sono nuovo di NUnit e confuso con SpecFlow Testing Framework e NUnit Testing Framework.Nunit Framework vs SpecFlow Framework

Il progetto esistente utilizza NUnit, qualcosa di simile sotto. Tutti i metodi con l'attributo [Test] vengono visualizzati nella GUI NUnit (se tolgo [Test] dal metodo, il banco di prova non è visualizzare in GUI NUnit):

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

    [Test] 
    public void TransferWithInsufficientFunds() 
    { 
    } 
} 

Quando ho codice con SpecFlow nel stesso progetto, il framework SpecFlow è diverso, a partire da [Given], [When], [Then]. E ogni scenario SpecFlow viene visualizzato nella GUI di Nunit.

Quello che sto facendo è sostituire ogni metodo [Test] con un metodo SpecFlow. Es .:

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

si rivolge a

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

ecco la mia domanda:

  1. Sembra SpecFlow non riconosce gli attributi di NUnit [Test] o [SETUP]. Per realizzare il progetto con SpecFlow, devo liberarmi di tutto il framework NUnit e sostituirlo con il framework di SpecFlow?

  2. Vedo che molti articoli parlano di "SpecFlow + NUnit", ma sono con SpecFlow [Given], [When], [Then] o NUnit [Test], [TestCase]. Come far funzionare entrambi in un progetto o la mia comprensione di NUnit è totalmente sbagliata?

La mia domanda potrebbe essere molto entry level, grazie per le risposte!

risposta

14

Devo eliminare tutto il framework NUnit e sostituirlo con il framework di SpecFlow?

La prima cosa che penso è necessario comprendere è che NUnit e SpecFlow non si escludono a vicenda.

SpecFlow nel suo complesso ha un sacco di componenti, ma ciò che è necessario capire ora è che SpecFlow viene utilizzato per legare i file scritti in funzione Gherkin-C# codice che può essere gestito da un test runner. Il codice C# ha due parti, quella generata automaticamente e quella scritta da te e dal tuo team.


La parte scritta da voi sono i metodi con gli attributi Given, When e Then.Sono le definizioni dei passaggi (maggiori informazioni here). Questi attacchi hanno bisogno di seguire queste regole:

  • deve essere in una classe pubblica, contrassegnata con l'attributo [Binding].
  • Deve essere un metodo pubblico.
  • Può essere un metodo statico o un metodo di istanza. Se si tratta di un metodo di istanza, la classe contenente * * verrà istanziata una volta per ogni scenario.
  • Non può avere parametri out o ref.
  • Non può avere un tipo di reso.

La parte auto-generata genera metodi di prova scritte utilizzando NUnit, MSTest, xUnit tra l'altro a disposizione unit test providers. Come si può vedere, con la stessa Gherkin (here e here) si finisce con diversi file generati automaticamente (here e here)


Diamo uno sguardo a uno specifico scenario (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 

Se il provider di prova Unità è NUnit che passo genererà il seguente metodo di prova (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(); 
} 

Se il provider di prova Unità è xUnit che passo genererà il seguente metodo di prova (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(); 
} 

Non importa Provider di prova quello dell'unità che si sta utilizzando, i vostri metodi definizioni passo avrà un aspetto quasi il * stesso (come potete vedere here for NUnit e here for xUnit).

Esistono diversi stili di definizione dei passaggi che è possibile utilizzare. Sono descritti here

* L'unica differenza potrebbe essere le vostre affermazioni.

+0

Questo lavoro per me. +1 – guelo

+0

Grazie mille, ho capito meglio specflow ora – Yan

+0

C'era qualcosa che non ho coperto nella mia risposta @ Yan? –

2

La cosa che devi capire è che Specflow è un framework di generazione di test di unità. Scrivi i tuoi file con la sintassi del tuo cetriolino e poi crea i metodi di associazione attribuiti con lo [Given], [When] and [Then] e poi specflow li usa per generare i test unitari in qualsiasi assetto del framework di test unitario che desideri utilizzare (NUnit, MSTest, XUnit etc etc)

Una volta che inizi a utilizzare specflow, non dovresti mischiarlo con gli attributi NUnit "grezzi", questo porterà solo a problemi di confusione e di debug. Apporta la modifica a Specflow e lascia che gestisca la generazione dei test