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

时间:2018-07-11 09:10:16

标签: java junit parallel-processing

我们正在使用具有固定线程池的自定义计算机实现并行执行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()]));

1 个答案:

答案 0 :(得分:0)

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

相关问题