JMeter中如何实现跨线程组关联
在做压力测试的时候常常会遇见一个场景,想要测试的接口需要登录接口返回的token做参数,或者需要其它接口的认证信息,通常能想到的就是正则表达式提取器,把需要的参数提取出来,传递到另一个HTTP请求中。
如果有多个线程组的情况下,需要每个线程组中都要有登陆请求,这不符合我们的规范,最理想状态就是获取token的接口只请求一次。然后登陆的认证信息,在JMeter测试脚本中的所有接口请求中都可以使用。
这样就实现了跨线程组传递参数,这使得接口之间的关联更加灵活。
所以:什么是跨线程组关联呢?就是在不同线程组之间实现参数传递。
1、JMeter中实现跨线程组关联说明
(1)JMeter中实现跨线程组关联步骤
- 先进行登陆请求。
- 记录登陆请求返回的Cookie,或者有关登录状态的token信息。
如果是Cookie,就用HTTP Cookie管理器获取。
如果是token,就用提取器进行提取。 - 然后通过函数助手中的
__setProperty
函数,把Cookie值升级为JMeter的全局属性,就可以在线程组和线程组之间共享了。 - 然后从另一个线程组中通过
__property
函数,获取全局数据。 - 然后把获取的Cookie或token,加入到查看购物车请求中,保持用户登陆状态。
如果是Cookie,就用添加到HTTP信息头管理器组件中。
如果是token,就添加到请求的参数中。 - 执行脚本,查看运行结果。
Jmeter高级性能测试实战https://edu.csdn.net/course/detail/35834
(2)测试计划内包含的元件
添加元件操作步骤:
- 创建测试计划。
- 创建线程组:
选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组
。 - 在线程组中,添加配置元件
HTTP Cookie管理器
组件:选中“线程组”右键 —> 添加 —> 配置元件 —> HTTP Cookie管理器
。 - 在线程组中,添加取样器“HTTP请求”组件:
选中“线程组”右键 —> 添加 —> 取样器 —> HTTP请求
。 - 在线程组中,添加取样器“BeanShell 取样器”组件:
选中“线程组”右键 —> 添加 —> 取样器 —> BeanShell 取样器BeanShell 取样器
。 - 在线程组中,添加配置元件“HTTP信息头管理器”组件:
选中“线程组”右键 —> 添加 —> 配置元件 —> HTTP信息头管理器
。 - 在线程组中,添加监听器“察看结果树”组件:
选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树
。
提示:需要重复添加的组件这里不重复描述。
最终测试计划中的元件如下:
点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。
2、用户登陆请求的相关操作
(1)进行登陆操作获取Cookie信息
请求登陆操作界面如下:
通过添加HTTP Cookie管理器组件,会把服务器返回来的Cookie信息,默认存储到线程变量中。
前提:
jmeter.properties
文件中,设置CookieManager.save.cookies=true
。
然后我们可以通过Debug Sampler
(调试取样器)组件,查看到线程变量中的Cookie数据。
如下图所示:
说明:保持用户登陆状态的Cookie数据为:
COOKIE_ECS_ID=daf59ab57d42c0cee3596feb7ad17ff576403601
这样我们就找到Cookie的值了。
(2)把Cookie数据提升为JMeter的全局属性
我们需要通过__setProperty
函数,把Cookie数据提升为JMeter的全局属性。这样该Cookie就可以在JMeter脚本中,所有线程组里都可以使用了。(也就是可以在线程组和线程组之间通信)
接下来点击:工具 —> 函数助手对话框,打开函数助手。(之前的版本在选项中)
然后选择__setProperty
函数。
第一行填写:填写升级为全局属性后的变量名。(自定义即可)
第二行填写:定义全局属性的值。(我们就把Cookie属性的值,引用到这里)
Return Original Value of property (default false)?
:返回属性的原始值(默认为 false),默认即可。
编写完成如下图所示:
3、查看用户购物车请求的相关操作
(1)查看用户购物车请求内容
标准的Get请求,填写请求的基本信息即可。
如下图所示:
提示:在
The result of the function is
中看到对应的内容,表示函数生成成功。
(3)HTTP信息头管理器内容
我们需要把上一步获取到的Cookie信息,放入查询购物车的请求中。
因为是Cookie的相关数据,只能放在请求头的信息中。(如果要是token,就放在请求的参数中)
编辑界面如下
这样查看购物车请求,就带有用户的登陆状态了。
(4)设置线程组的启动时间
因为我们需要等待前面的登陆线程组执行完成后,在进行查看购物的请求,否则将获取不到我们需要的Cookie信息。
这时候就需要设置线程组元件界面中的调度器属性了。
我们把持续时间和启动延迟都设置成3,表示JMeter脚本启动3秒后,再执行查看购物线程组中的内容,并持续3秒钟。
如下图所示:
调度器配置(Scheduler Configuration)说明:
- 持续时间(秒):如果选择了调度程序复选框,控制测试执行的持续时间,以秒为单位。
- 启动延迟(秒):如果选择了调度程序复选框,控制测试在多久后启动执行,以秒为单位。
4、运行结果说明
我们先来看一下,没有进行跨线程相关设置请求的结果。
如下图所示:可以看到购物车中没有任何的数据
我们再来看一下,进行跨线程设置请求的结果。
如下图所示:可以看到该用户购物车中的信息了。
再来看看查看购物车请求的内容,可以看到请求带有Cookie信息。
如下图所示:
以上就完成了,在JMeter中实现跨线程组关联操作的演示。
5、拓展说明(也很重点)
如上需求,在进行性能测试的时候,我们要保证登陆请求线程组中,所有用户登陆的Cookie或token都保存好,才能进入到下一个线程组中执行其他的跨域关联请求。
这样就会有两种实现方式:
- 像本篇文章一样,把需要关联的数据提升到全局属性。
但是这种方式只能适用于单线程跨域关联,如果是很多用户并发进行跨域关联,该种方式只是把最后一个登陆请求的Cookie或token进行了提升。所以下一个线程组中使用的登陆状态,都是登陆线程组最后一个人的请求状态。 - 第二种方式,把登陆请求中的Cookie或token信息,提取出来并保存到一个文件中。然后在其他关联跨域请求中,使用参数化的方式,把用户登陆的Cookie或token信息,传入到所需的请求中,从而实现跨域关联的操作。(推荐)
第二种方式实现步骤:
- 每一个接口放在一个线程组中。
- 把登陆接口的返回Cookie数据,写入到
.csv
文件中。 - jmeter写
.csv
文件,使用BeanShell。取样器添加后置处理器BeanShell postprocessor
。 - 在下一个跨域关联接口使用数据,用参数化的方式导入
.csv
文件。
只提供BeanShell中的数据存储代码(简单示例)
Jmeter高级性能测试实战https://edu.csdn.net/course/detail/35834
JMeter中如何实现跨线程组关联相关推荐
- jmeter跨线程组传值
在测试过程中,有时候需要jmeter跨线程组传值,jmeter本身又不具备此功能,那么,又该如何实现呢? 其实,我们可以通过BeanShell去实现. 实现过程如下: 1.线程组A中,使用正则表达式提 ...
- Jmeter之Bean shell使用(四)——跨线程组之间的全局参数传递
使用场景: 请求API需要授权令牌,但是授权令牌只需要获取一次,即可调用服务器上其他业务接口. 所以我想要把授权操作放在单独的一个线程,业务流放在其他线程. 这就需要我把从授权线程获取的令牌传入业务流 ...
- jmeter跨线程组传多个值_Jmeter 跨线程组传递参数 之两种方法(转)
终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...
- Jmeter跨线程组传递参数
jmeter的线程组之间是相互独立的,各个线程组互不影响,所以线程组A中输出的参数,是无法直接在线程组B和线程组C中被调用的. 但是有时为了方便管理,我们可能是把各个接口单独存放在不同的线程组中.拿t ...
- Jmeter操作之跨线程组传递参数
思路:将某一线程组内的变量通过"__setProperty"函数设置成jmeter的全局变量,在另一线程组中通过"__P"函数调用即可. 1.添加-后置处理器- ...
- jmeter全局变量传参_Jmeter 将正则表达式提取的参数传给全局(跨线程组使用变量)...
一.使用正则表达式提取sessionId 1.在测试计划(跨线程组使用变量)--> 线程组(登录)--> 添加HTTP请求(登录接口) (1)创建测试计划: 勾选独立运行每个线程组(例如在 ...
- jmeter多用户登录跨线程组操作传值
项目需求: 需要登录两个用户A.B,用户A操作完后会通知B,然后B再操作,B操作完结束或者再通知A. 实现思路: 1. 设置两个线程组Ⅰ.Ⅱ,组Ⅰ添加cookie管理器,里面添加用户A的操作:组Ⅱ添加 ...
- 接口测试工具-Jmeter使用笔记(九:跨线程组传递变量)
请求API需要授权令牌,但是授权令牌只需要获取一次,即可调用服务器上其他业务接口. 所以我想要把授权操作放在单独的一个线程,业务流放在其他线程. 这就需要我把从授权线程获取的令牌传入业务流线程. 解决 ...
- Jmeter跨线程组调用变量
1.正则表达式提取变量值 2.添加后置管理器 BeanShell PostProcessor,使用函数助手或直接按照格式输入 3.其它线程组调用变量 4.执行结果 5.注意:由于线程组是同时运行的,所 ...
最新文章
- 移动Web单页应用开发实践——页面结构化
- 跨域解决请求限制(script标签)(热门搜索出现对应的词条)
- java 自定义文件后缀名_Java 的源代码文件的扩展名是( )。_学小易找答案
- OC基础之访问修饰符
- 【bfs】极其简单的最短路问题
- 自动驾驶技术(1)--控制工程篇概述
- 炸裂!跑P站上教微积分,年入170w...
- 计算机二级报名省市,计算机二级报名通知:全国19省市报名时间及考试安排!...
- CCS 软件使用经验四则
- 微信小程序如何实现登陆功能
- 牵手爱情,绎一份不了情缘
- [paper]DeepFool: a simple and accurate method to fool deep neural networks
- Dojo1.11官方教程文档翻译(3.4)Dojo特效
- 嗨起来,让你在社交圈里有聊不完的话题
- 猴子定律--如何跳出你深陷的棋局看趋势
- 体验华为操作系统 openEuler 20.03 LTS linux
- 渗透测试之攻击Windows认证
- 关于DEJA_VU3D - Cesium功能集专栏说明
- 细说inchat系统客户端开发之路
- MySQL多表查询练习2
热门文章
- qt添加qwt帮助文件_qt creator中使用qwt插件
- 双向板课设按照弹性计算_T004 结构专业施工图技术问答结构布置与计算
- 管理站点复制 【Windows Server 2019】活动目录(Acitve Directory)——在同一区域安装多台域控制器
- 关联 VMware 产品的内部版本号和版本 (1014508)
- Java基础学习总结(77)——Java枚举再总结
- android log 码率,webrtc之Android视频质量提升:保帧率降码率
- lwip路由实现_TCP超时与重传《LwIP协议栈源码详解——TCP/IP协议的实现》
- 常用linux命令及图解(实践文档,小白都可以看得懂)
- 实验楼第三次实验报告
- Nginx 部署 Django