首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Nunit框架与SpecFlow框架

Nunit框架与SpecFlow框架
EN

Stack Overflow用户
提问于 2015-11-25 13:43:23
回答 2查看 12.5K关注 0票数 10

我是NUnit新手,并与SpecFlow测试框架和NUnit测试框架混在一起。

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

代码语言:javascript
运行
复制
[TestFixture]
public class AccountTest
{
  [Test]
  public void TransferFunds()
  {
    Account source = new Account();
    source.Deposit(200m);
  }

  [Test]
  public void TransferWithInsufficientFunds()
  {
  }
}

当我在同一个项目中用SpecFlow编写代码时,SpecFlow框架是不同的,从给定开始,然后是何时。每个SpecFlow场景都显示在Nunit GUI上。

我正在做的是用一个SpecFlow方法替换每个测试方法。例如:

代码语言:javascript
运行
复制
[Test]
public void TransferFunds()
{
  Account source = new Account();
  source.Deposit(200m);
}

转到

代码语言:javascript
运行
复制
[Then(@"I Transfer Funds")]
public void ITransferFunds()
{
  Account source = new Account();
  source.Deposit(200m);
}

以下是我的问题:

  1. 看起来SpecFlow不识别NUnit属性测试或设置。要用SpecFlow完成这个项目,我需要摆脱所有的NUnit框架并替换为SpecFlow的框架吗?
  2. 我可以看到有很多关于"SpecFlow + NUnit“的文章,但是它们要么是用SpecFlow给出的,然后是NUnit测试,要么是TestCase。如何使两者在一个项目中工作,还是我对NUnit的理解是完全错误的?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-25 15:46:04

我是否需要摆脱所有的NUnit框架,用SpecFlow的框架来代替?

我认为您首先需要理解的是,NUnitSpecFlow并不是相互排斥的。

SpecFlow作为一个整体有很多组件,但您现在需要了解的是,SpecFlow用于将用Gherkin编写的特性文件绑定到可以由测试运行程序运行的C#代码。C#代码有两个部分,一个是自动生成的,另一个是由您和您的团队编写的。

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

  • 必须在公共类中使用[Binding]属性标记。
  • 一定是公开的方法。
  • 可以是静态方法,也可以是实例方法。如果它是一个实例方法,那么将对每个场景实例化一次包含>*的类。
  • 不能有out或ref参数。
  • 不能具有返回类型。

自动生成的部分生成使用NUnitMSTestxUnit和其他可用的单元测试提供者编写的测试方法.如您所见,使用相同的Gherkin (这里这里),您将得到不同的自动生成文件(这里这里)。

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

代码语言:javascript
运行
复制
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,则该步骤将生成以下测试方法(来源):

代码语言:javascript
运行
复制
[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,则该步骤将生成以下测试方法(来源):

代码语言:javascript
运行
复制
[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();
}

无论您使用的是哪个单元测试提供者,您的步骤定义方法看起来几乎都是一样的(正如您可以看到的NUnitxUnit)。

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

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

票数 22
EN

Stack Overflow用户

发布于 2015-11-25 14:43:07

您需要了解的是,Specflow是一个单元测试生成框架。使用gherkin语法编写特性文件,然后创建[Given], [When] and [Then]属性化的绑定方法,然后specflow使用这些方法生成单元测试框架(NUnit、MSTest、XUnit等)。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33918055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档