我正在寻找并行运行测试套件的方法。
我知道.testrunconfig
设置。这允许您多路复用CPU的数量。
我想并行运行1000个测试。这是有意义的,因为我正在测试一个Web服务,所以测试中90%的时间都花在等待服务响应上。
有什么想法吗?这些测试是为VS编写的,但是我愿意在VS之外运行它们。
稍后编辑:Visual Studio测试团队已经在VS 2015 Update 1中添加了这一点。请参见下面Mark Sowul的回答。
我正在寻找并行运行测试套件的方法。
我知道.testrunconfig
设置。这允许您多路复用CPU的数量。
我想并行运行1000个测试。这是有意义的,因为我正在测试一个Web服务,所以测试中90%的时间都花在等待服务响应上。
有什么想法吗?这些测试是为VS编写的,但是我愿意在VS之外运行它们。
稍后编辑:Visual Studio测试团队已经在VS 2015 Update 1中添加了这一点。请参见下面Mark Sowul的回答。
6条答案
按热度按时间wvmv3b1j1#
本页上的大多数答案都忘记提到MSTest将测试并行化在单独的程序集中。您必须将单元测试拆分为多个.dll文件才能将其并行化。
但是!最近的版本- MSTest V2 -现在可以并行化“汇编内”(耶!)您只需要在您的测试项目中安装几个nuget包- TestFramework和TestAdapter -就像这里描述的https://blogs.msdn.microsoft.com/devops/2018/01/30/mstest-v2-in-assembly-parallel-test-execution/
然后只需将其添加到测试项目中
编辑:您还可以在测试方法上使用
[DoNotParallelize]
禁用特定测试的并行执行。ix0qys7i2#
使用方法from the Visual Studio Team Test Blog最多可以得到5
请记住,使用此方法可能会出现并发问题,因为MSTest并没有完全隔离每个测试(例如,静态信息会延续,使原本只运行一次的代码变得有趣)。
(No我知道为什么限制为5,但是如果
parallelTestCount
设置为大于5,MSTest将不会并行运行它们。根据下面的注解,此规则在Visual Studio 2013中明显发生了变化)bpzcxfmw3#
Visual Studio 2015更新1添加了此功能。https://learn.microsoft.com/visualstudio/releasenotes/vs2015-update1-vs#misc
对于Update 2,在“测试资源管理器”窗格顶部的工具栏中有一个UI切换按钮(在“分组”和“搜索”框之间)。
对于Update 1,请在.runsettings中设置以下内容
MaxCpuCount的值具有以下语义:
· 'n'(其中1〈= n〈=内核数量):将启动多达'n'个进程。
·任何其他值的“n”:启动的进程数将与计算机上的可用核心数一样多。
另请注意,对于MSTest V2,您可以在类别层级套用并行,也可以使用组件指示词:
或.runsettings:
程序集、类或方法可以使用
[DoNotParallelize]
退出请参阅https://github.com/Microsoft/testfx-docs/blob/master/RFCs/004-In-Assembly-Parallel-Execution.md
5lwkijsr4#
我发现C:\Program Files(x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe将使用
.testsettings
文件运行并行测试,该文件如下所示:可在此处找到参考http://msdn.microsoft.com/en-us/library/vstudio/jj155796.aspx
r1wp621o5#
上面的回答肯定有助于澄清事情对我来说,但是,这一点从约翰Koerner的博客:https://johnkoerner.com/vs2015/parallel-test-execution-in-visual-studio-2015-update-1-might-not-be-what-you-expect/是我们遗漏的部分。
并行测试执行利用计算机上的可用内核,并通过在每个可用内核上启动测试执行引擎作为一个不同的进程,并将其作为一个容器(程序集、DLL或包含要执行的测试的相关工件)来实现,值得执行的测试。
--〉“单独的容器位是我缺少的部分。为了使我的测试并行运行,我需要将我的测试拆分成单独的测试程序集。这样做之后,我看到不同程序集中的测试并行运行。”
因此,我们使用方便的'run in parallel'标志在VSTS中并行运行测试,但这还不够,我们必须将测试拆分为单独的测试项目。
omhiaaxx6#
1.确保DataTable中的第一列是唯一的ID。
1.创建一个接受DataRow且不返回任何内容的AsyncExecutionTask委托。
1.使用接受DataRow和AsyncExecutionTask委派的AsyncExecutionContext方法建立静态类别(ParallelTesting)。
1.在静态类别中,加入静态BatchStarted属性。
1.在静态类别中,加入静态AsyncExecutionTests Dictionary属性。
1.在AsyncExecutionContext方法中添加以下内容:
1.现在使用类别,如下所示:
**注意:**您必须对异常进行一些修改,以使它们正确冒泡(您可能在此处有一个聚合异常,您需要它的第一个异常)。显示的每个测试执行所用的时间量将不再准确。您还需要在完成最后一行后清除ParallelTesting类。
**工作原理:**测试逻辑被 Package 在lambda中,并传递给一个静态类,当它第一次被调用时(第一行被执行),该静态类将为每一行测试数据执行一次逻辑。对静态类的连续调用只需要等待预启动的测试Task完成。
通过这种方式,测试框架对TestMethod的每次调用都只是收集已经运行的相应测试的测试结果。
可能的改进: