我怎样才能并行运行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运行 。
备注
-
记得调整目录search模式。 给定示例只运行以
.Tests.dll
结尾且位于\bin\Debug
目录内的程序集。 -
注意
Unique
过滤 – 你可能不想拥有它。