WHCSRL 技术网

Set global variables in Jmeter to realize cross-thread group parameter transfer

工作中的应用场景:
A 线程组中的输出是 B 线程组中的输入。如果B线程要引用A线程的变量,就必须设置一个全局变量。比如你想在A接口中得到它返回的某个值(一般是登陆后的token),这时候你想在B中引用它,就需要将它设置为全局变量,同样在其他线程组可以使用。

想法:

1.使用正则表达式或者json提取器提取A线程组中要传递的参数,

2.使用函数 setProperty 将其导入到 BeanShell 后处理(或 BeanShell 处理器)中

3.在B线程组中,使用属性函数(或P函数)来引用从A线程组传过来的参数

1.我想获取界面返回的“title”:“鱿鱼游戏”的id值(这里是这个title对应的其他字段的值)

此时可以使用JSON提取器,设置如下:

解释JSON提取器中参数的含义:

创建的变量名:接收值的变量名,使用多个变量时用分号隔开
json路径:json路径表达式,也用分号隔开
匹配编号:0随机; n 取前几个匹配值; -1 匹配所有,后续引用使用变量名 _N 取第 N 个值。
默认值:默认值,当匹配失败时取值
示例中的值:

创建的变量名称:ID

json 路径:$..[?(@.title=='Squid game')].["id"]

匹配号:1

2.将获取到的变量值通过setProperty函数通过BeanShell后处理(或BeanShell处理器)传递到公共空间。

Ctrl+shift+f1快捷键打开功能助手或点击="10"

找到 setProperty 函数:

接下来设置生成的函数值:${__setProperty(newID,${ID},error)}

在1.BeanShell的后处理程序中的Script中添加:

2.也可以添加到BeanShell采样器的脚本中:

其实后来熟悉了,还是记得上面BeanShell后处理(或BeanShell处理器)中添加的函数setProperty的值:

${__setProperty(全局变量名,${线程组A获取的变量值},错误)}

三、使用属性函数(或P函数)在第二节中引入全局变量

1.也去功能助手找属性功能:

复制的函数的值会在B线程组中引用:

2. 或者使用P函数

复制的函数的值会在B线程组中引用:

熟悉了这两个功能就可以直接使用,不用使用功能助手:

1.${__property(全局变量名,,错误)}}

2.${__P(newID,)}

四个。备注

1.因为这是获取属性值“title”:它在“鱿鱼游戏”时的id值,所以json提取器中的表达式是这样使用的:

$..[?(@.title=='鱿鱼游戏')].["id"],

如果只是为了获取“title”:“Squid Game”,Squid Game的价值-----$.subjects.[1].title

我们怎么知道我们写的json提取器方法是否正确?可以在jmeter的响应中使用JSON Path Tester自带的工具,写成下图,点击Test。

2.之前解释JSON提取器中的参数解释时:

match no: 0 是随机的; n 取匹配值的数量; -1 匹配所有,后续引用使用变量 name_N 取第 N 个值。

例如设置如下:

创建的变量名称:title

json 路径:$.subjects.*.title

匹配号:-1

其中,$.subjects.*.title 获取所有的title值,表示有多个值:

宽度

此时如果只想使用数组组中的第二个值,即"title":"鱿鱼游戏",

那么在需要用到这个变量的地方:title_2,就可以

推荐阅读