我尝试并行运行测试,但使用固定数量的线程。
- 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。