Java没有fork,java-junit5-并行运行测试(在pom中没有forkCount)

为了并行执行我的JUnit测试,我使用了提供的解决方案here(感谢@peanut和@Reid Mac).这对于JUnit 4效果很好,但是我正尝试从JUnit 4迁移到JUnit5.由于JUnit 5测试是由直接扩展Runner的JUnitPlatform执行的,因此JUnit 5无法实现等效功能.JUnit 5是否具有任何类似的方法setScheduler?以下是我的代码段.

JUnit4Runner.class

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

import java.util.LinkedList;

import java.util.Queue;

import java.util.concurrent.CompletionService;

import java.util.concurrent.ExecutorCompletionService;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

import java.util.concurrent.ThreadFactory;

import java.util.concurrent.atomic.AtomicInteger;

import org.junit.runners.Suite;

import org.junit.runners.model.InitializationError;

import org.junit.runners.model.RunnerBuilder;

import org.junit.runners.model.RunnerScheduler;

public final class JUnit4Runner extends Suite {

@Retention(RetentionPolicy.RUNTIME)

@Target({ ElementType.TYPE })

public @interface Concurrent {

int threads() default 1;

}

/**

* Used by JUnit Concurrent

* https://stackoverflow.com/questions/5674774/running-junit-test-in-parallel-on-suite-level

*/

public AJUnit4Runner2(Class> suiteClass, RunnerBuilder builder) throws InitializationError {

super(suiteClass, builder);

setScheduler(new RunnerScheduler() {

ExecutorService executorService = Executors.newFixedThreadPool(

suiteClass.isAnnotationPresent(Concurrent.class)

? suiteClass.getAnnotation(Concurrent.class).threads()

: 1,

new NamedThreadFactory(suiteClass.getSimpleName()));

CompletionService completionService = new ExecutorCompletionService(executorService);

Queue> tasks = new LinkedList>();

@Override

public void schedule(Runnable childStatement) {

tasks.offer(completionService.submit(childStatement, null));

}

@Override

public void finished() {

try {

while (!tasks.isEmpty()) {

tasks.remove(completionService.take());

}

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

} finally {

while (!tasks.isEmpty()) {

tasks.poll().cancel(true);

}

executorService.shutdownNow();

}

}

});

}

class NamedThreadFactory implements ThreadFactory {

final AtomicInteger poolNumber = new AtomicInteger(1);

final AtomicInteger threadNumber = new AtomicInteger(1);

final ThreadGroup group;

public NamedThreadFactory(String poolName) {

group = new ThreadGroup(poolName + "-" + poolNumber.getAndIncrement());

}

@Override

public Thread newThread(Runnable r) {

return new Thread(group, r, group.getName() + "-thread-" + threadNumber.getAndIncrement(), 0);

}

}

}

JUnit5运行器类看起来像这样

JUnit5Runner.class

public class JUnit5Runner extends JUnitPlatform {

public JUnit5Runner(Class> testClass) throws InitializationError {

super(testClass);

...

}

@Override

public void run(RunNotifier notifier) {

super.run(notifier);

}

}

解决方法:

Junit 5.3 M1现在支持并行测试执行.

正如documentation中提到的那样,它目前是一项实验功能.您可以通过在junit-platform.properties中将junit.jupiter.execution.parallel.enabled配置参数设置为true来启用它.

标签:maven,junit,junit5,java

来源: https://codeday.me/bug/20191110/2014038.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值