8

我有一个使用 SpecFlow、NUnit 和 Coypu 对 Web 应用程序进行验收测试的项目。我已经通过 Jenkins 在构建服务器上构建了项目。Jenkins 调用一个在 specs 项目上运行 msbuild 的 psake 脚本,然后该脚本调用 nunit-console 来运行规范/测试,然后我想从 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 版本存在问题(例如这里这里)。但是我Framework "4.0"在我的 psake 脚本中有,并且 Specs 项目的目标是 .NET Framework 4.0,并且它在构建步骤中构建得很好,所以我不确定为什么 specflow 似乎使用的是早期版本的 msbuild。或者可能是其他地方的问题?

4

2 回答 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> 
于 2012-07-11T10:44:41.817 回答
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 更好的解决方案,它只是一个不同的解决方案。根据您的环境,这可能是一种更可取的方式,也可能不是。

于 2013-01-10T22:28:10.787 回答