gpt4 book ai didi

c# - Nunit 框架与 SpecFlow 框架

转载 作者:太空狗 更新时间:2023-10-29 19:52:22 24 4
gpt4 key购买 nike

我是 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);
}

这是我的问题:

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

  2. 我看到有很多文章都在谈论“SpecFlow + NUnit”,但它们要么与 SpecFlow [Given]、[When]、[Then] 相关,要么与 NUnit [Test]、[TestCase] 相关。如何在一个项目中同时工作,还是我对 NUnit 的理解完全错误?

我的问题可能很入门级,感谢您的回答!

最佳答案

Do I need to get rid of all NUnit framework and replace with SpecFlow's framework?

我认为您需要了解的第一件事是 NUnitSpecFlow 并不相互排斥。

SpecFlow作为一个整体有很多组件,但是你现在需要了解的是SpecFlow是用来绑定(bind)写在Gherkin中的特征文件的。到可由测试运行器运行的 C# 代码。该 C# 代码有两部分,一部分是自动生成的,另一部分是由您和您的团队编写的。


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

  • 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.

自动生成的部分生成使用 NUnitMSTestxUnit 等可用的方法编写的测试方法 unit test providers .如您所见,使用相同的 Gherkin(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 NUnithere for xUnit )。

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com