Maven surefire插件是否使用多个线程运行测试?

时间:2010-02-18 05:44:24

标签: unit-testing maven-2 junit surefire

我想知道Maven surefire插件是否默认运行多线程测试(如果可以控制线程数?)或者它是否以随机顺序或可预测顺序从Test类运行测试,或者如果订单可以通过某种方式决定。

我还没有验证过这个问题(明天我会这样做,只是寻找一些提示指导和验证),但看起来好像我的各种JUnit Test类正在以一些混合的顺序运行测试。这使得编排测试资源(在我的情况下非常重要)的编排非常痛苦。

它可能是一个经典的问题,我使用Eclipse JUnit运行程序运行我的套件,所有内容都非常线性,并且运行良好。我去了Maven cmd线,事情似乎在彼此踩着。

4 个答案:

答案 0 :(得分:13)

默认情况下,Maven在单独的(“分叉”)进程中运行您的测试,仅此而已(可以使用forkMode可选参数来控制)。

如果您使用的是TestNG Junit 4.7+(因为 SUREFIRE-555 ),则可以并行运行测试(请参阅{{3}和parallel可选参数)但这不是默认值。

现在,虽然我不确定surefire插件的行为是否与JUnit相同,但可以通过手动创建TestSuite并指定执行测试的顺序来获得一些控制权:

TestSuite suite= new TestSuite();
suite.addTest(new MathTest("testAdd"));
suite.addTest(new MathTest("testDivideByZero")); 

然而,强烈建议您永远不要依赖于测试执行顺序,单元测试确实应该是独立的。

P.S。:以防万一,还有一个您可能想要投票的请求threadCount(按字母顺序运行测试)。

答案 1 :(得分:3)

首先,您的单元测试应该彼此独立。这是因为即使是JUnit也不能保证执行的顺序,所以每个测试都应该设置并拆除它的上下文(也就是测试夹具),而不管之前或之后发生的事情。

执行的顺序绝对不是随机的,在JUnit中它往往是相同的(我猜是按字母顺序排列),但你不应该构建它 - 它可以随时改变,并且显然在Surefire中,顺序是不同的。

以下是interacting tests不是一个好主意的好链接。

答案 2 :(得分:2)

JUnit按照它们出现在.java文件中的顺序运行测试(不按字母顺序排列)。 Maven-surefire以不同的顺序运行它们,但不可预测(据我所知)。

理想情况下,测试将彼此独立,但单例和静态上下文会使事情复杂化。在单独的TestCase(但不是单独的测试)的执行之间获取新静态上下文的有用方法是在pom.xml中设置forkMode变量。

< forkMode>总是小于/ forkMode>

答案 3 :(得分:0)

我发现如果你在maven命令中使用-T选项,Surefire将分叉到forkCount * <specified number of threads by the -T option>个并发进程。

要使它们都在一个进程中运行,尽管-T指定了多个线程,您可以通过添加选项-Dsurefire.forkCount = 0强制forkCount为0