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调用的一些思考和方法。

相关推荐
G.O.G.O.G2 小时前
LeetCode SQL 从入门到精通(MySQL)05(下)
数据库·sql·oracle
其实防守也摸鱼2 小时前
运维--安全与数据库
网络·数据库·学习·安全·安全威胁分析·数据库架构·软件安全
Rsun045513 小时前
MySQL 中什么是回表?
数据库·mysql
余防3 小时前
jmeter-接口测试
jmeter
Sylvia33.3 小时前
足球数据接口开发实战:如何用火星数据API盘活赛事应用
java·服务器·开发语言·数据库·python
ruleslol4 小时前
Mybatis11-不同的数据库连接池的配置
数据库·mybatis
苏州邦恩精密4 小时前
蔡司3D扫描仪厂家如何应用于航空航天制造
大数据·数据库·人工智能·3d·自动化·制造
alxraves4 小时前
医院远程会诊系统:数据库模块设计与实现
数据库·oracle
吴声子夜歌4 小时前
Redis 3.x——事务与Lua
redis·lua
wordpress资料库4 小时前
WordPress数据表前缀的修改方法(完整版)
数据库·wordpress数据表前缀·wordpress修改前缀