参数的传递分为线程组内和多个线程组之间的传递,因为每个线程组之间是独立的,所以多个线程组之间的传递需要用到beashell后置处理器将提取的参数设置为全局变量。
1、线程组内传递:正则表达式、json提取器
①正则表达式:
接口示例

接口A:输入用户名,密码创建用户,返回新增用户id

接口B:输入用户id,用户名,密码等信息实现编辑用户(B接口基于A接口返回的新增用户id实现数据修改)

正则表达式提取器

正则表达式提取器是一种后置处理器,它可以通过正则的方式提取请求中的响应数据,Jmeter的正则表达式提取器有如下选项

引用名称:存储匹配结果的变量名称,可以是一个值也可以是一组值

正则表达式:匹配的正则表达式,正则表达式里面可以有多个正则

正则贪婪模式和非贪婪模式匹配:贪婪模式会尽可能多的匹配内容,非贪婪模式会尽可能少的匹配内容,贪婪模式和非贪婪模式的区别是在正则匹配后是否有?

模板:正则表达式提取器类型,样式为: 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个数据

缺省值:找不到匹配时的值

正则表达式提取实例

获取接口A的响应报文
在这里插入图片描述
基于Jmeter正则表达式提取器编写如下所示后置处理器,提取出响应报文的id
在这里插入图片描述
通过debugSampler查看变量的提取结果
在这里插入图片描述
在接口B(修改用户)中使用接口A返回(新增用户)的参数
在这里插入图片描述
②Json提取器

Json提取器是一种后置处理器,它可以通过解析Json报文的方式提取请求中的响应数据,Jmeter的Json提取器有如下选项

变量名:存储提取的变量名字

Json Path Expressions:Json Path 表达式

Match Numbers: 匹配的数量,0代表随机获取,1代表获取第1个数据,-1代表获取所有数据

Compute concatenation var (suffix_ALL):是否统计所有,即将匹配到的所有值保存为变量_ALL。

Default Values: 没有匹配值时的提示信息

Json Extractor 提取到的值会存储在变量里,使用方法和普通变量一样,通过${}引用Json Extractor 的变量即可。Json Extractor存储的变量名是基于提取器中变量名称扩展的,建议通过添加DebugSampler获取Json Extractor实际存储值的变量名。

Json提取器实例

获取接口A的响应报文
在这里插入图片描述
基于Jmeter Json提取器编写如下所示后置处理器,提取出响应报文的id
在这里插入图片描述
通过debugSampler查看变量的提取结果
在这里插入图片描述
在接口B(修改用户)中使用接口A返回(新增用户)的参数
在这里插入图片描述
2、多线程之间传递
踩坑:首先测试计划里运行顺序切换为:独立运行
在这里插入图片描述

第一步,先获取到要跨线程组传递的参数值。新增一个正则表达式提取器
在这里插入图片描述
提取需要获取的值
在这里插入图片描述
第二步,把获取的值进行设值。主要是为了在其他线程组中可以获取到该参数值。

第三步,获取设置的值,在其他线程组进行使用。

新建BeanShell后置处理器:BeanShell PostProcessor
在这里插入图片描述
方法一:使用__setProperty函数进行设置全局变量,该函数使用方法:

设置值:${__setProperty(key,value)}; #此处的key不需要写成“key”

获取值:${__P(“key”)};

KaTeX parse error: Expected group after '_' at position 2: {_̲_P(变量名)} 基本等同于{__property(变量名)}

${__P(init,2)} , ${__property(init,start,200)}

可以自行定义变量名称,及变量的默认值

P 变量名为init, 值为2 ,使用的时候直接${__P(init,2)}就可以,改变量的结果为2

${__property(init,start,200)} 变量名为init, 默认值为200,同时会将200默认传给start这个变量,start可进行再使用 ${start}

P和property的区别就是是否将第一个变量的值存储到另外一个变量中

设置值:
在这里插入图片描述
获取值:
在这里插入图片描述
方法二:

设置值:使用vars和props,props 和 vars 主要有两点区别:

1.vars 只能在当前线程内使用,props 可以跨线程组使用
2.vars 只能保存 String 或者 Object,props 是 Hashtable 对象

使用方法:

设置值:vars.put(“key”,“value”)

获取值:vars.get(“key”,“value”)

vars和props都有put和get方法 ,但是由于我们要操作的是跨线程组的,所以只能使用props进行put值。

设置值:
在这里插入图片描述
获取值:
在这里插入图片描述
测试结果:
在这里插入图片描述
注:在第二个线程组中,我使用的是 BeanShell前置处理器BeanShell PreProcessor进行的取值,获取到值后,可以使用vars函数进行设置值,在HTTP request 中使用。
在这里插入图片描述
在这里插入图片描述
测试结果:
在这里插入图片描述
附、Bean Shell常用内置变量
log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);
ctx:该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext。
vars - (JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:
a) vars.get(String key):从jmeter中获得变量值
b) vars.put(String key,String value):数据存到jmeter变量中
props - (JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
 a) props.get(“START.HMS”);  注:START.HMS为属性名,在文件jmeter.properties中定义
 b) props.put(“PROP1”,“1234”);
prev - (SampleResult):获取前面的sample返回的信息,常用方法:
a) getResponseDataAsString():获取响应信息
b) getResponseCode() :获取响应code
sampler - (Sampler):gives access to the current sampler
更多方法可参考:org.apache.jmeter.samplers.SampleResult

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