我们正在使用具有固定线程池的自定义计算机实现并行执行JUnit测试。我们注意到,我们ci-server上的每次测试运行的测试计数都有很大的变化(范围从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;
}
}
我们从TestSuite调用CustomParallelComputer,如下所示:
Computer classes = CustomParallelComputer.classes(maxPoolSize);
Result result = jUnitCore.run(classes, tests.toArray(new Class[tests.size()]));
答案 0 :(得分:0)
事实证明,并行处理不是问题。 问题是代码错误,导致在测试运行期间调用主线程时中断。