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

JMeter仅在token过期时触发getToken授权请求的实现咨询

问题根因

  1. 执行逻辑顺序错误:你当前是先执行get token请求,再做过期判断,无论token是否有效都会先调用一次授权接口
  2. 变量名拼写错误:你定义的时间变量是tokenGeneratedTime,但判断条件里写的是tokenGenerationTime,变量不匹配导致判断时取不到有效值,默认按0计算,差值永远大于3599000,每次都会触发token刷新
  3. 普通JMeter变量为线程/测试计划级,每次重新运行测试计划会被清空,跨运行无法保留token和时间记录

可行实现方案

直接按以下步骤调整测试计划即可:

方案1:同测试计划内多迭代生效(不需要跨测试运行保留token)

  • 调整执行顺序,把过期判断放在所有请求最前面
  • 线程组顶部新增【用户定义变量】元件,初始化两个变量:
    • access_token 留空
    • tokenGeneratedTime 赋值为 0
  • 新增If控制器作为所有请求的第一个节点,判断条件写:
    ${__jexl3("${access_token}" == "" || (${__time(,)} - ${tokenGeneratedTime}) > 3599000,)}
    
  • 把get token取样器放到该If控制器的子节点下,只有满足条件时才会执行授权请求
  • 在get token取样器下新增JSON/正则提取器,把接口返回的access_token提取到access_token变量
  • 继续在get token取样器下新增JSR223后置处理器,写入代码:
    // 只有拿到有效token后才更新生成时间
    vars.put("tokenGeneratedTime", String.valueOf(System.currentTimeMillis()));
    
  • 后续业务请求正常放在If控制器后面即可

方案2:跨测试计划运行生效(GUI不点关闭的前提下,多次运行测试计划也不重复拿未过期的token)

需要把token和时间存到JMeter全局属性中(属性为JVM级,只要JMeter不关闭就永久保留),调整点如下:

  • If控制器的判断条件修改为:
    ${__jexl3("${__P(access_token,)}" == "" || (${__time(,)} - ${__P(tokenGeneratedTime,0)}) > 3599000,)}
    
  • get token下的JSR223后置处理器代码修改为:
    props.put("access_token", vars.get("access_token"));
    props.put("tokenGeneratedTime", String.valueOf(System.currentTimeMillis()));
    
  • 业务请求里引用token的地方,统一改成${__P(access_token,)}即可

内容的提问来源于stack exchange,提问作者elio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:15:00