Jmeter—正则表达式提取器
重定向时会产生主请求和子请求,主请求和最后一个子请求的值是一样的。
Jmeter Variable Name to use,有时候有些变量需要使用多次正则提取才能获取,下面举例说明:
新创建一个test plan,添加一个线程组,在线程组下面添加一个Java request:
java request将下面的Json数据添加到java request的ResultData中:
{"name":"yangyang",
"data":
{"student":[ {
"name":"明",
"sex":"男",
"email":"zhangguoli@123.com",
"url":"./img/1.jpg"
},
{
"name":"铁林",
"sex":"男",
"email":"zhangtieli@123.com",
"url":"./img/2.jpg"
}],
"teacher":[{
"name":"邓",
"sex":"女",
"email":"zhenjie@123.com",
"url":"./img/3.jpg"
},
{
"name":"默",
"sex":"男",
"email":"zhangguoli@123.com",
"url":"./img/4.jpg"
}]
}}
request data在线程组下面添加Debug Sampler和View Results Tree:
bedug sampler运行request,可以在View Result Tree中看到返回的json字符串:
在Java request下面添加2个正则表达式提取器,来提取student的名字列表:
regular Expression Extractor第一个regular expression extractor用于提取student的所有信息的字符串:
获取student所有信息的字符串可以在View Results Tree中调试正则表达式,看是否能匹配到想要的字符串:
第二个regular expression extractor用于提取student名字,这里要用到第一个正则提取器的结果变量student_info_list:
再次运行request,在debug sampler中能看到提取的学生名字:
正则提取器的结果是这3个参数共同决定的:正则去找,模版去拼接,匹配数字去指定要哪些数据。
当需要从返回值中一次提取多个参数时,可以参看下列例子:
添加线程组,2个java request,第一个request下添加regular expression extractor,Debug sampler, View Results tree。
第一个Java request中添加ResultData:a1b甲c a2b乙c a3b丙c a4b丁c。regular expression extractor中的正则表达式为a(.*?)b(.*?)c,template为$1$,Match NO为默认值0,会随机从匹配结果中挑选一个值赋值给变量:
运行request,可以在debug sampler中看到匹配的结果,
param=3 //匹配结果 $1$
param_g=2 //匹配参数的个数
param_g0=a3b丙c //符合正则的字符串
param_g1=3 //第一个匹配结果$1$,也就是第一个小号中的值
param_g2=丙 //第二个匹配结果$2$,也就是第二个小号中的值
修改第二个java request的Name为:
Java Request {"name":"${param_g2}", "value":"${param_g1}"}
多次运行request,可在View Results Tree中看到第二个java request
的name是用前一个java request中提取的变量随机组成的:
也可在正则提取器中先使用{"name":"$1$", "value":"$2$}"}拼接好后面需要的参数,第二个request直接写成Java Request ${param}使用这个参数即可。
当匹配次数填写-1时,会返回一个list,可以添加foreach来遍历返回结果中的所有值:
如果查看debug sampler,可以看到返回的数组:
还可以使用计数器来获取变量,在foreach下面添加计数器元件:
这样我们想获取的变量就可以写成{"name":"${param_${index}_g1}", "value":"${param_${index}_g2}"},但是${param_${index}_g1}是变量名中含有变量名,需要用到函数生成器V:
将函数表达式替换到第二个request的Nmae字段:
Java Request {"name":"${__V(param_${index}_g2,)}", "value":"${__V(param_${index}_g1,)"}
也可以得到相同的效果!