我是NUnit的新手,并且对SpecFlow测试框架和NUnit测试框架感到困惑。

现有项目使用NUnit,如下所示。具有[Test]属性的所有方法都显示在NUnit GUI中(如果我从方法中删除[Test],则测试用例不会显示在NUnit GUI中):

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

  [Test]
  public void TransferWithInsufficientFunds()
  {
  }
}

当我在同一项目中使用SpecFlow进行编码时,SpecFlow框架有所不同,从[Given],[When],[Then]开始。每个SpecFlow场景都显示在Nunit GUI上。

我正在做的是用一个SpecFlow方法替换每个[Test]方法。
例如。:
[Test]
public void TransferFunds()
{
  Account source = new Account();
  source.Deposit(200m);
}

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

这是我的问题:
  • 看来SpecFlow无法识别NUnit属性[测试]或[设置]。为了使用SpecFlow完成项目,我是否需要摆脱所有NUnit框架并替换为SpecFlow的框架?
  • 我可以看到有很多关于“SpecFlow + NUnit”的文章,但是它们都是与SpecFlow [Given],[When],[Then]或NUnit [Test],[TestCase]一起使用的。如何在一个项目中同时进行这两项工作,或者我对NUnit的理解是完全错误的?

  • 我的问题可能是入门级,谢谢您的回答!

    最佳答案



    我认为您需要了解的第一件事是NUnitSpecFlow不互斥。
    SpecFlow总体上具有很多组件,但是您现在需要了解的是SpecFlow用于将 Gherkin 编写的功能文件绑定(bind)到可由测试运行程序运行的C#代码。该C#代码分为两部分,自动生成的一部分,以及您和您的团队编写的一部分。

    您编写的部分是那些具有GivenWhenThen属性的方法。它们是步骤定义(更多信息here)。这些绑定(bind)需要遵循以下规则:



    自动生成的部分生成使用NUnitMSTestxUnit以及其他可用unit test providers编写的测试方法。如您所见,使用相同的小 cucumber (herehere),您最终得到不同的自动生成的文件(herehere)

    让我们来看一个特定的场景(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
    

    如果单元测试提供者是NUnit,那么该步骤将生成以下测试方法(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();
    }
    

    如果单元测试提供者是xUnit,那么该步骤将生成以下测试方法(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();
    }
    

    无论使用什么单元测试提供程序,您的步骤定义方法都几乎*相同(如您所见here for NUnit here for xUnit )。

    您可以使用几种不同的步骤定义样式。它们被描述为here

    *唯一的区别可能是您的主张。

    关于c# - Nunit框架与SpecFlow框架,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33918055/

    10-17 00:46