You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:自定义变量控制(更灵活)

如果需要结合多条件判断,比如同时限制最大轮询次数,可以用自定义变量:

  1. 先在初始化的JSR223 Sampler里设置CONTINUE_LOOP=true
  2. 在HTTP请求的响应断言后,添加JSR223 PostProcessor,写入以下代码:
// 如果上一次请求成功,就把循环控制变量设为false
if (vars.get("JMeterThread.last_sample_ok") == "true") {
    vars.put("CONTINUE_LOOP", "false");
}
  1. 最后在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:06:26