Nunit 框架与 SpecFlow 框架
Nunit Framework vs SpecFlow Framework
我是 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 属性 [Test] 或 [Setup]。要用SpecFlow做项目,我需要去掉所有的NUnit框架,换成SpecFlow的框架吗?
我可以看到有很多文章在谈论 "SpecFlow + NUnit",但它们要么与 SpecFlow [Given]、[When]、[Then] 或 NUnit [Test]、[TestCase ].如何在一个项目中同时工作,还是我对 NUnit 的理解完全错误?
我的问题可能比较入门,谢谢解答!
您需要了解的是,Specflow 是一个单元测试生成框架。你用你的小黄瓜语法编写你的特性文件,然后创建属性为 [Given], [When] and [Then]
的绑定方法,然后 specflow 使用这些方法在你想要使用的任何类型的单元测试框架(NUnit、MSTest、XUnit)中生成单元测试等等等等)
一旦开始使用 specflow,就不应将其与 'raw' NUnit 属性混合使用,这只会导致混乱和难以调试的问题。对 Specflow 进行更改并让它管理测试的生成
Do I need to get rid of all NUnit framework and replace with SpecFlow's framework?
我认为您需要了解的第一件事是 NUnit
和 SpecFlow
并不相互排斥。
SpecFlow
作为一个整体有很多组成部分,但是你现在需要明白的是SpecFlow
是用来绑定Gherkin
写的特征文件到C#
测试 运行 可以 运行 的代码。 C#
代码有两部分,自动生成的部分,以及您和您的团队编写的部分。
你写的部分是属性为Given
、When
、Then
的那些方法。它们是步骤定义(阅读更多 here)。这些绑定需要遵循以下规则:
- Must be in a public class, marked with the
[Binding]
attribute.
- Must be a public method.
- Can be either a static or an instance method. If it is an instance method, the >* containing class will be instantiated once for every scenario.
- Cannot have out or ref parameters.
- Cannot have a return type.
自动生成的部分生成使用 NUnit
、MSTest
、xUnit
以及其他可用 unit test providers. As you can see, with the same Gherkin (here and here) you end up with different auto-generated files (here and here)
编写的测试方法
我们来看一个具体的场景(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
and here for xUnit
)。
您可以使用几种不同的步骤定义样式。它们被描述为 here
*唯一的区别可能是您的断言。
我是 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 属性 [Test] 或 [Setup]。要用SpecFlow做项目,我需要去掉所有的NUnit框架,换成SpecFlow的框架吗?
我可以看到有很多文章在谈论 "SpecFlow + NUnit",但它们要么与 SpecFlow [Given]、[When]、[Then] 或 NUnit [Test]、[TestCase ].如何在一个项目中同时工作,还是我对 NUnit 的理解完全错误?
我的问题可能比较入门,谢谢解答!
您需要了解的是,Specflow 是一个单元测试生成框架。你用你的小黄瓜语法编写你的特性文件,然后创建属性为 [Given], [When] and [Then]
的绑定方法,然后 specflow 使用这些方法在你想要使用的任何类型的单元测试框架(NUnit、MSTest、XUnit)中生成单元测试等等等等)
一旦开始使用 specflow,就不应将其与 'raw' NUnit 属性混合使用,这只会导致混乱和难以调试的问题。对 Specflow 进行更改并让它管理测试的生成
Do I need to get rid of all NUnit framework and replace with SpecFlow's framework?
我认为您需要了解的第一件事是 NUnit
和 SpecFlow
并不相互排斥。
SpecFlow
作为一个整体有很多组成部分,但是你现在需要明白的是SpecFlow
是用来绑定Gherkin
写的特征文件到C#
测试 运行 可以 运行 的代码。 C#
代码有两部分,自动生成的部分,以及您和您的团队编写的部分。
你写的部分是属性为Given
、When
、Then
的那些方法。它们是步骤定义(阅读更多 here)。这些绑定需要遵循以下规则:
- Must be in a public class, marked with the
[Binding]
attribute.- Must be a public method.
- Can be either a static or an instance method. If it is an instance method, the >* containing class will be instantiated once for every scenario.
- Cannot have out or ref parameters.
- Cannot have a return type.
自动生成的部分生成使用 NUnit
、MSTest
、xUnit
以及其他可用 unit test providers. As you can see, with the same Gherkin (here and here) you end up with different auto-generated files (here and here)
我们来看一个具体的场景(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
and here for xUnit
)。
您可以使用几种不同的步骤定义样式。它们被描述为 here
*唯一的区别可能是您的断言。