maven故障保护插件不支持JUnit5中的固定并行性



我尝试并行运行测试,但使用固定数量的线程。

  • maven故障保护插件2.22.2
  • JUnit 5.9.1
  • 硒4.7.0
  • JDK8
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.2</version>
<!-- Parallel configuration see junit-platform.properties -->
</plugin>

如果我从junit-platform.properties开始设置

junit.jupiter.execution.parallel.enabled=false

正如预期的那样,测试是单线程运行的。

设置

junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.mode.default=same_thread
junit.jupiter.execution.parallel.mode.classes.default=concurrent
junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=2

导致ca.10个浏览器并行启动。这表明maven故障保护插件尊重junit-platform.properties,但不尊重固定策略。

JUnit问题"固定策略忽略的并行性值"#2273描述了这个问题,更具体地说,Selenium问题"不能再限制JUnit 5#9359的并行会话数量"描述了对Selenium 4.0.0版及更高版本的影响。

然而,实现上述问题中描述的自定义并行策略并设置

junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.mode.default=same_thread
junit.jupiter.execution.parallel.mode.classes.default=concurrent
junit.jupiter.execution.parallel.config.strategy=custom
junit.jupiter.execution.parallel.config.custom.class=ch.want.funnel.integration.base.CustomParallelStrategy

没有任何改变,仍然有ca.10个浏览器并行打开。

我找不到描述这种行为的SO帖子或github问题,即maven故障保护插件确实尊重junit-platform.properties,确实尊重其中的junit.jupiter.execution.parallel.enabled设置,但不尊重parallel.config.strategy.

2022年12月16日更新

看看ForkJoinPoolHierarchicalTestExecutiorService,ForkJoinPool是用创建的

private ForkJoinPool createForkJoinPool(ParallelExecutionConfiguration configuration) {
ForkJoinWorkerThreadFactory threadFactory = new WorkerThreadFactory();
return Try.call(() -> {
// Try to use constructor available in Java >= 9
Constructor<ForkJoinPool> constructor = ForkJoinPool.class.getDeclaredConstructor(Integer.TYPE,
ForkJoinWorkerThreadFactory.class, UncaughtExceptionHandler.class, Boolean.TYPE, Integer.TYPE,
Integer.TYPE, Integer.TYPE, Predicate.class, Long.TYPE, TimeUnit.class);
return constructor.newInstance(configuration.getParallelism(), threadFactory, null, false,
configuration.getCorePoolSize(), configuration.getMaxPoolSize(), configuration.getMinimumRunnable(),
configuration.getSaturatePredicate(), configuration.getKeepAliveSeconds(), TimeUnit.SECONDS);
}).orElseTry(() -> {
// Fallback for Java 8
return new ForkJoinPool(configuration.getParallelism(), threadFactory, null, false);
}).getOrThrow(cause -> new JUnitException("Failed to create ForkJoinPool", cause));
}

因此配置maxPoolSize仅被考虑用于JDK9及更高版本。此外,Eclipse调用

ForkJoinPoolHierarchicalTestExecutorService#invokeAll(List<? extends TestTask>) 

每个测试类单独调用,而Maven对所有测试类调用一次。

基于junit.jupiter.execution.parallel.mode.classes.default=concurrent,您可以在类级别上进行并行化。

这意味着,如果你有足够的核心,就会启动适当数量的线程。如果你想限制你必须通过的号码:

junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=6

否则将考虑默认的Fork-Join poil。

相关内容

  • 没有找到相关文章

最新更新