如何通过JMeter远程控制Windows机器完成桌面应用加载时长测试?
使用JMeter完成远程桌面应用加载时长测试的实现方案
JMeter本身不支持桌面GUI操作,需结合SikuliX(图像识别工具)和JSR223脚本实现需求,具体步骤如下:
一、环境准备
- 安装JMeter
- 下载SikuliX的jar包,放入JMeter的
lib/ext目录,重启JMeter - 固定目标远程桌面的分辨率,避免图像识别失败;提前截取所需控件(如用户名输入框、密码框、目标文件图标等)的截图,保存到指定路径
二、测试计划配置
1. 线程组
添加线程组,设置测试循环次数(根据需求调整)
2. 启动远程桌面连接
添加JSR223 Sampler,选择Jython语言,编写脚本启动mstsc:
import os # 替换为目标IP地址 os.system("mstsc /v:192.168.1.100") # 等待连接窗口弹出,可根据实际调整等待时间 Thread.sleep(3000)
3. 输入域账号密码
添加Sikuli Sampler,编写图像识别脚本完成登录:
# 识别用户名输入框截图,输入账号(注意转义反斜杠) type("username_input.png", "domain\\testuser") # 识别密码输入框截图,输入密码 type("password_input.png", "yourpassword") # 识别连接按钮截图,点击登录 click("connect_btn.png") # 等待远程桌面加载完成,超时10秒 wait("desktop_bg.png", 10)
4. 记录开始时间
添加JSR223 Sampler,选择Groovy语言,记录开始时间并写入结果文件:
import java.text.SimpleDateFormat def sdf = new SimpleDateFormat("HH:mm:ss") def startTime = sdf.format(new Date()) // 暂存开始时间到变量 vars.put("START_TIME", startTime) def resultFile = new File("load_time_result.txt") // 首次运行时写入表头 if (!resultFile.exists()) { resultFile.write(" Start_Time End_Time Load_Time\n\n") } // 写入开始时间 resultFile.append(" ${startTime} ")
5. 双击目标文件
添加Sikuli Sampler,识别目标文件图标并双击:
// 识别目标文件截图,双击打开 doubleClick("target_file.png")
6. 等待应用加载完成
添加Sikuli Sampler,等待应用主窗口出现(替换为应用窗口的截图):
// 等待应用主窗口加载,超时120秒(可调整) wait("app_main_window.png", 120)
7. 记录结束时间并计算加载时长
添加JSR223 Sampler,选择Groovy语言,完成时间计算和写入:
import java.text.SimpleDateFormat def sdf = new SimpleDateFormat("HH:mm:ss") def endTime = sdf.format(new Date()) vars.put("END_TIME", endTime) // 计算加载时长(秒) def startDate = sdf.parse(vars.get("START_TIME")) def endDate = sdf.parse(endTime) def loadTime = (endDate.getTime() - startDate.getTime()) / 1000 // 写入结束时间和时长到文件 def resultFile = new File("load_time_result.txt") resultFile.append("${endTime} ${loadTime} secs \n")
8. 断开远程会话
添加JSR223 Sampler,选择Jython语言,执行断开命令:
import os # 执行tsdiscon命令断开远程会话 os.system("tsdiscon")
三、关键注意事项
- 测试过程中,JMeter所在机器的桌面不能被最小化、锁定或遮挡,否则SikuliX无法识别图像
- 控件截图需清晰,确保在目标远程桌面环境下能被准确识别
- 等待时间参数(如
Thread.sleep、wait的超时时间)需根据实际环境调整 - 多线程测试时,需处理文件写入的并发冲突,可给每个线程分配独立的结果文件,或在Groovy脚本中添加同步锁
内容的提问来源于stack exchange,提问作者Ajith R
相关产品推荐
相关产品推荐

