JMeter:使用While循环实现HTTP GET请求轮询并统计耗时示例
在JMeter中实现API轮询并统计总耗时
我来给你一步步拆解这个需求——用JMeter的While循环持续轮询REST API,直到拿到成功响应后退出,同时统计从开始到结束的总耗时。下面是具体的实现步骤:
一、搭建测试计划的基础结构
首先,你的测试计划需要包含这些组件(按顺序添加):
- 线程组(建议用1个线程、循环1次,因为轮询逻辑由While循环内部控制)
- JSR223 Sampler(循环前初始化时间变量和循环控制标记)
- While Controller(核心轮询控制逻辑)
- HTTP Request(你的REST API GET请求)
- 响应断言(判断请求是否成功)
- JSR223 PostProcessor(可选,用于自定义循环控制逻辑)
- JSR223 Sampler(循环结束后计算总耗时)
二、记录轮询的起始时间
在While循环之前添加一个JSR223 Sampler,用它记录轮询开始的毫秒时间戳:
// 把当前时间存入START_TIME变量 vars.put("START_TIME", System.currentTimeMillis().toString()); // 初始化循环控制变量,默认继续循环 vars.put("CONTINUE_LOOP", "true");
也可以用JMeter内置函数简化:在User Defined Variables里添加变量START_TIME,值填${__time(,)}(这个函数会直接返回当前毫秒时间戳)。
三、配置HTTP GET请求
在While控制器内部添加HTTP Request,填写你的API URL、请求头(比如Content-Type: application/json)、请求参数等,和正常调用REST API的配置完全一致。
四、添加响应断言识别成功响应
给HTTP请求添加响应断言,用来判断请求是否成功:
- 如果API用响应码标识成功:选择“响应代码”,匹配规则选“Equals”,填入
200(如果是其他成功码比如201,就填对应值) - 如果需要检查响应体内容:选择“响应文本”,匹配规则选“Contains”,填入API返回的成功标识(比如
"status": "success")
五、配置While循环的退出条件
这里有两种常用的配置方式,按需选择:
方式1:用JMeter内置状态变量(简单直接)
在While控制器的“条件”输入框里填写:
${__jexl3(${JMeterThread.last_sample_ok} == false,)}
这个表达式的逻辑是:只要上一次HTTP请求失败,就继续循环;一旦请求成功,立刻退出循环。
方式2:自定义变量控制(更灵活)
如果需要结合多条件判断,比如同时限制最大轮询次数,可以用自定义变量:
- 先在初始化的JSR223 Sampler里设置
CONTINUE_LOOP=true - 在HTTP请求的响应断言后,添加JSR223 PostProcessor,写入以下代码:
// 如果上一次请求成功,就把循环控制变量设为false if (vars.get("JMeterThread.last_sample_ok") == "true") { vars.put("CONTINUE_LOOP", "false"); }
- 最后在While控制器的条件里填写:
${CONTINUE_LOOP}(只要变量值为true,就继续循环)
⚠️ 重要提示:一定要给循环加上限,避免无限轮询!比如结合计数器函数限制最多轮询10次:
${__jexl3(${CONTINUE_LOOP} == true && ${__counter(,LOOP_COUNT)} <= 10,)}
六、统计轮询总耗时
在While循环结束后,添加一个JSR223 Sampler,计算从开始到成功退出的时间差:
def startTime = vars.get("START_TIME").toLong(); def endTime = System.currentTimeMillis(); def totalDuration = endTime - startTime; // 把总耗时存入变量,方便后续查看或生成报告 vars.put("TOTAL_POLLING_DURATION", totalDuration.toString()); // 打印到JMeter日志,方便调试查看 log.info("Total time until successful response: " + totalDuration + " ms");
查看耗时的方式:
- 添加Debug Sampler,运行后在查看结果树里能看到
TOTAL_POLLING_DURATION的具体值 - 也可以在Summary Report或View Results Tree中直接查看该变量内容
额外实用小贴士
- 在While控制器内部添加Constant Timer,设置固定延迟(比如2000毫秒),避免过于频繁调用API给服务器造成压力
- 展开查看结果树里的While控制器节点,可以看到每一次轮询的请求详情和单请求耗时
- 用Response Time Graph可以直观看到每次轮询的响应时间变化趋势
内容的提问来源于stack exchange,提问作者nkpalani
相关产品推荐
相关产品推荐

