Jmeter 跨线程组动态获取token
Jmeter,测试性能的王者!(好吧,只是我最近用到,具体有没有别的更好的工具我也不知道)
在Jmeter中可以设置线程组来测试接口的并发效果balabala的,在实际项目中接口调用基本上都是需要使用token进行身份认证的。如果测试每个接口都单独登录获取token真的很麻烦呀!
获取token
创建setUp线程组
因为登录是最先发生的一个动作,所以这里把登录接口放在setUp线程组中,这样每次执行一个测试计划都会先去执行登录的动作获取token。
右键测试计划,添加线程组(用户),选择setUp线程组,右键新加的这个线程组,添加取样器-http请求如下:(红色方框中的具体参数按照自己项目中的填写)
创建提取器提取token(JSON提取器&正则表达式提取器)
根据登录接口返回的信息,试图提取到里面的token字段的值,所以想到了匹配(这不是废话嘛)我们项目的登录接口返回的消息体格式如下:
{
"resultData":{
"loginDate":"2021-09-10 10:55:09",
"userName":"Admin",
"token":"xxxxxxxxx",
"loginName":"Admin"
}
}
分析 (看)了一下上述消息体,发现是JSON格式的(真机智)
于是我第一反应肯定是想到了Jmeter有没有什么能够直接提取到JSON里字符串的内容的,比如:resultData.token
有
JSON提取器
在上一步中的登录http请求上右键,选择添加后置处理器-JSON提取器:
如下图:
红框中的几个参数:
-
Names of created variables:设置的参数名称,相当于变量名,后续其他地方使用
${name}
引用该参数 -
JSON Path expressions:可以匹配到想要字段值得JSON表达式,JSON第一层元素的值使用
$.key
匹配,如:$.resultData
JSON第二层的元素值继续使用
.key
匹配:$.resultData.token
注:
1.JSON提取器还可以提取多个参数,使用;
分隔即可
2.JSON提取器还可以提取JSON中的列表中的元素,使用$.key[0]
类似这种即可 -
Match No.(0 for Random):匹配数字,0代表随机匹配,1代表匹配第一个结果,-1代表匹配所有结果
-
Default values:未匹配到时参数的默认值,可以选择
null
注:默认值上一个我个人没用到哈,不讲了(其实是不太知道)
正则表达式提取器
如果你的返回值不是JSON,也可以使用正则表达式提取器,创建方法和JSON提取器一样,就不多说了。建好之后如图:
看得出来,参数也和JSON差不多,只是JSON Path Expressions变成了正则表达式,在这里填入相应的正则表达式即可。(不要问为什么我不举例了,因为我正则表达式玩的不溜,每次都要百度)
将token设置为全局变量
上述步骤之后,我们已经将token放入${token}
变量中啦,但是这时候的${token}
仅仅是一个局部变量,在登录这个线程组运行结束之后他就消失啦,如果你将其他接口的http请求放在该线程组之下的话呢,那你就可以直接使用了(不推荐,毕竟测试其他接口线程数一般设置为多个,但其实登录一次就够了)
所以这里一般将其他接口请求放在另一个线程组,可以自由设置自己的线程数了。
那么我们在登录请求右键添加一个后置处理器-BeanShell PostProcessor:
添加好之后,红方框中参数需要填写之前我们设置的参数名称:${token}
脚本中填写:${__setProperty(newtoken,${token},)}
,(别忘了后面有个逗号)将token
值赋给newtoken
,在其他线程组中可以使用newtoken
这个变量名
使用token
在其他线程组的http请求下,添加配置元件-Http信息头管理器,众所周知,信息头管理器就是管理请求的header的,所以token等内容放在这里:
Content-Type:不用介绍了吧?- 认证头:key值可以去自己项目前端按F12去看,有很多种:
value值填
${__P(newtoken,)}
,(别忘了后面有个逗号)
好了!然后执行你的测试计划就可以~
废话一句
有时候项目有不同的环境,想测试不同环境的接口们,但不想每个接口都去改服务器地址之类的信息,可以在最顶层的测试计划下添加一个配置元件-HTTP请求默认值:
填好协议、服务器名称或IP以及端口号,然后下面的所有接口下http请求对应的地方可以不填,就可以只改这一个地方,下面所有的都改啦!