SpecFlow错误地使用NUnit。

14

我今天第一次尝试使用SpecFlow。我在VS2010 Pro中创建一个新的类库并添加了一个SpecFlow Feature Definition文件。

问题是,集成似乎没有正常工作,出现了各种不同的错误。我选择了MsTest作为测试运行器,因为我不想调用NUnit(长期来看我想使用NUnit,但目前我只想让一些BDD代码工作)。然而生成的代码文件仍然引用NUnit——这显然是错误的,因为我刚告诉SpecFlow要使用MsTest运行。我已经尽我所能再次调用代码生成,包括创建一个全新的类库项目并在Tools > Options > SpecFlow中选择了MsTest选项。

如果我将测试运行器字段设置为“自动”并右键单击一个功能文件,然后选择“运行SpecFlow Scenarios”,我会收到一个错误消息“找不到匹配的测试运行器”。

如果我改为将测试运行器字段设置为MsTest,我在执行相同操作时会收到不同的错误消息:“对象引用没有设置为对象的实例”。我对此并不感到惊讶,因为它仍然试图运行NUnit测试,即使我明确要求使用MsTest,但显然不应该将其nullref并呈现给用户。

我做错了什么?文档没有帮助,据我所见,也没有常见问题解答。

编辑#1:我已经确定我正在寻找的实际设置是使用App.Config提供的,使用字段<unitTestProvider name="MsTest" />。我可以看到发生了什么——Visual Studio选项菜单中的字段似乎不会修改您当前正在使用的项目。问题是,这使得它看起来像那个字段根本没有做任何事情。我现在说服了SpecFlow生成MsTest类并使用MSTest运行。

所以现在的问题稍微有点不同:如果有的话,Tools > Options > SpecFlow > Test Runner Tool字段有什么作用?

5个回答

9
使用VS2010,正确的值是MsTest.2010而不是文档中提到的MsTest。更改您的app.config(用于测试程序集),它将正常工作(至少在SpecFlow 1.8中)。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" />
  </configSections>
  <specFlow>
      <unitTestProvider name="MsTest.2010" />
      <!-- For additional details on SpecFlow configuration options see https://github.com/techtalk/SpecFlow/wiki/Configuration -->
  </specFlow>
</configuration>

7
回答您最新的问题。什么是设置"Tools > Options > SpecFlow > Test Runner Tool",这个设置控制实际运行测试的内容,而不是生成测试代码的内容。如果设置为自动,则会查看App.config文件,确定哪个单元测试提供程序是运行测试的最佳工具。由SpecFlow同一团队开发的另一个测试运行器是SpecRun http://www.specrun.com/

因此,当您要运行测试时,它将使用此选项。但是,正如您发现的那样,代码生成器使用配置文件来确定应生成什么类型的测试(mstest/nunit..)

如果您运行了specfow安装程序(https://github.com/downloads/techtalk/SpecFlow/SpecFlowSetup_v1.8.1.msi)以安装所有Visual Studio集成组件,则更改App.config文件时,通常会提示重新生成使用新提供程序的功能。手动执行此操作的方法是右键单击功能,然后选择"Run Custom Tool"

关于文档,您是否找到了git hub wiki? https://github.com/techtalk/SpecFlow/wiki/Documentation


3
我理解的是,测试运行程序与代码生成器完全不同,尽管当MsTest运行程序不知道NUnit时这并不总是有意义(我想)。最新版本(v2.3.2)开箱即用,即使使用SpecFlow.MsTest nuget包(相同版本)安装,也不会配置您的计算机以在后台生成基于MsTest的类。我正在运行VS2017,并安装了Resharper作为我的“测试运行程序”,但生成基于MsTest的代码的主要要求是更改app.config。根据wiki文档,您还需要在app.config中添加以下内容。当您保存配置时,应提示重新生成文件。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="specFlow"
             type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow"/>
  </configSections>
  <specFlow>
    <unitTestProvider name="MsTest" />
  </specFlow>
</configuration>

谢谢,这个帮了我大忙了。我已经花费很长时间来尝试解决这个问题了。到底是谁设计了一个“设计时”扩展程序来读取一个旨在用于“运行时”的文件呢?(反问句)应该有一个相应的“单元测试生成提供程序”设置或类似的东西,在下拉列表中列出已安装的单元测试提供程序。这是非常糟糕的设计。 - Stephen York

2
我们正在使用ReSharper作为SpecFlow验收测试的运行程序;它一开始就运行得很好。虽然ReSharper并不是免费的,但它值得每一分钱...

1

我从未能够在Visual Studio中正确地使用SpecFlow,我花了一些时间来研究它,但是没有任何进展。尽管我在这里找到了有关在Visual Studio 2010中设置NUnit的说明,并使用此快捷方式有效地运行我的SpecFlow测试。

总体而言,我们使用PowerShell来运行许多测试,我能够将NUnit命令行运行程序和SpecFlow报告生成器合并到一个简单运行的脚本中。


很棒的提示,谢谢!我立刻设置了菜单按钮,因为它看起来非常有用,因此无论如何,这行询问提供了一个方便的附带好处。不过可惜 SpecFlow 看起来有问题,似乎不只我一个人遇到了它不能执行应该执行的操作的问题。实际产品有效,但 VS 集成不太正确。 - Tom W
是的,我希望它能更加集成,但目前我还可以接受。对我来说,它的用途比那些好处更重要。很高兴这个提示有所帮助! - MichaelF
你是否运行了SpecFlow安装程序,或者是使用NuGet将其添加到项目中?安装程序将安装所有集成组件,如Visual Studio集成,而nuget安装仅添加必要的引用。 - Ryan Burnham
我使用了SpecFlow安装程序,其实我并不想在我的电脑上安装NuGet。不过现在我已经习惯这样使用了这么长时间,它并没有对我造成太大的阻碍。 - MichaelF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接