我们在使用JMeter做接口自动化的过程中,对正则表达式的使用肯定不陌生吧,那么小伙伴是否遇到过以下的场景呢?
响应报文类似下面的这样的:
我们要使用phrase后面的其中一个值。
使用正则表达式提取后匹配出多少值,提取结果如下:
现在的问题是,如果我们要使用正则表达式提取后的:使用其中的第1个和第10个值,我们应该怎么去实现呢?
肯定会有小伙伴会说,可以使用第三方的插件来实现,我用java写一个jar,把提取的值存储到map或者list里,然后用使用下标即可实现。这也是一个不错的方法,那么对于不会Java的小伙伴是不是就没有办法解决这个问题了呢?答案是否定的
小伙伴们不知道有没有认真分析过 正则表达式提取器 组件功能,已经考虑到这种场景了
apply to:
Main sample and sub-samples:作用于父节点取样器及对应子节点取样器;
Main sample only:仅作用于父节点取样器;
Sub-samples only:仅作用于子节点取样器;
JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称,即针对输入变量的值进行正则提取)。
要检查的响应字段:样本数据源
主体:接口响应主体内容,默认选择此项;
Body(unescaped):针对替换了转义码的Body部分;
Body as a Document:返回内容作为一个文档进行匹配;
信息头:响应头的所有内容;
Request Headers:请求头的所有内容;
url:是对sample的url进行匹配,也就是查看结果树里请求内容的第一行url,不包含data里的请求参数;
响应代码:http响应代码,如101,200,302,404,501等;
响应信息:http响应代码对应的响应信息,例如:OK, Found(HTTP/1.1 200 OK;HTTP/1.1 302 Found)。
引用名称:
其他地方引用时的变量名称,名称只能是一个,引用方法:${变量名称}
正则表达式:
数据提取器,一般简单的通用语法就是:左边界(.*?)右边界,左右边界就是为了能准确定位到想匹配的内容,具体语法如下:
提到正则表达式,必须要说一下匹配的两种模式:贪婪和非贪婪
贪婪与非贪婪模式是两种不同的表达式匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。
模板:
对应正则表达式提取器类型,样式为:
$n$。若模板为:$0$,则为整个表达式匹配到的内容,就是包括小括号内跟小括号外的内容;
若模板为:$1$,则对应正则表达式中的第一个(.*?)所匹配的内容;
若模板为:$2$,则对应正则表达式中的第二个(.*?)所匹配的内容;
若模板为$1$$2$,则把2个(.*?)所匹配的内容拼接起来;
匹配数字:
正则表达式匹配数据的最终结果可以看做一个数组,匹配数字即可看做是数组的第几个元素。
当为 0 时,随机返回匹配的数据。
当为 1 时,表示返回匹配结果数组的第一个元素。
当为负数(-1,-2,-100都可以)时,表示返回全部元素,并且同时会返回一个元素总数的变量。
不填写数字时,就使用下面的缺省值。
在引用时:通过${变量名_1}的方式来取第1个匹配的内容,${变量名_2}来取第2个匹配的内容。
缺省值:
匹配失败时的默认值。通常用于后续的逻辑判断,建议使用一些特殊含义的,比如0,NULL,ERROR等。
根据前面实例,对响应结果提取如下图
那么当这里填写-1即匹配全部时,我们引用时该怎么去使用呢?
使用方法:${变量名_下标}的方式来获取,下面来验证该逻辑的正确性,正则表达式如上,
下面添加一个java请求,打印引用第1个和第10个值
打印结果如下:
我们来看下正则表达式提取的第1个和第10个值分别是:when和similar
进行对比,结果正确,那么就实现我们的需求。
和使用jar来实现的效果一样,对于不会JAVA语言的小伙伴,可以考虑使用该方法。