如何并行运行NUnit测试?

时间:2010-07-22 20:31:45

标签: nunit

我使用NUnit编写了一个大型验收测试(每个测试约10秒)测试套件。我想利用我的机器都是多核盒的事实。理想情况下,我可以在每个核心运行一个测试,与其他测试无关。

有PNUnit,但它是专为测试线程同步问题和类似的东西而设计的,我没有看到明显的方法来实现这一点。

是否有可用于并行运行测试的开关/工具/选项?

14 个答案:

答案 0 :(得分:46)

标准的nunit runner不支持并行运行测试。您可以创建自己的测试运行器以并行运行测试(使用您当前的nunit测试)。我不确定为什么nunit团队还没有这样做过。

或者,MBUnit可以选择创建可并行化的测试,并且由于MBUnit与NUnit具有几乎相同的语法,因此可能不需要花费太多精力来进行切换。

修改 正如评论中所述,尽管在撰写本文时这个答案是正确的,如果你想现在并行运行NUnit测试,至少有两个选项:

  • NCrunch提供开箱即用(不做任何改动,但是商业产品)
  • NUnit 3提供了一个可并行化的属性,可用于表示哪些测试可以并行运行

答案 1 :(得分:30)

NUnit版本3将支持并行运行测试:

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

  

•ParallelScope.None表示测试可能无法并行运行   与其他测试。

     

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

     

•ParallelScope.Children表示测试的后代可能   彼此平行运行。

     

•ParallelScope.Fixtures表示灯具可以并行运行   彼此。

NUnit Framework-Parallel-Test-Execution

答案 2 :(得分:10)

如果您的项目包含多个测试DLL,则可以使用此MSBuild脚本并行运行它们。显然,您需要调整路径以适合您的项目布局。

使用c:\proj> msbuild /m:8 RunTests.xml

运行8个核心

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

答案 3 :(得分:4)

this article中提到,为了加快测试,海报运行多个NUnit实例,并带有命令参数,指定每个实例应运行的测试。

FTA:

  

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

     

我们使用nunit-console来运行测试   我们的持续集成服务器   最近我们从Nunit搬来了   2.4.8至2.5.5和.Net 3.5至4.0。为了加快测试执行,我们运行了多个Nunit实例   与不同的命令行并行   参数

     
      
  • 我们有两个测试程序集和nunit二进制文件   文件夹A和B.
  •   
  • 在文件夹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

     

如果我们按顺序执行命令   两者都成功运行。但是,如果我们   并行执行它们只有一个   成功。据我所知   首先加载测试的那个   灯具。另一个失败了   消息“无法找到夹具”。

     

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

假设此错误已修复或您未运行所提及软件的较新版本,您应该能够复制其技术。

<强>更新

TeamCity看起来像是一个可以用来自动运行NUnit测试的工具。他们有一个NUnit启动器discussed here,可用于启动多个NUnit实例。 Here是一篇博文,讨论将多个NUnit XML结果合并到一个结果文件中。

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

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

答案 4 :(得分:3)

仅仅因为PNUnit可以在测试代码中进行同步并不意味着您实际上必须使用该方面。据我所知,没有什么可以阻止你只是产生一套而忽略其余的直到你需要它。

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

对于正常的线程开发可能有点反直觉(锁通常用于序列化访问 - 1乘1)但它是一个非常激烈的转移:-)

答案 5 :(得分:3)

您现在可以使用NCrunch来并行化您的单元测试,甚至可以配置NCrunch应该使用多少个内核以及Visual Studio应该使用多少内核。

加上你得到连续测试奖金:)

答案 6 :(得分:2)

这可能是一个黑客攻击,但您可以将单元测试拆分为多个categories。然后,为每个类别启动一个新的NUnit实例。

编辑:看起来他们已经在控制台应用中添加了/ process选项。命令行帮助说明这是“测试的过程模型:单个,单独,多个”。测试运行器似乎也具有此功能。

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

答案 7 :(得分:2)

由于这里没有提到项目,我想提出NUnit.Multicore。我自己没有尝试过该项目,但似乎对NUnit的并行测试问题有一个有趣的方法。

答案 8 :(得分:2)

您可以尝试我的小工具TBox或控制台并行Runner甚至插件来执行分布式计算,这也可以在这组计算机上运行单元测试SkyNet

创建TBox是为了简化包含许多项目的大型解决方案的工作。它支持许多插件,其中一个提供并行运行NUnit测试的能力。此插件不需要对现有测试进行任何更改。

它也支持:

  • 使用单元测试克隆文件夹(如果测试更改了本地数据),

  • 测试的同步(例如,如果你的测试 testfixtureteardown杀死所有dev服务器或chromerunner for qunit)

  • x86模式和管理员权限以运行测试

  • 批量运行 - 您可以并行运行多个程序集的测试

  • 即使对于单线程运行,如果你有很多小的测试,它的运行速度比标准的nunit运行速度要快。

此工具还支持命令行测试运行器(用于并行运行),您可以将其与持续集成一起使用。

答案 9 :(得分:1)

答案 10 :(得分:1)

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

  • 在构建服务器上运行
  • 运行Selenium测试
  • 具有Visual Studio支持
  • 还没有Resharper支持

感谢peers answer

陷阱:

  • 并行化属性不是继承的,因此必须在测试类中指定。

答案 11 :(得分:0)

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

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

Presented命令在单个nunit实例中运行所有测试程序集,允许利用引擎built-in parallel test run

<强>说明

  1. 请记住调整目录搜索模式。给定示例仅运行以.Tests.dll\bin\Debug目录结尾的程序集。

  2. 请注意Unique过滤 - 您可能不想拥有它。

答案 12 :(得分:0)

作为向每个测试类添加Parallelizable属性的替代方法:

将其添加到nunit3或更高版本的测试项目AssemblyInfo.cs类中:

// Make all tests in the test assembly run in parallel
[assembly: Parallelizable(ParallelScope.Fixtures)]

答案 13 :(得分:0)

要实现并行级别,请确保执行以下两项操作:

1)Nunit Explorer - 设置 - 并行运行测试

2)LevelOfParallelism

这是一个程序集级别的属性,用于指定并行级别,即程序集中执行测试的最大工作线程数。

在 Assemblyinfo.cs 中,设置

[assembly:LevelOfParallelism(N)] => 这里 N 是数字