如何在JMeter脚本中实现报告生成耗时统计及超时断言
解决方案
步骤1:记录触发报告的起始时间
在触发报告生成的HTTP POST请求下添加一个JSR223 PostProcessor,用以下脚本将当前毫秒级时间戳存入JMeter变量:
vars.put("startTime", System.currentTimeMillis().toString())
该操作会在触发请求执行完成后,把当前系统时间设为计时起点。
步骤2:在轮询请求中判断状态并计算耗时
在检查报告状态的HTTP请求下添加两个组件:
2.1 JSR223 PostProcessor(判断状态+计算总耗时)
用Groovy脚本解析响应,判断状态是否为“完成”,若是则计算从触发到完成的总耗时:
// 示例:假设状态在响应JSON的"status"字段下,根据实际响应格式调整解析逻辑 def responseText = prev.getResponseDataAsString() def responseJson = new groovy.json.JsonSlurper().parseText(responseText) if (responseJson.status == "完成") { def startTime = Long.parseLong(vars.get("startTime")) def endTime = System.currentTimeMillis() // 转换为分钟,保留两位小数 def totalDuration = String.format("%.2f", (endTime - startTime) / 1000 / 60) vars.put("totalDuration", totalDuration) }
若响应不是JSON格式(比如纯文本/HTML),直接用
responseText.contains("完成")判断即可。
2.2 响应断言(验证耗时是否达标)
添加响应断言,配置如下:
- 应用范围:勾选「Main Sample Only」
- 响应字段:勾选「JMeter Variable」,变量名填
totalDuration - 模式匹配规则:选择「Less Than」
- 要测试的模式:填
10
这样就能直接断言总耗时是否小于10分钟,不满足则标记为测试失败。
步骤3:优化轮询逻辑(可选)
为避免无意义的轮询,给轮询请求加一个While Controller,设置条件为:
${__jexl3("${status}" != "完成",)}
需要先通过JSON Extractor或正则表达式提取器,从轮询响应中把状态值提取到status变量里,这样轮询会在状态变为“完成”时自动停止。
为什么之前的方法不适用?
- Transaction Controller统计的是所有请求的执行时间总和,但轮询间隔的等待时间不会被计入,无法反映真实的从触发到完成的总耗时。
- 累加各请求响应时间的方式同样忽略了轮询间隔的等待时间,得到的结果比实际耗时小,不符合需求。
内容的提问来源于stack exchange,提问作者Sujata
相关产品推荐
相关产品推荐

