Jmeter系列(21)- 详解正则提取器

转自:https://www.cnblogs.com/poloyy/

一、有了 JSON 提取器为啥还要用正则提取器?

  • JSON 提取器 针对 接口返回的响应内容
  • 如果想提取的是响应头、请求头的值,而非响应内容的值呢?
  • 这个时候正则提取器的作用就出来了,它可以提取请求任一部分的值

二、需知

三、正则提取器

img

我们通过实际栗子去讲述理论知识点

四、正则提取器界面介绍

img

4.1 字段含义

字段 含义
Apply to 应用范围,选默认的 main sample only 就行了
Field to check 可提取的字段
Names of created variables 接收提取值的变量名
必传
Regular Expression 正则表达式
Template 从找到的匹配项中创建字符串的模板
Match No.(0 for Random) 取第几个值
0:随机,默认
-1:所有
1:第一个值
非必传
Default Value 缺省值,匹配不到值的时候取该值
非必传
Use empty default value 勾选后,提取不到值时,则返回空字符串

4.2 Template

  • 如果 一条 正则表达式有 多个提取结果,则提取结果是数组形式
  • 模板 (1)(2).....表示把解析到的第几个值赋给变量,从 1 开始匹配
  • (0) 表示整个表达式匹配的内容(后续具体看栗子)
  • 若只有一个结果,只能是(1)

4.3 Field to check

属性 含义
Body 响应体,不包括响应头;最常用
Body (unescaped) 响应体,替换了所有HTML转义符;不建议使用
Body as a Document 从不同类型的文件中提取文本;影响性能
Request Headers 请求头
Response Headers 响应头
URL URL
Response Code 响应码
Response Message 响应信息

4.3.1 Body

img

4.3.2 Request Headers

img

4.3.3 Response Headers

img

4.3.4 URL

img

4.3.5 Response Code、Message

img

五、入门例子

以这个地址的接口来完成 JSON 提取器的实战例子

http://api.yesapi.cn/docs.php?keyword=%E4%BC%9A%E5%91%98&channel=api

5.1 测试计划树结构

​ 下面多个栗子都以这个测试计划为基础哦

img

5.2 提取某个特定的值的栗子

5.2.1 登录接口响应

​ 登录是执行其他接口的前置接口,所以要获取用户登录后的 token、uuid

img

5.2.2 提取 token

img

5.2.3 提取 uuid

img

5.2.4 其他接口调用 token、uuid

img

5.2.5 知识点

  • 提其他接口可以通过 ${var} 这种格式,来获取提取到的值
  • ( ) 里面写匹配规则,用于解析正则表达式
  • .*? 表示匹配任意长度的任意字符,这也是最常用的正则表达式
  • 一般 (.+?) (.*?) 能够满足我们 80% 的使用场景

一般正则表达式都可以写成下面两种

  • 左边界(.+?)右边界
  • 左边界(.*?)右边界

六、举更多栗子前的一些话

  • 上面讲的是 使用正则提取器时的一个流程,也是实际工作中最简单的栗子
  • 在实际项目中,我们可能会出现一条正则表达式有多个提取结果的情况

6.1 JSON 字符串

下面的栗子都以这个 JSON 字符串为基础,从里面提取结果

这 JSON 字符串也是某个接口的响应内容,货真价实,感兴趣也可以自己玩一玩:http://api.yesapi.cn/docs-api-App.User.GetList.html

{
    "ret": 200,
    "msg": "V2.5.1 YesApi App.User.GetList",
    "data": {
        "total": 4,
        "err_msg": "",
        "err_code": 0,
        "users": [
            {
                "role": "user",
                "status_desc": "正常",
                "reg_time": "2020-06-22 20:45:05",
                "role_desc": "普通会员",
                "ext_info": {
                    "yesapi_nickname": "",
                    "yesapi_points": 0
                },
                "uuid": "0564CE592B4CE914365D8922F6FC4CEC",
                "username": "luojunjiess286",
                "status": 0
            },
            {
                "role": "user",
                "status_desc": "正常",
                "reg_time": "2020-06-22 14:27:17",
                "role_desc": "普通会员",
                "ext_info": {
                    "yesapi_nickname": "",
                    "yesapi_points": 0
                },
                "uuid": "0164DC0680F84DCE40D3DD4A36640ECA",
                "username": "luojunjiessa",
                "status": 0
            },
            {
                "role": "admin",
                "status_desc": "正常",
                "reg_time": "2020-03-23 22:48:32",
                "role_desc": "管理员",
                "ext_info": {
                    "yesapi_nickname": "",
                    "yesapi_points": 0
                    "yesapi_reg_source": ""
                },
                "uuid": "079BF6BB82AFCFC7084F96AECAF0519F",
                "username": "luojunjiess",
                "status": 0
            }
        ]
    }
}

七、一条正则表达式只有一个提取结果的例子

7.1 什么叫只有一个提取结果

就是正则表达式里只有一个 ( ) ,且 Match No. 不是 -1

7.2 未填写模板

7.2.1 提取器

img

7.2.2 测试结果

