多进程fitnesse测试环境中的Java OOM

时间:2016-12-30 19:06:24

标签: java remote-debugging fitnesse fitnesse-slim

我们正在使用fitnesse进行复杂的基于Web的应用程序的验收测试。完整套件需要几个小时才能通过,因此我们正在使用多个进程。设置如下:

  1. maven forks fitnesse服务器进程
  2. maven对fitnesse服务器进行http调用
  3. fitnesse服务器为每次通话分配测试运行器
  4. http呼叫返回,返回2.
  5. 在3中启动jvm的命令行是基于http调用参数在fitnesse jar中构建的。意思是你不能传递任意的jvm参数,只能传递支持的参数。

    现在,我们面临的问题是,有时这个过程会以3个挂起的方式启动。它看起来不像是超时问题,因为我们已经看到它们挂了好几个小时。

    这些jvm进程不会通过jmx公开任何内容,因此我们无法使用jconsole或类似方法连接它们。根据每个进程消耗的内存量(1-1.5G),我强烈怀疑OOM发生在跑步者进程的某个地方,并阻止它正常退出。另外,尝试"杀-3"在服务器进程上生成

    Exception in thread "CommandRunner stdOut" java.lang.OutOfMemoryError: Java heap space  at java.util.Arrays.copyOf(Arrays.java:3332)
    

    在开始的跑步过程似乎是什么样的,但我不确定。

    我目前正在做的解决方案是创建控制命令行的类副本,以便每个进程都使用随机jmx端口和调试端口启动,因此如果它挂起 - 可以连接并调查。

    所以,问题是 - 有更好的方法吗?我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:0)

我不相信FitNesse的核心是线程安全的。因此,我不会集中精力控制跑步者的起跑方式,而是调试那些我建议你尝试完全相互隔离的测试过程。通过为FitNesse和测试运行器使用单个进程(并且当您希望并行运行套件时,可以使用多个这样的进程),如果存在任何问题,也可以更容易调试(因为您不必控制创建额外的流程和附加到这些新流程,只有一个测试运行/套件的过程。)

我所做的是通过jUnit运行程序(使用单个进程运行FitNesse和测试运行程序)运行我的测试套件,并为每个我希望并行运行的测试套件启动一个单独的(jUnit)进程。我实际上并不是通过maven控制进程创建,而是在Jenkins作业中使用多个进程。每个执行相同的maven命令,但具有不同的系统属性,其中一个系统属性控制执行哪个套件。

使用这种方法可能对您的测试设置来说太大了。但我相信你可以稍微改变你的过程并得到类似的结果。您尚未准确指定maven pom的结构。但是,你不能只为每个套件重复步骤1-4,而不是只有步骤2-4。这似乎只需要更改FitNesse服务器侦听的端口(在步骤1中),并且可以通过命令行参数(-p)轻松完成。通过将&debug添加到步骤2中使用的URL,可以在与wiki相同的过程中运行。

相关问题