我怎样才能并行运行NUnittesting?

我使用NUnit编写了一个大的验收testing(每个testing约10秒)。 我想利用我的机器都是多核心盒的事实。 理想情况下,我可以在每个核心上运行一个testing,独立于其他testing。

有PNUnit,但它是专为testing线程同步问题和类似的东西,我没有看到一个明显的方式来完成这一点。

是否有一个开关/工具/选项可以用来并行运行testing?

标准的nunit runner不支持并行运行testing。 您可以创build自己的testing运行器并行运行testing(使用当前的nunittesting)。 我不确定为什么nunit团队还没有做到这一点。

或者,MBUnit可以select创build可并行化的testing,而MBUnit的语法与NUnit几乎相同,但可能不需要太多的努力来完成切换。

编辑:正如在评论中指出的,虽然这个答案在编写时是正确的,但如果你想现在并行运行NUnittesting,至less有两个select:

  • NCrunch开箱即用(不需要改变任何东西,而是商业产品)
  • NUnit 3提供了一个可并行的属性,可以用来表示哪些testing可以并行运行

NUnit版本3将支持并行运行testing:

将属性添加到类: [Parallelizable(ParallelScope.Self)][Parallelizable(ParallelScope.Self)]运行testing。

•ParallelScope.None表示testing可能不会与其他testing并行运行。

ParallelScope.Self表示testing本身可以与其他testing并行运行。

•ParallelScope.Children表示testing的后代可以相互平行运行。

•ParallelScope.Fixtures表示灯具可以相互平行运行。

NUnit框架并行testing执行

如果您的项目包含多个testingDLL,则可以使用此MSBuild脚本并行运行它们。 显然你需要调整path来适应你的项目布局。

运行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及其命令行testing运行工具,以获得最大的testing运行性能。 没有什么比这更好的了,它会同时改变代码testing和debugging周期。

在这篇文章中提到,为了加速testing,海报运行NUnit的多个实例,命令参数指定每个实例应该运行哪些testing。

FTA:

我遇到了一个奇怪的问题。

我们使用nunit-console在我们的持续集成服务器上运行testing。 最近我们从Nunit 2.4.8移到2.5.5,从.Net 3.5移到4.0。 为了加速testing的执行,我们使用不同的命令行参数并行运行多个Nunit实例

  • 我们在文件夹A和B中有两个我们的testing程序集和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

如果我们按顺序执行这些命令,那么这两个命令都能成功运行 但是,如果我们并行执行,只有一个成功。 据我所知,这是第一个加载testing夹具的人。 另一个失败的消息“无法定位灯具”。

这个问题已经知道了吗? 我在启动板的bug列表中找不到任何相关的东西。 BTW我们的服务器运行Windows Server 2008 64位。 我也可以重现Windows 7 64位上的问题。

假设这个错误是固定的,或者你没有运行提到的软件的新版本,你应该能够复制他们的技术。

更新

TeamCity看起来像一个可以用来自动运行NUnittesting的工具。 他们有一个在这里讨论的NUnit启动器,可以用来启动多个NUnit实例。 这是一篇博客文章,讨论将多个NUnit XML结果合并为一个结果文件。

所以理论上讲,你可以让TeamCity自动启动多个NUnittesting,但是你想分割工作负载,然后将结果合并到一个文件中进行后期testing处理。

这是否足够满足您的需求?

只是因为PNUnit可以在testing代码里面做同步并不意味着你实际上必须使用这个方面。 据我所知,没有任何东西可以阻止你产卵,而忽略其余部分,直到你需要为止。

顺便说一句,我没有时间阅读他们的所有来源,但很想看看Barrier类,这是一个非常简单的locking计数器。 它只是等待,直到N个线程进入,然后发送所有的脉冲,同时继续运行。 这就是它的全部 – 如果你不碰它,它不会咬你。

对于一个正常的线程开发(锁通常用于序列化访问 – 1乘1)可能会有一点直观的感觉,但它是一个非常活泼的分stream:-)

您现在可以使用NCrunch来并行化您的unit testing,甚至可以configurationNCrunch应该使用多less个内核以及Visual Studio应该使用多less个内核。

加上你作为奖金得到持续testing:)

这将是一个黑客,但你可以将unit testing分成多个类别 。 然后,为每个类别启动一个新的NUnit实例。

编辑:它看起来像他们已经添加了一个/进程选项到控制台的应用程序。 命令行帮助指出这是“testing的过程模型:单一,单独,多个”。 testing运行者似乎也有这个function。

编辑2:不幸的是,虽然它确实为每个程序集创build了单独的进程,但进程隔离选项(来自命令行的/进程)一次只运行一个代理程序。

由于这里没有提到这个项目,所以我想提出NUnit.Multicore 。 我还没有尝试过这个项目,但是似乎有一个有趣的方法来处理NUnit的并行testing问题。

您可以尝试我的小工具TBox或控制台并行亚军 ,甚至插件做分布式计算,这也可以运行unit testing的电脑SkyNet

TBox的创build是为了简化包含许多项目的大型解决scheme的工作。 它支持许多插件,其中一个提供了并行运行NUnittesting的能力。 这个插件不需要对你现有的testing做任何改变。

另外它支持:

  • 使用unit testing克隆文件夹(如果您的testing更改本地数据),

  • testing的同步(例如,如果你在testfixtureteardown上的testing杀死了所有的dev服务器或者chromerunner)

  • x86模式和pipe理员权限来运行testing

  • 批量运行 – 您可以并行运行多个程序集的testing

  • 即使是单线程运行,如果你有很多的小testing,也会比标准的nunit运行速度更快。

此外,这个工具支持命令行testing运行(并行运行),你可以使用它与持续集成。

  • 我怎样才能并行运行NUnit(Selenium Grid)testing?
  • testing执行

我已成功使用NUnit 3.0.0 beta-4并行运行testing

  • 在构build服务器上运行
  • 运行seleniumtesting
  • 有Visual Studio支持
  • 没有resharper支持

感谢同行的回答 。

陷阱:

  • 可并行化的属性不被inheritance,所以它必须在testing类中指定。

您可以使用以下PowerShell命令(对于NUnit3,对于NUnit2更改运行程序名称):

 PS> nunit3-console (ls -r *\bin\Debug\*.Tests.dll | % FullName | sort-object -Unique) 

提出的命令在单个nunit实例中运行所有testing程序集,从而可以利用引擎内置的并行testing运行 。

备注

  1. 记得调整目录search模式。 给定示例只运行以.Tests.dll结尾且位于\bin\Debug目录内的程序集。

  2. 注意Unique过滤 – 你可能不想拥有它。