JMETER提取接口返回的token

做接口测试的时候,关于token提取、调用的问题解决。

1. 准备工作

做测试之前最重要的是先把接口调通,先不纠结token怎么取,接口请求需要token,简单粗暴的解决方式是通过Fiddler抓包直接拿到token 手动放入请求参数里。

这个办法可以在前期调接口时使用,但是这个办法太依赖手工,且需要打开多个工具,调通以后就不推荐使用。

更好办法是添加登录接口请求,拿到登录接口返回的token,然后在后期接口请求时直接引用就行。

那么怎么拿token呢?

2.提取token

我想要的token数据在返回接口的header里的Authorization参数,这个可以用正则表达式提取。

添加正则表达式提取器:线程组-》右键添加-》后置处理器-》正则表达式提取器

1.要检查的响应字段勾选信息头,

2.在下面依次填入引用名称,我自定义名称是Auth

3.正则表达式是Authorization:\s+(.+)

\s+‌:匹配冒号后的一个或多个空白字符(空格或制表符)。 ‌(.+)‌:捕获组,提取冒号及空白后的‌具体内容‌(如

Token、Basic 凭证等),直到行尾。

4.模板:我要匹配的第一个。

复制代码
$1$:表示取第1个 	
$2$:表示取第二个 	
以此类推:$n$:表示取第n个

5.匹配数字:我要全部,填1。

0代表随机取值,1代表全部取值**

全部填好如下。

3.token直接调用

理论上,目前已经提取出来token,我的例子是Auth,直接${Auth}调用即可。

但是如果是压测高并发时,每次接口执行都去调用一次登录接口或许token是非常不合理的。

这里可以选择设置setUp线程组解决这个问题。

4.设置token为全局变量

1.新建测试计划-》添加-》线程-》setUp线程组

2.把获取token的http请求放在setUp线程组里面

3.新增一个BeanShell后置处理器,放在正则表达式提取器后面,目的是拿到token后,把token设置成全局变量

java 复制代码
${__setProperty(GLOBAL_AUTH,${Auth},)}

把Auth设置成了全局变量GLOBAL_AUTH,那么怎么调用呢?

5.token作为全局变量调用

设置全局变量后,在其他线程组就不能${Auth}调用了,调用时需要用到P函数

java 复制代码
${__P(GLOBAL_AUTH,)}

我是放在消息头管理器调用的。

到此,已经完成了token调用。

把token单独放在setUp线程组里,这样每次执行测试时,只会在第一次调用,拿到token 给后面的接口使用。

但是会有另外一个问题,如果接口多、请求时间长,在测试的过程中token有可能会过期。怎么保证一直拿到有效的token呢?

6.如何保证token持续有效

目前我考虑的有3种情况,分别是知道token过期时间、知道token过期时长、啥也不知道。

1.如果token接口有返回过期时间

可以提取这个时间,通过前置处理器,如JSR223 预处理程序,判断过期时长剩余5分钟就触发刷新。 这个不适合我现在测这个流程,大概如下

java 复制代码
def now = System.currentTimeMillis() / 1000
def tokenExp = vars.get("token_exp") as Long
// 剩余时间小于5分钟就触发刷新
if (tokenExp == null || tokenExp - now < 300) {
    // 调用登录接口重新获取新Token
    sampler.setPath("/api/auth/login")
    sampler.setMethod("POST")
    sampler.addArgument("username", "test_user")
    sampler.addArgument("password", "test_pwd")
}

2.如果知道token过期时长

可以定时去调用,比如token是30分钟过期,那么就29分钟调用一次。可以结合固定定时器去做。

具体:

1.我之前已经用setUp获取过一次token了,开局还是需要它来获取的,这里保留不变。

2.需要再新增一个刷新线程组,线程数1,线程组的循环次数根据大概执行时间去判断,比如大概跑一晚上10个小时,10*60=600分钟 600/29大概循环21次。新的线程组循环次数就设置成20次。

3.把token请求全部复制到新的线程组里,什么都不用改。刷新线程组和Setup线程组使用完全相同的Token变量名,新获取的Token会自动覆盖旧变量,压测线程组后续请求自动读取最新Token。

4.token请求接口下添加一个固定定时器,token有效期30分钟,延时就设置29分钟。

这里主要是变量复用逻辑‌:刷新线程组和Setup线程组使用完全相同的Token变量名,新获取的Token会自动覆盖旧变量,压测线程组后续请求自动读取最新Token。就可以实现token一直有效了。

3.如果不了解token过期机制

token接口没有返回过期时间、也不知道有效时长,那么可以根据接口响应去判断。

当测试接口响应断言返回401,则重新调用token接口。结合循环控制器去做,把循环次数写成2或者3,避免进入死循环。

具体我还没想好怎么在上面的基础上调用。测试过程中很少有不知道token过期时长的,理论上第二种情况就可以解决大部分场景。如果后面真遇到了我再更新上来。

以上是我对token调用的一些思考和方法。

相关推荐
qq_4017004137 分钟前
Qt QUrl 详解与代码示例
开发语言·数据库·qt
程序员阿鹏1 小时前
如何实现MySQL分库分表?
数据结构·数据库·sql·mysql·缓存
风哥2号1 小时前
数据库教程FGMT33‑MySQL主从复制项目实施与维护06(MySQL8.4/9.7 MGR组复制)
数据库·mysql
liangsheng_g2 小时前
Spring事务传播行为分派与挂起恢复源码实战
数据库·sql·spring
蓝速科技2 小时前
信创终端 POC 测试实战与选型避坑指南丨蓝速科技
运维·数据库·人工智能·科技·自然语言处理
风哥2号2 小时前
数据库教程FGMT29‑Linux平台MySQL5.7安装配置与管理入门
数据库
杨云龙UP3 小时前
MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决
linux·运维·网络·数据库·sql·mysql·登录失败
这个DBA有点耶4 小时前
数据库数据同步解决方案怎么选?6款主流工具横向对比与信创选型指南
数据库·架构·dba
刃神太酷啦4 小时前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
小雷信息医学4 小时前
不会写复杂代码也能发 SCI?手把手教你用 InSpireR 交互系统一键提取、合并与导出临床科研宽表【第三章】
数据库