我有一个项目正在使用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调用失败,但是:
元素< ParameterGroup>在元素下面< UsingTask>无法识别。 C:\ Program Files(x86)\ Jenkins \ jobs \ TheWebApp \ workspace \ Web \ Sites \ TheWebApp.nuget \ nuget.targets
一些谷歌搜索暗示可能是使用msbuild版本的问题(例如here,here)。但是我的psake脚本中有Framework "4.0"
,而Specs项目的目标是.NET Framework 4.0,它在构建步骤中构建得很好,所以我不确定为什么specflow似乎使用了早期版本的msbuild 。或者可能是其他地方的问题?
答案 0 :(得分: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>
答案 1 :(得分:2)
我尝试使用上面建议的配置文件解决方案。它适用于本地测试,但是一旦我将代码推送到CI环境,它就会因为CI环境没有该配置文件而窒息。我们将CI环境限制为仅使用各种软件包的干净版本,因此我们不想尝试将特殊配置注入CI服务器。
我们注意到SpecFlow在没有特殊配置文件的情况下可以正常运行几个.NET 4.0项目。经过一番研究,实际的“问题”似乎是NuGet 2.1。对于使用NuGet 1.7的.NET 4.0项目,一切正常。
介于1.7和2.1之间NuGet在NuGet.targets文件中引入了旧版本的MSBuild不支持的新功能。具体而言,问题似乎是元素<ParameterGroup>
下面的<UsingTask>
,正如错误消息所解释的那样。
粗略地浏览目标文件表明该部分负责使NuGet保持最新状态。删除此部分完全解决问题的方式与上面添加配置文件的方式相同,尽管还删除了似乎提供的自我更新功能。鉴于.targets文件已提交到存储库,此解决方案也适用于我们的CI环境,而不会在CI端进行任何更改。
它不一定是比ngm更好的解决方案,它只是一个不同的解决方案。根据您的环境,这可能是一种更好的方式,也可能不是。