uuid1=
uuid1_g=1
uuid1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid1_g1=0564CE592B4CE914365D8922F6FC4CEC

7.2.3 知识点

如果正则匹配到值,但是没有填模板,则返回

7.3 (0)

7.3.1 提取器

img

7.3.2 测试结果

uuid2="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid2_g=1
uuid2_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid2_g1=0564CE592B4CE914365D8922F6FC4CEC

7.3.3 知识点

  • $0$ 模板其实返回的就是 uuid2_g0 的值
  • 返回了整个正则表达式,不只是 ( ) 内匹配到的值

7.4 (1)

7.4.1 提取器

img

7.4.2 测试结果

uuid3=0564CE592B4CE914365D8922F6FC4CEC
uuid3_g=1
uuid3_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid3_g1=0564CE592B4CE914365D8922F6FC4CEC

7.4.3 知识点

  • $1$ 模板其实返回的就是 uuid2_g1 的值
  • 仅返回 ( ) 内匹配到的值

7.5 (2)

7.5.1 提取器

img

7.5.2 测试结果

uuid4=null
uuid4_g=1
uuid4_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid4_g1=0564CE592B4CE914365D8922F6FC4CEC

7.5.3 知识点

$2$ 模板并不存在,其实就是 uuid4_g2 变量不存在,即使勾了 使用空默认值,也返回 null,

7.6 总结

  • 其实 uuid 在 JSON 字符串中有 三个 可匹配到的值,如果不填写匹配数字 Match No. ,则会 随机 取一个 uuid 并返回
  • 像上述的几个栗子,都填了 1 ,所以都返回了 第一个匹配到的 uuid

八、一条正则表达式有多个提取结果的例子

8.1 什么叫有多个提取结果

有两种情况

  • 一条表达式有多个 ( )
  • 一个 ( ) 匹配到多个值,且 Match No 填了 -1

8.2 一个 ( ) 匹配到多个值

8.2.1 提取器

img

8.2.2 测试结果

手动分成四部分

uuid1_1=0564CE592B4CE914365D8922F6FC4CEC
uuid1_1_g=1
uuid1_1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC"
uuid1_1_g1=0564CE592B4CE914365D8922F6FC4CEC

uuid1_2=0164DC0680F84DCE40D3DD4A36640ECA
uuid1_2_g=1
uuid1_2_g0="uuid":"0164DC0680F84DCE40D3DD4A36640ECA"
uuid1_2_g1=0164DC0680F84DCE40D3DD4A36640ECA

uuid1_3=079BF6BB82AFCFC7084F96AECAF0519F
uuid1_3_g=1
uuid1_3_g0="uuid":"079BF6BB82AFCFC7084F96AECAF0519F"
uuid1_3_g1=079BF6BB82AFCFC7084F96AECAF0519F

uuid1_matchNr=3

8.2.3 知识点

  • 一个 ( ) 匹配到多个值的场景 ,一般会结合 ForEach控制器,可以循环将提取到的值赋予到 HTTP 请求中
  • 可以看看下图的小例子,这里不展开讲,后面会再详细讲解

8.2.4 结构树 + ForEach 控制器

img

8.2.5 查看结果数

img

8.3 一条表达式有多个( ),且模板为空

8.3.1 提取器

img

8.3.2 测试结果

info1=
info1_g=2
info1_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info1_g1=0564CE592B4CE914365D8922F6FC4CEC
info1_g2=luojunjiess286

九、一条表达式有多个( ),且只有一个模板

9.1 提取器

img

9.2 测试结果

info2=0564CE592B4CE914365D8922F6FC4CEC
info2_g=2
info2_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info2_g1=0564CE592B4CE914365D8922F6FC4CEC
info2_g2=luojunjiess286

9.3 知识点info2 拿的就是 info2_g1 的值

$1$ 获取的是第一个 ( ) 匹配到的值, $2$ 获取的是第二个 ( ) 匹配到的值,以此类推

十、一条表达式有多个( ),且有两个模板

10.1 提取器

img

img

10.2 测试结果

info3=0564CE592B4CE914365D8922F6FC4CECluojunjiess286
info3_g=2
info3_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info3_g1=0564CE592B4CE914365D8922F6FC4CEC
info3_g2=luojunjiess286

info4=0564CE592B4CE914365D8922F6FC4CEC,luojunjiess286
info4_g=2
info4_g0="uuid":"0564CE592B4CE914365D8922F6FC4CEC","username":"luojunjiess286"
info4_g1=0564CE592B4CE914365D8922F6FC4CEC
info4_g2=luojunjiess286

十一、正则表达式中有多个 ( ) 时的总结

  • 如果其中一个 ( ) 匹配不到元素,那也无法获取到值
  • 引用名称、匹配数字、缺省值三个字段也只需要填一个值即可,不需要跟 ( ) 的数量一致
  • 多个模板( $1$$2$ )的时候,可以用空格``、, 、. 、 - `连接模板,最终会显示在变量上,如:info4
原文地址:https://www.cnblogs.com/dongye95/p/14178000.html