尝试生成测试执行报告时,specflow失败

时间:2012-07-06 13:33:36

标签: msbuild specflow

我有一个项目正在使用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版本的问题(例如herehere)。但是我的psake脚本中有Framework "4.0",而Specs项目的目标是.NET Framework 4.0,它在构建步骤中构建得很好,所以我不确定为什么specflow似乎使用了早期版本的msbuild 。或者可能是其他地方的问题?

2 个答案:

答案 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更好的解决方案,它只是一个不同的解决方案。根据您的环境,这可能是一种更好的方式,也可能不是。