目录
目录
一、使用和背景
当我们需要获取请求响应结果中的某些数据值的时候,可以使用正则表达式提取器,配置好正则表达式,提取响应结果中的数据,然后将该数据存储在变量,后面的请求可以引用该变量作为请求参数。
二、如何使用正则表达是提取器以及查看匹配结果
1、创建正则表达式提取器
Apply to:是应用范围,该断言配置的生效范围
- Main sample and sub-samples:匹配范围为当前父取样器,及子取样器
- Main sample only :仅当前父取样器
- Sub samples only:仅子取样器
- JMeter Variable:变量值进行匹配
引用名称:指的是为正则取出来的字段定义的变量名称
正则表达式:正则表达式填写位置,可以利用在线工具判断是否可以匹配成功。https://c.runoob.com/front-end/854 ,在正则表达式中将要取出来的数据放在()括号里。详见后面例子。
模版:模版的格式为$1$$2$.....$和$之前为取正则表达式的分组
2、查看正则表达式匹配结果
创建debug sampler
然后使用默认值即可,在运行后,可以在察看结果树中看到debug的情况,也就是正则表达式匹配的情况。
三、举个例子
一)利用正则获取单一数值,并传递给下一个请求
1、创建请求
如何使用jmeter发送get请求参考这个:https://blog.youkuaiyun.com/Mojitoice/article/details/111464105
请求结果为:
2、编写正则表达式
借助正则表达式在线工具,来调试正则表达式。
正则表达式为:"shouji":"(\d{11})"
3、创建正则表达式提取器并填写表达式等内容
在正则中()中代表着分组,取符合正则的数据的时候需要使用$1$,如果存在两个就可以$1$$2$(中间的1和2分别代表第几个分组的意思)
4、创建debug sampler 用来查看正则匹配情况
创建好,保持默认值就行
5、运行请求,查看结果
匹配成功
6、那么如何将上个接口的返回用于下个接口的请求参数呢?
还记得我们在正则提取器中定义的引用名称吧。在新创建的请求中引用该变量。引用方式为${变量名称}
如果是需要上个步骤中的phone_g0,可以将下面的变量名称更改为phone_g0
7、执行全部请求
取样器结果
新创建的请求中带上了从手机号码归属地查询请求的返回值中获取到的手机号。
二)利用正则获取数组,并循环传递给下一个请求
1、创建请求
https://gank.io/api/v2/categories/Article
请求返回值:
{
data: [
{
_id: "5e59ec146d359d60b476e621",
coverImageUrl: "http://gank.io/images/b9f867a055134a8fa45ef8a321616210",
desc: "Always deliver more than expected.(Larry Page)",
title: "Android",
type: "Android"
},
{
_id: "5e59ed0e6e851660b43ec6bb",
coverImageUrl: "http://gank.io/images/d435eaad954849a5b28979dd3d2674c7",
desc: "Innovation distinguishes between a leader and a follower.(Steve Jobs)",
title: "苹果",
type: "iOS"
},
{
_id: "5e5a25346e851660b43ec6bc",
coverImageUrl: "http://gank.io/images/c1ce555daf954961a05a69e64892b2cc",
desc: "The man who has made up his mind to win will never say “ Impossible”。( Napoleon )",
title: "Flutter",
type: "Flutter"
},
{
_id: "5e5a254b6e851660b43ec6bd",
coverImageUrl: "http://gank.io/images/4415653ca3b341be8c61fcbe8cd6c950",
desc: "Education is a progressive discovery of our own ignorance. ( W. Durant )",
title: "前端",
type: "frontend"
},
{
_id: "5e5a255c6e851660b43ec6be",
coverImageUrl: "http://gank.io/images/964552b931d5470ea1506fc2b0f1cba9",
desc: "If you do not learn to think when you are young, you may never learn. ( Edison )",
title: "后端",
type: "backend"
},
{
_id: "5e5a25716e851660b43ec6bf",
coverImageUrl: "http://gank.io/images/c3c7e64f0c0647e3a6453ccf909e9780",
desc: "Do not, for one repulse, forgo the purpose that you resolved to effort. ( Shakespeare )",
title: "APP",
type: "app"
}
],
status: 100
}
此时我想获取返回值中的所有title
2、编写正则表达式
到线上正则表达式工具中test正则表达式,注意格式,不要用格式化后的json数据作为待匹配文本。会出现问题
正则表达式为:"title":"(.*?)","type"
3、创建正则表达式提取器并填写表达式等内容
其中匹配数字:0代表随机,-1代表所有
4、创建debug sampler 用来查看正则匹配情况
保持默认值即可
5、运行请求,查看结果
正则表达式生效,可以取到所有的title,title_matchNr=6
6、那么如何将上个接口的返回循环用于下个接口的请求参数呢?
6.1首先需要创建一个ForEach逻辑控制器
输入变量前缀:在调试取样器中,可以看到正则表达式的匹配结果,其中包括title_1=Android title_1_g=1 title_1_g0="title":"Android","type".....所以此时变量前缀为title
开始循环字段和结束循环字段:参考调试取样器中,为0和6从头去为0
输出变量名称:ForEach逻辑控制器是循环将符合正则的数据取出来,然后输出给下一个请求作为请求参数。此时可以定义一个变量名作为下一个请求的请求参数
数字之前加上下划线“_”:默认勾选状态,不需要改变,调试取样器中可以得到数字之前就是存在下划线的。title_1
注意:ForEach逻辑控制器的位置
6.2其次创建一个百度请求
引用ForEach逻辑控制器输出的变量名称。注意百度请求的位置在foreach控制器下面。
7、执行全部请求
执行后发现一个问题,会报错:java.net.URISyntaxException: Illegal character in query at index 26: http://www.baidu.com/?name =Android
这是为啥呢?
是因为URL中的传参没有进行编码,URL不识别我们正则获取到的URL字符串。此时需要将请求中编码进行勾选即可
此时再执行全部请求
这样,就么得问题了。。。