Jmeter(五)关联之正则表达式提取器
我们在用Jmeter做接口或者性能测试时,经常会碰到第二个请求提交的的参数要从第一个请求返回的参数中获取,而这些参数值并不是固定的,是动态变化的,这种场景就要用到关联
Jmeter提供了一种叫做正则提取器的组件来提取数据。
场景:
通过下面这个接口可以获取到某个城市的天气
http://www.weather.com.cn/data/cityinfo/101280601.html
但这里面有一个城市代码(101280601)我们并不知道,它需要通过另一个接口查询出某个城市的代码,然后再填充到上面的接口中,查询城市代码的接口
http://toy1.weather.com.cn/search?cityname=深圳
到这里整个解决思路就清晰了:
1、添加第1个请求GetCityCode用来获取城市的编码
2、用正则提取器来提取城市编码
3、添加第2个请求GetWeatherInfo用来获取天气信息,请求消息中的城市编码为正则提取的编码
具体操作如下:
1、新建一个HTTP请求GetCityCode,填写请求信息
2、添加一个正则正则表达式提取器
3、添加第2个HTTP请求GetWeatherInfo,填写请求信息,这里的${citycode}就是获取正则表达式提取的参数值,citycode变量名与正则表达式提取器中的“引用名称”中填写的变量名一致
4、运行,查看请求消息
正则表达式提取器:
正则表达式提取器:允许用户从服务器的响应中通过使用perl的正则表达式提取值。该元素会作用在指定范围取样器,用正则表达式提取所需值,生成模板字符串,并将结果存储到给定的变量名中。
APPly to:作用范围(返回内容的断言范围)
Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器
Main sample only:仅作用于父节点的取样器
Sub-samples only:仅作用于子节点的取样器
JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)
要检查的响应字段:需要检查的响应报文的范围
主体:响应报文的主体
Body(unescaped):主体,响应的主体内容且替换了所有的html转义符,注意html转义符处理时不考虑上下文,因此可能有不正确的转换,不太建议使用
Body as a Document:从不同类型的文件中提取文本,注意这个选项比较影响性能
Response Headers:响应信息头
Request Headers:请求信息头
URL:统一资源定位符,即Internet上用来描述信息资源的字符串
Response Code:响应状态码,比如200、404等
Response Message:响应信息
引用名称(Reference Name):Jmeter变量的名称,存储提取的结果;即下个请求需要引用的值、字段、变量名(例子中我提取的是citycode),如果在下个请求中想引用这个变量,直接:${引用名称}
正则表达式(Regular Expression):使用正则表达式解析响应结果,“()”表示提取字符串中的部分值,请不要使用“||”,除非你本身需要匹配这个字符。
下面是常用的正则表达式操作符:
模板(Template):从匹配的结果中创建一个字符串,这是通过正则表达式匹配出来的一组值,意为使用提取到的第几个值(可能有多个值匹配,因此使用模板);从1开始匹配,以此类推.
参数可以在取值模板组合使用,例如:“11-22”作为模板得到的值是使用“-”连接的第一个待匹配内容与第二个待匹配内容组合而成的字符串。
匹配数字(Match No):正则表达式匹配数据的结果可以看做一个数组,表示如何取值:0代表随机取值,正数n则表示取第n个值(比如1代表取第一个值),负数则表示提取所有符合条件的值。
缺省值:匹配失败时候的默认值;通常用于后续的逻辑判断,一般通常为特定含义的英文大写组合,比如:ERROR
在这里大多数人会对这个模板和匹配数字比较懵逼,我们先把第一个请求GetCityCode返回的消息放到正则表达式测试一下
可以看到,一共4个匹配结果,如果我们需要获取到第2个匹配结果101200202009,只需要把匹配数字改为2
我们再把正则表达式改为(\d{9})~(\w*)~,再看一下
如果我们要获取hubei这个参数值,只需要把模板改为$2$,匹配数字改为2就行了