【问题标题】:Forking in Surefire Maven Plugin: is it safe to use forking?Surefire Maven 插件中的分叉:使用分叉安全吗?
【发布时间】:2015-06-16 18:06:26
【问题描述】:
我们在 Maven Surefire 插件中有 several options 来描述分叉。其中一个选项 forkCount 解释如下:
用于指定要并行分叉的 VM 数量的选项,以便
执行测试。当以“C”结尾时,数字部分是
乘以 CPU 核心数。浮点值仅
与“C”一起接受。如果设置为“0”,则不会派生任何 VM,并且所有
测试在主进程中执行。
基于此,我可能会猜测,如果使用分叉机制并重用分叉 (reuseForks=true),那么相同的 JVM 将用于多个测试。这意味着,如果我已将某个类加载到内存中,则该类的静态成员可以在其他一些测试中重用并意外失败。
我的理解正确吗?
【问题讨论】:
标签:
maven
unit-testing
surefire
【解决方案1】:
你是对的。带有静态元素的测试不是线程安全的,应该是excluded from parallel execution:
如果 Suite 或 Parameterized 使用 @NotThreadSafe 注释,则套件类在单线程中执行。您还可以注释套件引用的单个测试类,套件中其他未注释的测试类可以并行运行。
注意:按照 JUnit runner 的设计,带有@BeforeClass 和@AfterClass 注解的静态方法在父线程中被调用。将课程分配给@NotThreadSafe Suite 以防止出现这种问题。