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请求对应的地方可以不填,就可以只改这一个地方,下面所有的都改啦!

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
JMeter 中,线程传递 token 是一个常见的需求。由于每个线程JMeter 中是相互独立的,它们之间默认无法直接共享变量或数据。 一种解决方案是使用 JMeter 的属性文件来传递 token。你可以在一个线程中生成 token,并将其保存到属性文件中。然后,在另一个线程中,你可以通过读取属性文件来获得这个 token。 以下是一个简单的步骤来实现这个过程: 1. 在生成 token线程中,添加一个 BeanShell PreProcessor 到生成 token 的请求之前的步骤中。在该 BeanShell PreProcessor 中,你可以使用以下代码生成并保存 token 到属性文件中: ``` props.put("token", "your_token_value"); props.save("path/to/your/property/file.jtl"); ``` 确保将 `"your_token_value"` 替换为你实际的 token ,将 `"path/to/your/property/file.jtl"` 替换为你想要保存属性文件的路径。 2. 在需要使用 token线程中,添加一个 BeanShell PreProcessor 到使用 token 的请求之前的步骤中。在该 BeanShell PreProcessor 中,你可以使用以下代码读取属性文件中的 token : ``` props.load("path/to/your/property/file.jtl"); String token = props.getProperty("token"); vars.put("token", token); ``` 确保将 `"path/to/your/property/file.jtl"` 替换为之前保存属性文件的路径。 3. 现在,你可以在你的请求中使用 `${token}` 变量,它将被替换为正确的 token 。 通过这种方式,你可以在不同的线程之间传递 token。当一个线程生成 token 并将其保存到属性文件中时,另一个线程可以读取属性文件并使用这个 token

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值