gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:53 24 4
gpt4 key购买 nike

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

  1. maven fork Fitnesse 服务器进程
  2. maven 对fitnesse 服务器进行http 调用
  3. 健身服务器为每个调用 fork 一个测试运行程序
  4. http调用返回,返回2。

3.中启动jvm的命令行是基于http调用参数构建在fitnesse jar内部的。这意味着您不能传入任意 jvm 参数,只能传入受支持的参数。

现在,我们面临的问题是有时启动的进程会挂起 3 次。它看起来不像超时问题,因为我们已经看到它们挂起多个小时。

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

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

似乎是启动的运行程序进程的标准输出,但我不确定。

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

所以,问题是 - 有更好的方法吗?我在这里遗漏了一些明显的东西吗?

最佳答案

我不相信 FitNesse 的核心是线程安全的。因此,我建议您不要将精力集中在控制运行程序的启动方式和调试这些运行程序上,而是尝试运行彼此完全隔离的测试进程。通过为 FitNesse 和测试运行程序使用单个进程(当您想要并行运行套件时,可以使用多个进程),如果出现任何问题,调试也会变得更容易(因为您不必控制额外进程的创建并附加到这些新进程,因此只有一个用于测试运行/套件的进程)。

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

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

关于多进程fitnesse测试环境中的Java OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41401423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com