jmeter参数传递三种方法
参数的传递分为线程组内和多个线程组之间的传递,因为每个线程组之间是独立的,所以多个线程组之间的传递需要用到beashell后置处理器将提取的参数设置为全局变量。1、线程组内传递:正则表达式、json提取器①正则表达式:接口示例接口A:输入用户名,密码创建用户,返回新增用户id接口B:输入用户id,用户名,密码等信息实现编辑用户(B接口基于A接口返回的新增用户id实现数据修改)正则表达式提取器正则表
参数的传递分为线程组内和多个线程组之间的传递,因为每个线程组之间是独立的,所以多个线程组之间的传递需要用到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
更多推荐
所有评论(0)