如何并行运行NUnit测试?

Bil*_*eal 77 nunit

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

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

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

Dav*_*001 48

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

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

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

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

  • 虽然这是最佳答案,但它不再像过去那样正确.Nunit 3.0于2015年底发布,现在具有Parallelizable属性.参考:https://github.com/nunit/nunit/wiki/Parallelizable-Attribute (3认同)
  • @chillitom NCrunch在这个问题得到解答后发布了,这是一个不错的选择(因为这应该只是开箱即用,虽然它对某些人来说过于昂贵).未来的其他选择可能包括NUnit 3,它可能提供并行运行的测试(根据https://github.com/nunit/dev/wiki/Roadmap). (2认同)

Pet*_*ter 34

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

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

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

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

•ParallelScope.Children指示测试的后代可以相对于彼此并行运行.

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

NUnit框架 - 并行 - 测试 - 执行


chi*_*tom 10

如果您的项目包含多个测试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>
Run Code Online (Sandbox Code Playgroud)

更新 如果我现在回答这个问题,我强烈推荐NCrunch及其命令行测试运行工具,以获得最大的测试运行性能.没有什么比这更好的了,它会同时彻底改变您的代码测试调试周期.


tom*_*ern 8

作为向每个测试类添加可并行化属性的替代方法:

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

// Make all tests in the test assembly run in parallel
[assembly: Parallelizable(ParallelScope.Fixtures)]
Run Code Online (Sandbox Code Playgroud)

  • 正确答案其实是```[ assembly: Parallelized(ParallelScope.ContextMask)]```在AssemblyInfo.cs中ContextMask没有文档记录,但是如果你打开Enum,你会发现```ContextMask = (ParallelScope. Fixtures | ParallelScope.Children)``` 这意味着该程序集中存在的每个测试都将被视为可并行化,除非您为特定的类、方法或测试设置不同的值。 (2认同)