如何通过QFTest验证Java应用的HMI已完全关闭?
QFTest验证Java HMI彻底关闭的解决方案
问题背景
我用QFTest测试Java应用,需要验证关机操作后HMI完全停止运行。原本写了一段Jython脚本,通过尝试向HMI发送套接字来判断——如果发送失败就判定HMI已停止、测试通过。脚本如下:
import threading import time rc.setLocal("returnValue", False) for i in range(50): time.sleep(0.5) try: # 尝试向HMI发送套接字 rc.toSUT("client", vars) except: # 发送失败,判定HMI已关闭:测试通过 rc.setLocal("returnValue", True) break
但实际测试中发现,QFTest的Java Agent会阻止应用彻底终止,导致上述套接字检测方法无法准确验证HMI是否完全关闭。
解决方案
1. 主动解绑QFTest Java Agent
在触发HMI关机操作后,先执行QFTest内置的rc.detachSUT("client")命令,主动断开QFTest与被测应用的Agent连接。这一步能解除Agent对应用进程的持有,让应用可以正常退出,避免Agent进程残留影响验证结果。
2. 直接检测操作系统进程状态(替代套接字方法)
解绑Agent后,直接检查HMI对应的Java进程是否存在,这是最直接的验证方式:
- Windows系统:通过
tasklist命令结合进程特征(如窗口标题、主类参数)过滤目标进程 - Linux/macOS系统:使用
pgrep命令匹配HMI的主类名或启动参数
示例Jython代码:
import time import subprocess rc.setLocal("returnValue", False) # 第一步:解绑QFTest Agent rc.detachSUT("client") # 循环检测进程状态,最多等待25秒 for i in range(50): time.sleep(0.5) # Windows示例:替换为你的HMI进程识别条件 result = subprocess.run( ["tasklist", "/fi", "imagename eq java.exe", "/fi", "windowtitle eq HMI_Main_Window"], capture_output=True, text=True ) # Linux/macOS示例: # result = subprocess.run(["pgrep", "-f", "com.yourcompany.hmi.Main"], capture_output=True, text=True) # 若进程不存在(命令返回非0),判定测试通过 if result.returncode != 0: rc.setLocal("returnValue", True) break
3. 结合应用日志验证(可选补充)
如果HMI关机完成时会输出特定日志(如[INFO] HMI shutdown completed successfully),可以在解绑Agent后,监控HMI的日志文件,直到出现该标识再判定测试通过,进一步提升验证的准确性。
内容的提问来源于stack exchange,提问作者Skartt
相关产品推荐
相关产品推荐

