Nunit Framework与SpecFlow框架

Yan*_*Yan 8 c# nunit specflow

我是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()
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

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

我正在做的是用一个SpecFlow方法替换每个[Test]方法.例如:

[Test]
public void TransferFunds()
{
  Account source = new Account();
  source.Deposit(200m);
}
Run Code Online (Sandbox Code Playgroud)

转向

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

这是我的问题:

  1. 看起来SpecFlow无法识别NUnit属性[Test]或[Setup].要使用SpecFlow完成项目,我是否需要摆脱所有NUnit框架并替换为SpecFlow的框架?

  2. 我可以看到有很多文章在讨论"SpecFlow + NUnit",但它们要么是SpecFlow [Given],[When],[Then]还是NUnit [Test],[TestCase].如何在一个项目中工作或者我对NUnit的理解是完全错误的?

我的问题可能是非常入门级的,谢谢你的答案!

Max*_*uez 20

我是否需要摆脱所有NUnit框架并替换为SpecFlow的框架?

我认为你需要了解的第一件事情是NUnitSpecFlow不是相互排斥的.

SpecFlow整体而言,它有很多组件,但您现在需要了解的SpecFlow是用于将编写的代码文件绑定GherkinC#可由测试运行器运行的代码中.该C#代码包含两部分,即自动生成的部分,以及由您和您的团队编写的部分.


你所撰写的部分是与属性的方法Given,WhenThen.它们是步骤定义(在此处阅读更多内容).这些绑定需要遵循以下规则:

  • 必须在公共类中,标有[Binding]属性.
  • 必须是公共方法.
  • 可以是静态方法,也可以是实例方法.如果它是实例方法,则将为每个方案实例化一次包含**的类.
  • 不能有out或ref参数.
  • 不能有返回类型.

自动生成部使用生成笔试方法NUnit,MSTest,xUnit其他可用之间的单元测试提供商.正如您所看到的,使用相同的Gherkin(此处此处)您最终会得到不同的自动生成的文件(此处此处)


我们来看一个特定的场景(来源)

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
Run Code Online (Sandbox Code Playgroud)

如果单元测试提供程序是NUnit该步骤将生成以下测试方法():

[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();
}
Run Code Online (Sandbox Code Playgroud)

如果单元测试提供程序是xUnit该步骤将生成以下测试方法():

[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();
}
Run Code Online (Sandbox Code Playgroud)

无论你使用的是什么单位测试提供商,你的步骤定义方法看起来几乎*相同(因为你可以看到这里NUnit这里xUnit).

您可以使用几种不同的步骤定义样式.它们在这里描述

*唯一的区别可能是你的断言.


Sam*_*der 5

您需要了解的是 Specflow 是一个单元测试生成框架。你用你的小黄瓜语法编写你的特性文件,然后创建绑定方法[Given], [When] and [Then],然后specflow使用这些方法在你想要使用的任何风格的单元测试框架(NUnit、MSTest、XUnit等)中生成单元测试

一旦开始使用 specflow,就不应该将它与“原始”NUnit 属性混合使用,这只会导致混淆和难以调试的问题。对 Specflow 进行更改并让它管理测试的生成