如何使用MSTest从命令行运行SpecFlow场景?

14

我有Visual Studio 2010,我们有两个VS解决方案。第一个是Web应用程序,第二个是专门用于SpecFlow测试的。同时运行两个Visual Studio实例只是为了运行SpecFlow特性,这导致所有可用的RAM都被使用,使事情变得缓慢。

我在Google和StackOverflow上搜索了一些内容,还查阅了有关MSTest命令行工具的MS文档,但没有找到答案。完整的SpecFlow测试套件需要大约45分钟才能完成,而我只需要运行几个场景。

我想知道是否有一种方法可以使用MSTest从命令行运行单个SpecFlow特性,甚至单个场景?


你可能还可以考虑一下 NCrunch(http://NCrunch.net)或 ContinuousTests(http://www.continuoustests.com)。这两个工具都旨在尽可能快地运行你的测试。我使用的是 NCrunch,它有一个“仅运行受我的更改影响的测试”模式,正是你需要的。 - AlSki
5个回答

19

在幕后,SpecFlow 测试只是常规的 MSTest 单元测试。因此,您应该能够使用类似以下方式运行它们:

要运行特定的场景:

mstest /testcontainer:tests.dll /test:GivenMyScenarioWhenIDoSomeStuff

要运行多个特定的场景,您可以多次使用/test标志:

mstest /testcontainer:tests.dll /test:GivenMyScenarioWhenIDoSomeStuff /test:GivenMyScenarioWhenIDoSomemthingElse
运行一个功能。
mstest /testcontainer:tests.dll /test:MyFeatureName
如果您在场景中使用@MyTag等标记,您也可以使用该选项。
/category:MyTag to filter down the scenarios to run.
请查看生成的特性文件背后的代码,以了解事物实际上是如何运作的。如果您熟悉MSTest,这应该很简单。

看起来这是答案,但我又遇到了另一个问题。我已经通过NuGet安装了所有测试项目的依赖项,它会将所有DLL文件放入“packages”目录中。mstest命令行实用程序期望所有类库都存在于当前工作目录中。我安装了SpecBind NuGet包,它确实为我提供了缺失的DLL文件(SpecBind.CodedUI.dll),但它没有被复制到我的构建目录中。除非您有一些建议(我正在使用CodedUI测试进行此项目),否则我将不得不深入挖掘这个问题。 - Greg Burghardt
我将此标记为答案,因为我正在解决另一个问题 - 可能是由于我的Visual Studio解决方案的设置。谢谢! - Greg Burghardt
4
请使用Vstest.console.exe代替mstest。Vstest.console.exe将自动加载您所有的NuGet包以及其他库。例如:Vstest.console.exe mytests.dll - Mohamed
如何在标签上执行“AND”或“OR”条件 - 如果您想运行具有不同标签的多个测试用例? - Monnie_tester

8

现在SpecFlow 3.0已经发布,我们可以使用SpecFlow与.NET Core一起使用。.NET Core的CLI工具是dotnet,如果您使用MSTest(vstest),则可以通过以下方式运行测试:

dotnet test

如果测试属于特定项目,您可以按如下方式指定该项目。
dotnet test TestProject

其中TestProject是项目名称。如果想要的话,你可以跳过项目名称,但是指定项目名称会让dotnet只查找该项目。如果想要列出项目中所有的测试,可以使用-t标志:

dotnet test TestProject -t

为了只运行特定的测试,您可以使用 --filter 标志:

dotnet test TestProject --filter ShouldBeSuccess_1

其中ShouldBeSuccess_1是测试的名称。--filter后面的参数是一个表达式,而不一定是测试的名称。如果您有一个名为ShouldBeSuccess_12的测试,它也会被运行。您可以在此处查看--filter的规则。

要仅运行特定类别中的测试,可以使用TestCategory

dotnet test TestProject --filter TestCategory=ci

其中 ci 是类别名称。要将测试添加到类别中,您可以使用标签

要创建结果文件,您必须使用 --logger 标志:

dotnet test TestProject --logger trx

这里用于创建一个 trx 结果文件。


2
使用MSTest v2,您无法使用mstest。相反,您可以使用vstest.console.exe
例如:
vstest.console.exe "Automation.SpecFlow\bin\Release\Automation.SpecFlow.dll" https://learn.microsoft.com/en-us/visualstudio/test/vstest-console-options?view=vs-2019 如果您想运行单个功能文件中的所有场景,则添加/trait标志:
vstest.console.exe "Automation.SpecFlow\bin\Release\Automation.SpecFlow.dll" /trait:"My Feature"
这将运行以以下内容开头的功能文件中的所有场景:
Feature: My Feature
    In order to ...
    As a ...
    I want to ...

Scenario: 1
    ...

Scenario: 2
    ...

你的回答让我想起来了,我已经弄清楚如何将其过滤到单个特性文件中了。我编辑了你的回答以添加该信息。+1 - Greg Burghardt

2

有一个名为“Specrun.Specflow”的NuGet包,下载它。它将更改您的app.config并设置unitTestProvider name="SpecRun",因此您可以删除unitTestProvider name="MSTest"或"NUnit",现在保存App.config更改时,Visual Studio会提示您重新生成功能文件,请单击Yes,现在构建解决方案,您将看到测试文件已经重新生成。 现在,在命令提示符中转到C:\Users\\Documents\Visual Studio 2015\Projects\并键入runtests.cmd,它应该直接触发所有功能文件。


8
Specrun.Specflow是Specflow的商业产品,每个用户需要支付150美元。这种收入模式似乎是原因之一,导致很少提供在任何标准开源运行器中运行spec flow的支持。付费运行器对于CI环境真的没有帮助,甚至对于富裕的公司来说,也会存在组织层面的使用障碍。当然,这不是你的错,但我认为这应该被列为你提出建议的一个重要限制条件。 - Amias
与上述相同,偏离原始需求并建议商业版本作为解决方案是没有帮助的。我仍在尝试弄清楚如何从命令行运行Specflow(带有Mstest)功能。 - vijay pujar

0
我尝试了使用标签的技巧,但没有起作用,我正在使用较旧版本的SpecFlow。 因此,我转到与特性文件相关的.feature.cs文件,并搜索了TestMethodAttribute()。
[Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]

我在这个顶部添加了TestCategory属性,就像下面这样:
[Microsoft.VisualStudio.TestTools.UnitTesting.TestCategory("MyCat")]

构建和编译命令非常顺利地运行了

/Category:MyCat 

我希望有人会发现这个答案有用。


你不应该编辑 .feature.cs 文件,因为每次编辑 .feature 文件时都会重新生成它。你应该在 .feature 文件中添加一个标签(如 @someTag),然后 .feature.cs 文件将包含 [Microsoft.VisualStudio.TestTools.UnitTesting.TestCategoryAttribute("someTag")]。 - Youcef Kelanemer
1
可以单独创建一个部分类,并添加属性,而无需修改自动生成的文件。 - Naeem A. Malik

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