【发布时间】:2013-09-03 09:15:21
【问题描述】:
使用 TeamCity 8,我如何为 NUnit 运行生成/查找结果文件?
我们目前还运行生成 TRX 文件的 MsTest。然后,我们使用 TRX->HTML 报告工具将报告传递给管理食物链。我们如何在 TeamCity 中使用 NUnit?
现在我在想我需要将 NUnit 作为命令行构建步骤来执行,但考虑到有一个 NUnit 加载项并且 MsTest 加载项为我提供了一个“结果文件:”选项,这似乎很疯狂
【问题讨论】:
使用 TeamCity 8,我如何为 NUnit 运行生成/查找结果文件?
我们目前还运行生成 TRX 文件的 MsTest。然后,我们使用 TRX->HTML 报告工具将报告传递给管理食物链。我们如何在 TeamCity 中使用 NUnit?
现在我在想我需要将 NUnit 作为命令行构建步骤来执行,但考虑到有一个 NUnit 加载项并且 MsTest 加载项为我提供了一个“结果文件:”选项,这似乎很疯狂
【问题讨论】:
TeamCity 以不同方式执行 MSTest 和 NUnit。
NUnit 不是通过 NUnit 控制台可执行文件运行,而是通过 TeamCity 自己的 NUnit 运行程序运行。这允许 TeamCity 即时报告 NUnit 测试结果——执行测试 3...4...5...of 78——并允许即时通知失败的测试,即使尚未执行所有测试。
另一方面,MSTest 直接通过 MSTest 可执行文件,没有即时报告。除了“进行中”之外,没有任何进展。仅在运行每个测试后报告测试结果,包括任何失败。
TeamCity 需要并解析 MSTest TRX 文件以执行自己的报告,包括任何故障,因此它也可供您使用。但是,NUnit 报告文件是 NUnit 控制台的一部分,而不是 TeamCity 运行器的一部分,因此没有可提供的报告文件。
如果您需要报告文件,则需要通过 NUnit 控制台运行 NUnit 测试。有several ways 这样做,其中只有一个是使用命令行步骤。但请注意,无论您使用哪种替代方案,您都将失去即时报告。
【讨论】:
Jay 的描述是正确的;这就是 TeamCity 的行为,使这项任务无法开箱即用。
有一个已知的解决方法:
http://devnet.jetbrains.com/message/5218450#5218450
基本上,您手动调用 TeamCity NUnit 运行程序(例如从 MSBuild)。然后,运行程序可以输出一个 result.xml 文件(每个测试程序集一个)。然后必须将这些结果文件合并回一个以模拟nunit-console 的行为。
Davy Brion 甚至为此发布了 MSBuild 任务:
http://web.archive.org/web/20080809002009/http://davybrion.com/blog/stuff/
他已经在他的博客上用了核弹,所以 waybackmachine 来救援。如果这些链接也失效了,这里是 sn-ps:
NUnitMergeOutput
此任务将多个 NUnit xml 报告的输出合并为一个合并的 xml 报告。
组合报告将包含提供给它的每个 xml 报告的结果,它包含整个测试运行的测试总数、失败、持续时间和总体成功状态。定义任务:
<UsingTask AssemblyFile="$(MSBuildProjectDirectory)\Libs\Brion.MSBuildTasks\Brion.MSBuildTasks.dll" TaskName="NUnitMergeOutput"/>并在目标中使用它:
<CreateItem Include="TestResults\*.xml" > <Output TaskParameter="Include" ItemName="NUnitOutputXmlFiles"/> </CreateItem> <NUnitMergeOutput NUnitOutputXmlFiles="@(NUnitOutputXmlFiles)" PathOfMergedXmlFile="TestResults\TestResults.xml" />BuildTeamCityNUnitArguments
TeamCity 不允许您轻松启用其集成的 NUnit 测试支持,同时在构建后仍保留 NUnit 输出 xml 文件。此任务准备一个 xml 参数文件以传递给 TeamCity 的 NUnitLauncher 任务,这使得将 NUnit 输出 xml 保存在您可以指定的目录中成为可能。您可以在此处找到有关此问题的更多信息,并在此处找到有关此解决方法的更多信息。
定义任务:
<UsingTask AssemblyFile="$(MSBuildProjectDirectory)\Libs\Brion.MSBuildTasks\Brion.MSBuildTasks.dll" TaskName="BuildTeamCityNUnitArguments"/>并在目标中使用它:
<CreateItem Include="**\Bin\Debug\*Tests*.dll" > <Output TaskParameter="Include" ItemName="TestAssemblies" /> </CreateItem> <BuildTeamCityNUnitArguments HaltOnError="true" HaltOnFirstTestFailure="true" HaltOnFailureAtEnd="true" TestAssemblies="@(TestAssemblies)" NUnitResultsOutputFolder="TestResults" PathOfNUnitArgumentsXmlFile="nunitarguments.xml" /> <Exec Command="$(teamcity_dotnet_nunitlauncher) @@ nunitarguments.xml" />
【讨论】:
nunit-console 时看到了奇怪的行为(怀疑资源不足)。 TC nunit runner 似乎得到了更好的优化。