17

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

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

这可能是一个经典问题,我使用 Eclipse JUnit 运行程序运行我的套件,一切运行非常线性并且运行良好。我去 Maven cmd 行,事情似乎正在互相踩踏。

4

4 回答 4

14

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

如果您使用的是 TestNGJunit 4.7+(自SUREFIRE-555起),则可以并行运行测试(请参阅parallelthreadCount可选参数),但这不是默认设置。

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

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

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

PS:以防万一,您可能还想投票支持这个请求SUREFIRE-321 (按字母顺序运行测试)。

于 2010-02-18T11:13:53.637 回答
3

首先,你的单元测试应该是相互独立的。这是因为即使 JUnit 也不能​​保证执行顺序,所以每个测试都应该独立于之前或之后发生的事情来设置和拆除其上下文(也称为测试夹具)。

虽然执行顺序绝对不是随机的,但在 JUnit 中它往往是相同的(我猜是按字母顺序),但你不应该建立在它之上 - 它可以随时更改,显然在 Surefire 中的顺序是不同的。

这是一个很好的链接,说明为什么交互测试不是一个好主意。

于 2010-02-18T09:01:35.163 回答
2

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

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

<forkMode>总是</forkMode>

于 2010-03-02T01:03:56.493 回答
-1

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

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

于 2015-07-06T22:43:12.430 回答