我有一个使用NUnit编写的大型验收测试(每个测试约10秒)。我想利用我的机器都是多个核心设备这一事实。理想情况下,我可以在每个内核上运行一个测试,而与其他测试无关。
有PNUnit,但是它是为测试线程同步问题之类而设计的,我没有找到一种明显的方法来实现。
是否可以使用开关/工具/选项并行运行测试?
我有一个使用NUnit编写的大型验收测试(每个测试约10秒)。我想利用我的机器都是多个核心设备这一事实。理想情况下,我可以在每个内核上运行一个测试,而与其他测试无关。
有PNUnit,但是它是为测试线程同步问题之类而设计的,我没有找到一种明显的方法来实现。
是否可以使用开关/工具/选项并行运行测试?
Answers:
如果要并行运行NUnit测试,则至少有两个选项:
NUnit版本3将支持并行运行测试:
将属性添加到类:[Parallelizable(ParallelScope.Self)]
将并行运行测试。
•ParallelScope.None表示该测试不能与其他测试并行运行。
•ParallelScope.Self表示测试本身可以与其他测试并行运行。
•ParallelScope.Children指示测试的后代可以彼此并行运行。
•ParallelScope.Fixtures指示灯具可以彼此并行运行。
如果您的项目包含多个测试DLL,则可以使用此MSBuild脚本并行运行它们。显然,您需要调整路径以适合您的项目布局。
要与8个核心一起运行,请执行以下操作: c:\proj> msbuild /m:8 RunTests.xml
RunTests.xml
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="RunTestsInParallel" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<Nunit Condition=" '$(Nunit)' == '' ">$(MSBuildProjectDirectory)\..\tools\nunit-console-x86.exe</Nunit>
</PropertyGroup>
<!-- see http://mikefourie.wordpress.com/2010/12/04/running-targets-in-parallel-in-msbuild/ -->
<Target Name="RunTestsInParallel">
<ItemGroup>
<TestDlls Include="..\bin\Tests\$(Configuration)\*.Tests.dll" />
</ItemGroup>
<ItemGroup>
<TempProjects Include="$(MSBuildProjectFile)" >
<Properties>TestDllFile=%(TestDlls.FullPath)</Properties>
</TempProjects>
</ItemGroup>
<MSBuild Projects="@(TempProjects)" BuildInParallel="true" Targets="RunOneTestDll" />
</Target>
<Target Name="RunOneTestDll">
<Message Text="$(TestDllFile)" />
<Exec Command="$(Nunit) /exclude=Integration $(TestDllFile) /labels /xml:$(TestDllFile).results.xml"
WorkingDirectory="$(MSBuildProjectDirectory)\..\bin\Tests\$(Configuration)" />
</Target>
</Project>
更新 如果我现在回答这个问题,我强烈推荐NCrunch及其命令行测试运行工具,以实现最佳的测试运行性能。没有什么比它喜欢,它会同时改变您的代码-测试-调试周期。
在本文中,提到了为了加速测试,发帖人运行多个NUnit实例,并使用命令参数指定每个实例应运行哪些测试。
自由贸易协定:
我遇到了一个奇怪的问题。
我们使用nunit-console在我们的持续集成服务器上运行测试。最近,我们从Nunit 2.4.8迁移到2.5.5,从.Net 3.5迁移到4.0。为了加快测试执行速度,我们使用不同的命令行参数并行运行Nunit的多个实例
- 在文件夹A和B中,我们有两个测试程序集副本以及nunit二进制文件。
- 在文件夹A中,我们执行
nunit-console-x86.exe Model.dll Test.dll / exclude:MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow
- 在文件夹B中,我们执行
nunit-console-x86.exe Model.dll Test.dll / include:MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow
如果我们按顺序执行命令,则两个命令都将成功运行。但是,如果我们并行执行它们,那么只有一个成功。据我所知,这是首先加载测试夹具的工具。另一个失败,并显示消息“无法找到夹具”。
这个问题已经知道了吗?在启动板的错误列表中找不到任何相关的内容。顺便说一句,我们的服务器运行Windows Server 2008 64位。我也可以在Windows 7 64位上重现该问题。
假设此错误已修复,或者您没有运行提到的软件的较新版本,则应该能够复制其技术。
更新资料
TeamCity看起来像可以用来自动运行NUnit测试的工具。他们有一个此处讨论的NUnit启动器,可用于启动多个NUnit实例。 这是一篇博客文章,讨论将多个NUnit XML结果合并为一个结果文件。
因此,从理论上讲,您可以让TeamCity根据您的意愿自动启动多个NUnit测试,但是您希望分担工作负载,然后将结果合并到单个文件中以进行测试后处理。
自动化程度足以满足您的需求吗?
现在,您可以使用NCrunch并行化单元测试,甚至可以配置NCrunch应该使用多少个内核以及Visual Studio应该使用多少个内核。
另外,您还将获得连续测试作为奖励:)
由于这里没有提到该项目,因此我想提出NUnit.Multicore。我自己还没有尝试过该项目,但是它似乎对NUnit的并行测试问题有一种有趣的方法。
您可以尝试使用我的小型工具TBox或控制台并行Runner甚至插件来进行分布式计算,这也可以在一组SkyNet PC上运行单元测试
创建TBox的目的是简化包含多个项目的大型解决方案的工作。它支持许多插件,其中之一提供了并行运行NUnit测试的功能。此插件不需要对现有测试进行任何更改。
还支持:
使用单元测试克隆文件夹(如果您的测试更改了本地数据),
测试的同步(例如,如果对testfixtureteardown的测试杀死了所有开发服务器或qunit的chromerunner)
x86模式和管理员特权以运行测试
批处理运行-您可以并行运行许多装配的测试
如果您进行了很多小测试,即使是单线程运行,其运行速度也比标准的nunit运行器更快。
此工具还支持命令行测试运行程序(用于并行运行),您可以将其与持续集成一起使用。
我已成功使用NUnit 3.0.0 beta-4并行运行测试
感谢同行的回答。
陷阱:
您可以使用以下PowerShell命令(对于NUnit3,对于NUnit2更改运行程序名称):
PS> nunit3-console (ls -r *\bin\Debug\*.Tests.dll | % FullName | sort-object -Unique)
出现的命令在单个nunit实例中运行所有测试程序集,这允许利用引擎内置的并行测试运行。
备注
记住要调整目录搜索模式。给定的示例仅运行以目录.Tests.dll
和在\bin\Debug
目录内部结尾的程序集。
请注意Unique
过滤-您可能不想拥有它。