做接口测试的时候,关于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调用的一些思考和方法。