当尝试生成测试执行报告时,SpecFlow无法正常工作。

8
我有一个项目,使用SpecFlow、NUnit和Coypu对Web应用程序进行验收测试。在构建服务器上,我已经通过Jenkins成功构建了该项目。Jenkins调用psake脚本,在specs项目上运行msbuild,然后脚本调用nunit-console来运行specs/tests,最后我想从SpecFlow生成报告。
Framework "4.0"

task Default -depends RunSpecs

task BuildSpecs {
    $env:EnableNuGetPackageRestore = "true"
    msbuild /t:Rebuild ReturnsPortal.Specs.csproj
}

task RunSpecs -depends BuildSpecs {
    exec { & "C:\path\to\NUnit 2.5.9\bin\net-2.0\nunit-console-x86.exe" /labels /out=TestResult.txt /xml=TestResult.xml .\bin\Debug\TheWebApp.Specs.dll }
    exec { & "C:\path\to\SpecFlow\1.8.1\specflow.exe" nunitexecutionreport TheWebApp.Specs.csproj /out:SpecResult.html }
}

那个对specflow.exe的最后一次exec调用失败了,显示如下:

元素<UsingTask>下的元素<ParameterGroup>无法识别。 C:\Program Files (x86)\Jenkins\jobs\TheWebApp\workspace\Web\Sites\TheWebApp.nuget\nuget.targets

通过一些搜索,暗示可能是使用的msbuild版本有问题(例如这里这里)。但是,我在我的psake脚本中有Framework "4.0",而Specs项目针对.NET Framework 4.0,它在构建步骤中也能成功构建,所以我不确定为什么specflow似乎在使用早期版本的msbuild。或者问题可能出在其他地方?

你尝试将完整路径传递给MSBuild了吗?(C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe) - KMoraz
谢谢,那可能就是问题所在了,但我不知道如何强制SpecFlow使用特定版本的msbuild。 - ngm
2个回答

30

以下是我找到的答案,来自SpecFlow Wiki:

对于 .NET 4.0 项目非常重要:由于 specflow.exe 是为 .NET 3.5 编译的,因此默认情况下无法加载 .NET 4.0 程序集。要为 .NET 4.0 项目生成此报告,您需要强制 specflow.exe 使用 .NET 4.0 运行时,并使用配置文件。只需复制以下配置,创建一个 specflow.exe.config 文件并将其放在 specflow.exe 旁边,您就能够创建步骤定义报告了。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
        <supportedRuntime version="v4.0.30319" /> 
    </startup> 
</configuration> 

SpecFlow 2.0于2016年1月27日发布,编译时针对.NET 4.5。这个问题不应该出现在新版本中。 - ngm

2

我尝试使用上面建议的配置文件解决方案。这在本地测试时有效,但是一旦我将代码推送到我们的 CI 环境,它就会出现问题,因为 CI 环境没有那个配置文件。我们限制了 CI 环境只能使用各种软件包的干净版本,因此我们不希望尝试将特殊配置注入 CI 服务器。

我们注意到 SpecFlow 在没有特殊配置文件的情况下,可以很好地运行我们的几个 .NET 4.0 项目。经过一些研究,实际“问题”似乎是 NuGet 2.1。对于使用 NuGet 1.7 的 .NET 4.0 项目,一切正常。

NuGet 在 1.7 和 2.1 之间引入了 NuGet.targets 文件中的新功能,而旧版本的 MSBuild 不支持这些功能。特别是问题似乎在 <UsingTask> 元素下面的 <ParameterGroup> 中,如错误消息所述。

对目标文件进行粗略查看表明,该部分负责使 NuGet 保持最新状态。完全删除此部分以与添加上面的配置文件相同的方式解决了此问题,尽管还删除了似乎提供的自更新功能。鉴于 .targets 文件已提交到存储库,此解决方案也适用于我们的 CI 环境,而不需要对 CI 进行任何更改。

这并不一定是比 ngm 的解决方案更好,它只是不同的。根据您的环境,可能会更倾向于这种方式,或者也可能不是。


2
理想情况下,SpecFlow应该提供一个为.NET 4.0编译的软件包,这样就可以解决所有这些问题,但目前看来他们对此并不感兴趣。 - Mir

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