在Jmeter中设置全局变量,实现跨线程组传参
Posted 陪你看渔舟唱晚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Jmeter中设置全局变量,实现跨线程组传参相关的知识,希望对你有一定的参考价值。
工作中应用场景:
A线程组里面的一个输出,是B线程组里面的一个输入,如果B线程想引用A线程的变量,就必须设置全局变量。例如你想在A接口中拿到它返回的某个值(常用的就是登陆后的token),此时你想在B中引用它,就需要将它设置成全局变量,在其他线程组中也可以用。
想法:
1.使用正则表达式或者json提取器,在A线程组中提取到你想要传递的参数,
2.使用函数setProperty将其导入到BeanShell后置处理(或者BeanShell处理器)
3.在B线程组中,使用property函数(或者P函数)去引用从A线程组中传递来的参数
一、我想拿到接口返回的 "title": "鱿鱼游戏"时它的id值(这里是要取这个title对应的其它字段的值)
此时可以使用JSON提取器,设置的内容如下:
解释一下JSON提取器里面的参数意思:
names of created variables :接收值的变量名,多个变量时用分号分隔
json path:json path表达式,也是用分号分隔
match no:0随机;n取第几个匹配值;-1匹配所有,后续引用用 变量名_N 取第N个值。
default values:缺省值,匹配不到值的时候取该值
例子中的值:
names of created variables :ID
json path:$..[?(@.title=='鱿鱼游戏')].["id"]
match no:1
二.将获取到的变量值,通过setProperty函数将变量值通过BeanShell后置处理(或者BeanShell处理器)传递到公共空间去。
Ctrl+shift+f1快捷键打开函数助手或者点击
找到setProperty函数:
接着将所生成的函数值:${__setProperty(newID,${ID},error)}
添加到1.BeanShell 后置处理程序中的Script下:
2.也可以添加到BeanShell 取样器的脚本下:
其实后面熟悉了,或者记住了在上述的BeanShell后置处理(或者BeanShell处理器)中添加的函数setProperty的取值:
${__setProperty(全局变量名,${A线程组获取的变量值},error)}
三、使用property函数(或者P函数)将二中的全局变量引入
1.也是去函数助手中找到property函数:
将复制到的函数值,去到B线程组中去引用:
2.或者使用P函数
将复制到的函数值,去到B线程组中去引用:
后面熟练了这两个函数就可以直接使用,而不要通过函数助手:
1.${__property(全局变量名,,error)}}
2.${__P(newID,)}
四、备注
1.因为此次是为了获取这个属性值 "title": "鱿鱼游戏"时它的id值,所以json提取器中的表达式是使用:
$..[?(@.title=='鱿鱼游戏')].["id"],
如果只是为了获取"title": "鱿鱼游戏",鱿鱼游戏这个值-----$.subjects.[1].title
我们怎么知道自己写的json的提取器的方法对不对,可以使用jmeter在响应中自带的JSON Path Tester自带的工具,按下图写入,点击Test即可
2.之前在解释JSON提取器中的参数解释时:
match no:0随机;n取第几个匹配值;-1匹配所有,后续引用用 变量名_N 取第N个值。
例如设置如下:
names of created variables :title
json path:$.subjects.*.title
match no:-1
其中$.subjects.*.title,获取的是全部的title值,就代表它是有多个值:
此时你如果只想使用数组组中第二个值,即 "title": "鱿鱼游戏",
那么你在你所需要用到这个变量的地方:title_2,即可
以上是关于在Jmeter中设置全局变量,实现跨线程组传参的主要内容,如果未能解决你的问题,请参考以下文章