JMeter仅在token过期时触发getToken授权请求的实现咨询
问题根因
- 执行逻辑顺序错误:你当前是先执行
get token请求,再做过期判断,无论token是否有效都会先调用一次授权接口 - 变量名拼写错误:你定义的时间变量是
tokenGeneratedTime,但判断条件里写的是tokenGenerationTime,变量不匹配导致判断时取不到有效值,默认按0计算,差值永远大于3599000,每次都会触发token刷新 - 普通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
相关产品推荐
相关产品推荐

