zoukankan      html  css  js  c++  java
  • Jmeter系列(27)- 详解正则提取器

    如果你想从头学习Jmeter,可以看看这个系列的文章哦

    https://www.cnblogs.com/poloyy/category/1746599.html

     

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

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

    需知

    正则提取器

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

    正则提取器界面介绍

    字段含义

    字段 含义
    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

    勾选后,提取不到值时,则返回空字符串

    Template

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

    Field to check

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

    Body

    Request Headers

    Response Headers

    URL

    Response Code、Message

    入门栗子

    栗子的前提

    这个栗子,我都会以这个地址的接口来完成 JSON 提取器的实战栗子,大家可以注册个账号玩一玩哦

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

    测试计划树结构

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

    提取某个特定的值的栗子

    登录接口响应

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

    提取 token

    提取 uuid

    其他接口调用 token、uuid

    知识点

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

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

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

    举更多栗子前的一些话

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

    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
                }
            ]
        }
    }

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

    什么叫只有一个提取结果

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

    未填写模板

    提取器

    测试结果

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

    知识点

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

    $0$

    提取器

    测试结果

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

    知识点

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

    $1$

    提取器

    测试结果

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

    知识点

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

    $2$

    提取器

    测试结果

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

    知识点

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

    总结

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

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

    什么叫有多个提取结果

    有两种情况

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

    一个 ( ) 匹配到多个值 

    提取器

    测试结果

    手动分成四部分

    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

    知识点

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

    结构树 + ForEach 控制器

    查看结果树

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

    提取器

    测试结果

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

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

    提取器

    测试结果

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

    知识点

    • info2 拿的就是 info2_g1 的值
    •  $1$ 获取的是第一个 ( ) 匹配到的值, $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
  • 相关阅读:
    PHP如何判断一个gif图片是否为动画?
    Linux常用系统管理命令(top、free、kill、df)
    Mysql字符串连接函数 CONCAT()与 CONCAT_WS()
    OSChina.net 的 Tomcat 配置 server.xml 参考
    修改Linux默认启动级别或模式
    更改CentOS 6.3 yum源为国内 阿里云源
    PHP session过期机制和配置
    PHP垃圾回收机制防止内存溢出
    memcache与memcached的区别
    【总结】虚拟机VirtualBox各种使用技巧
  • 原文地址:https://www.cnblogs.com/poloyy/p/13179150.html
Copyright © 2011-2022 走看看