我想知道Maven surefire插件是否默认运行多线程测试(如果可以控制线程数?)或者它是否以随机顺序或可预测顺序从Test类运行测试,或者如果订单可以通过某种方式决定。
我还没有验证过这个问题(明天我会这样做,只是寻找一些提示指导和验证),但看起来好像我的各种JUnit Test类正在以一些混合的顺序运行测试。这使得编排测试资源(在我的情况下非常重要)的编排非常痛苦。
它可能是一个经典的问题,我使用Eclipse JUnit运行程序运行我的套件,所有内容都非常线性,并且运行良好。我去了Maven cmd线,事情似乎在彼此踩着。
答案 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