我们知道,在Jmeter中做性能测试的时候,常常会把身份验证的参数(如:token)设置成全局变量,然后供http信息头管理器引用,这样就可以达到一个效果:不用在每个需要身份校验的接口设置token了(因为绝大多数项目token都是放在header中带过去)。但是我今天却发现了一个全局变量的坑,请看下面(个别图中的具体步骤不在这里说明,百度教程很多~):
1.如图1,在【登录】接口下用正则表达式提取器提取token,并用Bean Shell取样器设置成全局变量,然后放在http信息头管理器中引用:Authorization=${__P(newToken)} PS:注意我设置的缺省值是空值(空字符串)。

2.如图2,执行一次脚本,在察看结果树中看到【登录】接口的Authorization是空值(因为我在第1步设置过缺省值为空),并登录成功

3.如图3,执行第二次脚本(这里每次执行完不清空结果树),在察看结果树看到【登录】接口的Authorization是一串token值,此时登录失败(因为我们后台没有对登录接口做例外处理,Authorization不为空会身份校验)。这下奇怪了,我不是明明设置过缺省值吗?为什么呢?继续看下面

4.如图4,执行第三次脚本,咦?Authorization又为空,此时登录成功,是不是很奇怪?(成功与失败交替出现,即变量token空值与正确的值交替出现)

现在我们来分析大概原因:我们这个Request Headers中的Authorization值来源于http信息头管理器,而后者的值来源于全局变量token,而全局变量token又来源于正则提取器,正则提取器肯定没有问题(因为图3中确实有token值),那问题就只能出在全局变量了。
根据具体的每次执行脚本情况来分析:第一次执行脚本没有问题,【登录】成功【获取用户信息】也成功;第二次,登录失败,而【登录】接口却拿到了token,而这个token值正好是第一步提取出来的,到这里,我已经有了一个初步判断:第一次执行脚本后全局变量token没有清空。继续,执行完第二次后,登录失败,肯定提取不到token,那么此时全局变量赋值空值;为了验证我的猜想,执行第三次脚本,没错登录成功,此时Request Headers中的Authorization为空值。
结论:在Jmeter中,全局变量在每次执行完脚本后不会自动清空(或者初始化)。
虽然我发现了这个Jmeter坑,但是我还没有想到很好的办法怎么解决,如果有哪位大佬知道怎么解决,请评论留言,不胜感激!