2012-07-06 93 views
8

我有一个使用SpecFlow,NUnit和Coypu在Web应用程序上进行验收测试的项目。我已经通过Jenkins在构建服务器上构建了OK项目。 Jenkins调用一个在规格项目上运行msbuild的psake脚本,然后脚本调用nunit-console运行规格/测试,然后我想从SpecFlow生成一个报告。尝试生成测试执行报告时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)的\詹金斯\ \工作TheWebApp \工作区\网络\网站\ TheWebApp.nuget \ nuget.targets

正在使用谷歌搜索暗示,也许是与MSBuild的版本有问题的位(例如,herehere)。但我在我的psake脚本中有Framework "4.0",Specs项目的目标是.NET Framework 4.0,并且在构建步骤中构建得很好,所以我不确定为什么specflow似乎使用的是早期版本的msbuild。或者也许是其他地方的问题?

+0

你尝试传递msbuild的完整路径吗? ('C:\ WINDOWS \微软。NET \ Framework64 \ v4.0.30319 \ MSBuild.exe') – KMoraz 2012-07-08 09:29:55

+0

谢谢,这将是问题,但我不知道如何强制SpecFlow使用特定版本的msbuild。 – ngm 2012-07-11 10:40:56

回答

29

这是我的答案,从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> 
+0

SpecFlow 2.0于2016年1月27日发布,针对.NET 4.5编译。新版本中不应出现此问题。 – ngm 2016-02-12 14:18:56

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不支持的新功能。具体来说,该问题似乎是在<UsingTask>元素下的<ParameterGroup>,正如错误消息所解释的那样。

粗略浏览目标文件表明该部分负责保持NuGet处于最新状态。删除这一节完全可以解决这个问题,就像添加上面的配置文件一样,虽然也删除了似乎提供的自我更新功能。鉴于.targets文件已提交到存储库,此解决方案也可在我们的CI环境中工作,而无需在CI端进行任何更改。

这不一定是比ngm更好的解决方案,它只是一个不同的解决方案。取决于你的环境,这可能是一个可取的方法,或者可能不是。

+2

理想情况下,SpecFlow将提供一个为.NET 4.0编译的软件包,这应该可以解决所有这些问题,但看起来他们目前对此没有兴趣。 – Mir 2013-01-10 22:29:01

相关问题