JUnit 4.12使用并行计算运行的测试数量不一致



我们使用带有固定线程池的自定义Computer实现并行执行JUnit测试。我们注意到,在我们的ci服务器上,每次测试运行的测试数量都会发生巨大变化(从1000个测试到45000个测试(预期数量(不等(。

使用ParallelComputer实现,测试可以正常运行,但由于线程数非常高,会导致其他问题,如数据库死锁和服务器超时。这就是为什么我们需要限制运行的线程的最大数量。

有没有其他一致的方法可以在有限的线程池中并行运行JUnit测试?还是我们的实现缺少了什么?

谢谢你的帮助。

更新:这种行为的原因似乎是测试失败。一旦任何线程中的任何测试失败,进程就会停止,而没有任何进一步的信息。没有创建任何测试报告,也没有测试结果的摘要。

使用默认的ParallelComputer,会记录测试失败,但不会阻止其余测试的运行。运行完所有测试后,将按预期创建包含所有失败/错误/成功的报告。

以下是我们的实现:

public class CustomParallelComputer extends Computer {
private boolean classes;
private int maxPoolSize;
public CustomParallelComputer(boolean classes, int maxPoolSize) {
this.classes = classes;
this.maxPoolSize = maxPoolSize;
}
public static Computer classes(int maxPoolSize) {
return new CustomParallelComputer(true, maxPoolSize);
}
private static Runner parallelize(Runner runner, int maxPoolSize) {
if (runner instanceof ParentRunner) {
((ParentRunner) runner).setScheduler(new RunnerScheduler() {
private ExecutorService fService =
Executors.newFixedThreadPool(maxPoolSize);
public void schedule(Runnable childStatement) {
this.fService.submit(childStatement);
}
public void finished() {
try {
this.fService.shutdown();
this.fService.awaitTermination(9223372036854775807L, TimeUnit.NANOSECONDS);
} catch (InterruptedException var2) {
var2.printStackTrace(System.err);
}
}
});
}
return runner;
}
public Runner getSuite(RunnerBuilder builder,Class<?>[] classes) throws InitializationError {
Runner suite = super.getSuite(builder, classes);
return this.classes ? parallelize(suite, maxPoolSize) : suite;
}
}

我们从测试套件中调用CustomParallelComputer,如下所示:

Computer classes = CustomParallelComputer.classes(maxPoolSize);
Result result = jUnitCore.run(classes, tests.toArray(new Class[tests.size()]));

事实证明,并行处理不是问题所在。问题是错误的代码,导致主线程在测试运行期间被调用时中断。

最新更新