【问题标题】:specflow fails when trying to generate test execution report尝试生成测试执行报告时,specflow 失败
【发布时间】:2015-02-10 23:02:20
【问题描述】:

我有一个项目正在使用 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 调用失败了,结果如下:

元素 下的元素 无法识别。 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。或者可能是其他地方的问题?

【问题讨论】:

  • 您是否尝试将完整路径传递给 msbuild? (C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe)
  • 谢谢,这就是问题所在,但我不知道如何强制 SpecFlow 使用特定版本的 msbuild。

标签: msbuild specflow


【解决方案1】:

这是我的答案,来自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> 

【讨论】:

  • SpecFlow 2.0 于 2016 年 1 月 27 日发布,针对 .NET 4.5 编译。新版本应该不会出现这个问题。
【解决方案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 不支持的新功能。具体来说,问题似乎是元素&lt;UsingTask&gt; 下方的&lt;ParameterGroup&gt;,如错误消息所述。

粗略浏览目标文件表明该部分负责使 NuGet 保持最新。删除此部分完全解决了问题,就像添加上面的配置文件一样,尽管也删除了似乎提供的自我更新功能。鉴于 .targets 文件已提交到存储库,此解决方案也适用于我们的 CI 环境,而无需对 CI 端进行任何更改。

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

【讨论】:

  • 理想情况下,SpecFlow 会提供一个为 .NET 4.0 编译的包,这应该可以解决所有这些问题,但他们目前似乎对此不感兴趣。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 2012-01-13
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多