我正在使用 maven Surefire 插件(LTS 版本)在两个测试框架(例如 jUnit、jBehave)上执行测试。
尝试通过生成几个线程来实现并行化,这些线程又创建进程来执行surefire jar,从-
获取ManagementFactory.getRuntimeMXBean().getSystemProperties().get("sun.java.command")
显示流程创建的代码片段 - CustomRunner.java
void run() {
ProcessBuilder processBuilder = new ProcessBuilder(commandArray);
Map<String, String> environment = processBuilder.environment();
environment.put("platformIndex", String.valueOf(platformIndex));
try {
processBuilder.inheritIO();
Process p = processBuilder.start();
LOGGER.info("Is Alive {} {}", p.isAlive(), LocalTime.now());
int statusCode = p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
EntryPoint.java
for (int i = 0; i < 3; i++) {
Thread thread = new Thread(new CustomRunner(commandArray, String.valueOf(i)));
thread.start();
threadList.add(thread);
}
threadList.forEach(thread -> {
try {
thread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
System.exit(exitcode);
在相应线程中运行两个或有时三个进程后,进程执行卡在 p.waitFor();
然后进程在 30 秒后退出,并显示错误消息 “Surefire 将杀死 self fork JVM。退出已在 System.exit(0) 后 30 秒过去。” 导致构建失败(有时不会)尽管测试已经在各自的过程中通过了。
似乎肯定的执行被卡在某些进程中。您能否让我知道可能的原因是什么以及如何缓解这种情况?尝试将 ForkedProcessTimeoutInSeconds 延长到几分钟,但没有成功。
非常感谢任何帮助。
根据文档,在所有守护进程关闭后,surefire会等待非守护进程关闭,但只等待30秒。看起来您正在创建非守护线程(非守护线程生成其他非守护线程)。我假设你有两个选择:
使用插件配置中的
surefire.exitTimeout
属性或<forkedProcessExitTimeoutInSeconds>
属性增加surefire退出超时
让你的线程守护进程
thread.setDaemon(true);