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

Msbuild specflow在尝试生成测试执行报告时失败,msbuild,specflow,Msbuild,Specflow,我有一个项目,它使用SpecFlow、NUnit和Coypu在web应用程序上进行验收测试。我已经通过Jenkins在构建服务器上完成了项目构建。Jenkins调用一个psake脚本,该脚本在specs项目上运行msbuild,然后该脚本调用nunit控制台来运行specs/测试,然后我想从SpecFlow生成一个报告 Framework "4.0" task Default -depends RunSpecs task BuildSpecs { $env:EnableNuGetPa

我有一个项目,它使用SpecFlow、NUnit和Coypu在web应用程序上进行验收测试。我已经通过Jenkins在构建服务器上完成了项目构建。Jenkins调用一个psake脚本,该脚本在specs项目上运行msbuild,然后该脚本调用nunit控制台来运行specs/测试,然后我想从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调用失败,原因是:

元素下的元素无法识别。C:\ProgramFiles(x86)\Jenkins\jobs\TheWebApp\workspace\Web\Sites\TheWebApp.nuget\nuget.targets


谷歌搜索的一点提示可能是使用的msbuild版本有问题(例如)。但是我的psake脚本中有
Framework“4.0”
,Specs项目的目标是.NETFramework4.0,它在构建步骤中构建得很好,所以我不确定为什么specflow似乎在使用早期版本的msbuild。或者可能是其他地方的问题?

这是我的答案,来自:

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


我尝试使用上面建议的配置文件解决方案。它可以在本地进行测试,但当我将代码推送到我们的CI环境时,它就被卡住了,因为CI环境没有该配置文件。我们将CI环境限制为只使用各种包的干净版本,因此我们不想尝试将特殊配置注入CI服务器

我们注意到,SpecFlow在没有特殊配置文件的几个.NET4.0项目中运行良好。经过一点研究,实际的“问题”似乎是NuGet 2.1。对于使用NuGet 1.7的.NET4.0项目,一切都很好

介于1.7和2.1之间的NuGet在NuGet.targets文件中引入了旧版本的MSBuild不支持的新功能。具体而言,问题似乎是元素
下面的
,错误消息对此进行了解释

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


它不一定是比ngm更好的解决方案,它只是一个不同的解决方案。根据您的环境,这可能是一种更可取的方法,也可能不是。

是否尝试传递msbuild的完整路径?(
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
)谢谢,这就是问题所在,但我不知道如何强制SpecFlow使用特定版本的MSBuild。理想情况下,SpecFlow将提供一个为.NET 4.0编译的包,该包将解决所有这些问题,但目前他们似乎对此不感兴趣。SpecFlow 2.0于2016年1月27日发布,是根据.NET 4.5编译的。新版本中不应出现此问题。
<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
        <supportedRuntime version="v4.0.30319" /> 
    </startup> 
</configuration>