0

我有启用了 TestNG 和 Surefire 插件的 Groovy Maven2 测试项目。

我想在最后一个测试方法中启动外部进程(启动一些 *.exe 文件的 *.cmd 文件),完成我的测试并在测试后让进程运行。

我尝试了以下代码来做到这一点:

1 次尝试

def builder = new ProcessBuilder('cmd','/c <name>.cmd')
builder.directory( ( new File( <path_to_working_directory> ) ) )
builder.start()

2 次尝试(有和没有 start cmd 选项)

Runtime.getRuntime().exec( "cmd /c start <name>.cmd", null , ( new File( <path_to_working_directory> ) ) )

3 次尝试

( new AntBuilder() ).exec(
    dir: "<path_to_working_directory>",
    executable: "<name>.cmd"
)     

.cmd 在哪里:

set path=<path_to_execFile>;%path%
start <execFileName>.exe

当我通过“运行”功能(Alt+Shift+F10)从 Intellij IDEA 启动这些代码时,代码成功执行,进程启动并在测试完成后运行。

当我从 Intellij IDEA Maven 任务启动这些代码时,干净的 Maven 安装(甚至来自 Jenkins 的 Maven 任务)进程成功启动,但测试仍在运行。我需要手动杀死它。当我手动终止测试进程(Maven 进程)时,我启动的外部进程继续按预期工作。

这个挂起的测试过程是我目前最头疼的问题。

我查看了很多材料,但没有找到任何根本原因,修复甚至解决此问题的方法。我看到我所有的尝试(也许除了 AntBuilder() 之外)都创建了分离的进程。我想这可以与JVM设置相关联。但我找不到哪一个。

另外,我试过

"full command to run my cmd".execute()

但这对我也没有帮助。

你能帮我解决这个问题吗?

提前致谢!

4

1 回答 1

0

所以,我在这里看不到我的问题的任何答案。但我有一些更新。

我发现我可以使用 PsExec 工具而不是直接 cmd 调用:

def builder = new ProcessBuilder( 'psexec', 'cmd', '/c', '<name>.cmd' )
builder.directory( ( new File( <path_to_working_directory> ) ) )
builder.start()

当我仅从干净的 Maven(而不是 Jenkins)启动它时,此代码运行良好:进程已启动,Maven 任务成功完成,进程继续运行。

但是在执行此代码作为某些 Maven2 Jenkins 任务的一部分时,我再次面临问题:psexec 已启动,但 Jenkins 任务正在运行,并且在我手动终止 Jenkins 任务之前我的进程没有启动。

为了避免这个问题,我创建了简单的附加 Groovy 服务脚本,我在初始机器准备期间手动在目标机器上以侦听模式(和编写 TCP 服务器)启动。该脚本始终在机器上运行。

我从我从 Jenkins 启动的测试中将要执行的命令文件的名称发送到此侦听器,它成功执行了所有 cmd:进程启动,Jenkins 任务成功完成,进程继续运行。我在这个监听器中使用了 processbuilder。

对于名称发送,我使用简单的套接字(编写 TCP 客户端)

另外,我发现如何在 win32 上将子进程从进程树中分离出来?. 但对我来说,我认为我的系统看起来更像 Groovy。

于 2013-06-19T19:00:22.630 回答