简介
Jmeter的参数传递从线程组的维度分为线程组内和多个线程组之间的传递,因为每个线程组之间是独立运行的,所以多个线程组之间传递需要用到beashell后置处理器将提取的参数设置为全局变量。
适用场景
当我们在做接口测试或功能测试的时候,需要获取登录接口的token才能继续访问其他接口,或者接口之间有数据依赖关系,比如接口B的输入需要依赖接口A的返回字段。
参数传递分类
线程内参数传递
线程组内的参数传递可以通过正则表达式提取器和json提取器。
正则表达式提取器
此元素将在其作用域中的 请求之后执行,应用正则表达式、提取请求的值、生成模板字符串并将结果存储到给定的变量名称中。
组件说明:
● 引用名称:存储匹配结果的变量名称,可以是一个值也可以是一组值
● 正则表达式:匹配内容的正则表达式,正则表达式里面可以有多个正则
● 模板:正则表达式提取器类型,样式为:
n
n
n,模板可自由组合,拼接组成新的字符串内容。
- 模板为 0 0 0,则为整个表达式匹配到的内容;
- 模板为: 1 1 1,则对应正则表达式中的第一个小括号内()匹配的内容;
- 模板为 2 2 2,则对应正则表达式中的第二个小括号()匹配的内容;
- 模板为 1 1 1 2 2 2,则把2个()所匹配的内容拼接起来, 1 1 1aa 2 2 2拼接两个变量的内容,并在中间加上aa ● 匹配数字:-1代表取全部数据,0代表随机取值,1代表取第1个数据,2代表取第2个数据,正数N代表取第N个 ● 缺省值:找不到匹配时的值
json提取器
JSON 后处理器使用 JSON PATH 语法从 JSON 响应中提取数据。此后处理器与正则表达式提取器非常相似。它必须作为 HTTP 采样器或任何其他具有响应的采样器的子级。
组件说明
● 变量名:存储提取的变量名字
● Json Path Expressions:Json Path 表达式,返回匹配的结果
● Match Numbers: 匹配的数量,如果json路径返回多个结果:0代表随机获取;1代表获取第1个数据;N代表第N个结果,如果N大于匹配数,使用默认值;-1代表获取所有数据
● Compute concatenation var (suffix_ALL):是否统计所有,即将匹配到的所有值保存为变量_ALL。
● Default Values: 没有匹配值时的提示信息
Json Extractor 提取到的值会存储在变量里,使用方法和普通变量一样,通过${}引用Json Extractor 的变量即可。Json Extractor存储的变量名是基于提取器中变量名称扩展的,建议通过添加DebugSampler获取Json Extractor实际存储值的变量名。
示例
1、设置变量名、Json Path 表达式
2、同线程组内添加新的http请求,设置参数变量
login_name的取值设置为json提取器提取的变量
3、执行测试计划,查看结果树
多线程组之间参数传递
BeanShell后置处理器
线程组之间的参数传递需要额外用到BeanShell后置处理器。
后置处理器在采样器后应用,它们应用于同一作用域中的所有采样器,为了确保后处理器仅应用于特定采样器,需要将其添加为采样器的子级。
后置处理器整体思路和我们写代码差不多,即:
1.提取需要获取的字段
2.把它赋值给一个变量a,为了在其他线程组也能获取到这个变量
3.如果后续接口需要用到该变量,直接引用这个变量a
Beanshell传参方式
1、内置变量vars和props
⚠️:
vars 只能在当前线程内使用,props 可以跨线程组使用;
vars 只能保存 String 或者 Object,props 是 Hashtable 对象。
//同线程组
vars :操作 jmeter 变量,它是测试用例与 BeanShell 交互的桥梁,常用方法:
vars.get(String key):从jmeter 中获得变量值
vars.put(String key,String value):数据存到 jmeter 变量
//跨线程组
props :操作 jmeter 属性,该变量引用了 JMeter 的配置信息,可以获取Jmeter
的属性,它的使用方法与 vars 类似,但是只能 put 进去 String 类型的值,而不能是一个对象。
props.get("START.HMS");START.HMS 为属性名,在jmeter.properties 中定义
props.put("key","value");
//beanshell语句示例
String str =vars.get("token");
props.put("newToken",str);
vars和props都有put和get方法 ,但是由于我们要操作的是跨线程组的,所以只能使用props进行put值。
2、函数
//跨线程组设置变量,注意此处的key不要写成“key”
${__setProperty(key,value)}
//跨线程组引用变量
${__P(key)}//只需要变量名就可以
${__P(变量名)} 基本等同于${__property(变量名)}
示例:
${__property(init,start,10)} 变量名为init, 默认值为10,同时会将10默认传给start这个变量,start可进行再使用 ${start}
P和property的区别就是是否将第一个变量的值存储到另外一个变量中
示例
1、添加后置处理器
2、编写beanshell脚本,传递参数
3、添加用户管理线程组,添加更新用户http请求
4、引用全局变量
设置接口入参"token"的取值为后置处理器处理的变量userName
5、执行测试计划,查看结果树
版权归原作者 啾啾测试录 所有, 如有侵权,请联系我们删除。