zoukankan      html  css  js  c++  java
  • Jmeter系列(20)- 详解 JSON 提取器

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

    一、为什么要用 JSON 提取器

    • JSON 是目前大多数接口响应内容的数据格式
    • 在接口测试中,不同接口之间可能会有 数据依赖,在 Jmeter 中可以通过后置处理器来提取接口的响应内容
    • JSON 提取器是其中一个可以用来提取响应内容的元件

    1.1 JSON 提取器的应用场景

    1. 提取某个特定的值
    2. 提取多个值
    3. 按条件取值
    4. 提取值组成的列表

    二、JSON 提取器

    img

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

    三、JSON 提取器界面介绍

    img

    3.1 字段含义

    字段 结果
    Apply to 应用范围,选默认的 main sample only 就行了
    Names of created variables 接收提取值的变量名
    多个变量用 ; 分隔
    必传
    JSON Path expression json path 表达式,用来提取某个值
    多个表达式用 ; 分隔
    必传
    Match No.(0 for Random) 取第几个值,多个值用 ; 分隔
    0:随机,默认
    -1:所有
    1:第一个值
    非必传
    Compute concatenation var(suffix_ALL) 如果匹配到多个值,则将它们都连接起来,不同值之间用 , 分隔
    变量会自动命名为 <variable name>_ALL
    Default Values 缺省值,匹配不到值的时候取该值,可写error
    多个值用 ; 分隔
    非必传

    四、入门例子

    4.1 测试计划树结构

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

    img

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

    4.2.1 登录接口响应

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

    {
        "ret":200,
        "msg":"V2.5.1 YesApi App.User.LoginExt",
        "data",{
            "role":"user",
            "err_msg":"",
            "err_code":"0",
            "uuid":"07sd98skjn0fmklasmi"
            "token":"SADIFNAOI89ASOIKDN8A9DJAOI"
        }
    }
    

    4.2.2 提取 token

    相对路径的方式

    img

    4.2.3 提取 uuid

    绝对路径的方式

    img

    4.2.4 其他接口调用 token、uuid

    img

    4.2.5 知识点

    • 提取某个特定值的方式有两种:绝对路径、相对路径
    • 提其他接口可以通过 ${var} 这种格式,来获取提取到的值

    五、综合例子

    • 上面讲的是 使用 JSON 提取器时的一个流程
    • 在实际项目中,接口的响应内容肯定是非常复杂的,而我们需要提取的值也是多样化的,需要通过各种实战栗子来讲述清晰

    5.1 JSON 字符串

    这也是某个接口返回的响应内容,后面的栗子也是以这个 JSON 字符串为基础来提取各种值

    {
        "ret": 200,
        "msg": "V2.5.1 YesApi App.User.GetList",
        "data": {
            "total": 3,
            "err_msg": "",
            "err_code": 0,
            "users": [
                {
                    "role": "user",
                    "status_desc": "正常",
                    "reg_time": "2020-06-22 15:19:51",
                    "role_desc": "普通会员",
                    "ext_info": {
                        "yesapi_nickname": "",
                        "yesapi_points": 0
                    },
                    "uuid": "6D5EDCB459F0917A98106E07D5438C58",
                    "username": "fangjieyaossb",
                    "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": "fangjieyaossa",
                    "status": 0
                },
                {
                    "role": "admin",
                    "status_desc": "正常",
                    "reg_time": "2020-03-23 22:48:32",
                    "role_desc": "管理员",
                    "ext_info": {
                        "yesapi_nickname": "",
                        "yesapi_points": 0
                    },
                    "uuid": "079BF6BB82AFCFC7084F96AECAF0519F",
                    "username": "fangjieyaoss",
                    "status": 0
                }
            ]
        }
    }
    

    5.2 提取单个值

    Jsonpath 结果
    $.data.total 3
    $..total 3
    $..users[0].role user
    $..uuid 079BF6BB82AFCFC7084F96AECAF0519F
    $.data.users[0].ext_info.yesapi_points 0

    重点

    • 如果匹配到多个值(像 $..uuid ),也只能提取到一个值
    • 如果想提取匹配到的所有 uuid,可以设置为 -1,结果如下:
    uuid_1=6SADAS8DU8ASUD89AUS8D
    uuid_2=9SD90AS76SF8SA7D98798
    uuid_3=7GSDF8ASD89AS8D9AS8D8
    uuid_matchNr=3
    

    还会告诉你匹配了多少个值 ${uuid_matchNr} ,记住,调用变量时,不再是 ${uuid} 而是 ${uuid_1}${uuid_2}

    5.3 利用切片提取单个值

    和 Python 切片一样的原理

    Jsonpath 结果
    $..users[2] 第三个 users
    $..users[-2] 倒数第二个users
    $..users[0,1] 前面两个users
    $..users[:2] 第一、二个users
    $..users[1:2] 第二个users
    $..users[-2:] 倒数两个users
    $..users[1:] 第二个开始的所有users

    5.4 提取多个值

    • 四种写法类似,选一种方法自己熟记即可
    • 重点:提取多个值,提取器的 Match No. 必须填 -1

    5.4.1 $.data.users[*].role

    提取所有 role 字段值

    role_more_1=user
    role_more_2=user
    role_more_3=admin
    role_more_matchNr=3
    

    [*] 表示取数组的所有元素

    5.4.2 $..users..role_desc

    提取所有 role_desc 字段值

    role_desc_more_1=普通会员
    role_desc_more_2=普通会员
    role_desc_more_3=普通会员
    role_desc_more_matchNr=3
    

    5.4.3 $..reg_time

    提取所有 reg_time 字段值

    reg_time_more_1=2020-06-22 15:19:51
    reg_time_more_2=2020-06-22 14:33:51
    reg_time_more_3=2020-03-23 22:19:51
    reg_time_more_matchNr=3
    

    5.4.4 $..[*].username

    提取所有 username 字段值

    username_1=mzd
    username_2=mofashi
    username_3=xjp
    username_maychNr=3
    

    5.5 按条件提取值

    有时候只需要提取某个特定条件下的参数值

    5.5.1 语法格式

    [?(expression)]
    

    5.5.2 例子

    Jsonpath 结果
    $..users[?(@.uuid)] 提取 users 里面包含 uuid 字段的记录
    $..users[?(@.reg_time > '2020-06-01')] 提取 reg_time 字段大于 2020-06-01 的记录
    $..users[?(@.role_desc =~ /.会员.?/i)] 提取 role_desc 字段包含会员的记录
    $..users[?(@.status == 0)] 提取 status 字段等于 0 的记录

    5.5.3 @

    代表当前节点,像上面的四个栗子,@代表 users 这个列表字段

    5.5.4 =~

    • 后面跟正则表达式,如果想提取 包含指定字符 的值,可以使用此正则: /.*指定字符串.*?/i
    • i 代表大小写不敏感

    六、提取数据指定字段的值的栗子

    ​ 提取 users 第一条记录的 uuid、username 字段的值

    $..users[0].['uuid','username']
    

    6.1 测试结果

    new_1={"uuid":"6D5EDCB459F0917A98106E07D5438C58","username":"luojunjiessb"}
    

    七、勾选 Compute concatenation var 的栗子

    7.1 JSON 提取器

    img

    7.2 测试结果

    uuid_1=6D5EDCB459F0917A98106E07D5438C58
    uuid_2=0164DC0680F84DCE40D3DD4A36640ECA
    uuid_3=079BF6BB82AFCFC7084F96AECAF0519F
    uuid_ALL=6D5EDCB459F0917A98106E07D5438C58,0164DC0680F84DCE40D3DD4A36640ECA,079BF6BB82AFCFC7084F96AECAF0519F
    uuid_matchNr=3
    

    八、一个 JSON 提取器有多个 Jsonpath 的栗子

    8.1 JSON 提取器

    img

    8.2 测试结果、

    uuid1_1=6D5EDCB459F0917A98106E07D5438C58
    uuid1_2=0164DC0680F84DCE40D3DD4A36640ECA
    uuid1_3=079BF6BB82AFCFC7084F96AECAF0519F
    uuid1_matchNr=3
    uuid2_1=6D5EDCB459F0917A98106E07D5438C58
    uuid2_2=0164DC0680F84DCE40D3DD4A36640ECA
    uuid2_3=079BF6BB82AFCFC7084F96AECAF0519F
    uuid2_matchNr=3
    

    8.3 知识点

    • 如果有多个 Jsonpath 的时候,每个字段都必填值,且 字段值的数量要一致(像上图,每个字段都填了两个值)
    • 勾不勾 Compute concatenation var 都行
    • 字段值数量不一致则无法提取值
  • 相关阅读:
    C#高级编程第11版
    做点字符串题
    Codeforces Round #681 (Div. 1, based on VK Cup 2019-2020
    Educational Codeforces Round 97 题解
    AtCoder Regular Contest 106 题解
    Kick Start Round G 2020 题解
    CCSP 2020题解
    Codeforces Round #675 (Div. 2) 题解
    AtCoder Regular Contest 104
    Kick Start Round F 2020 题解
  • 原文地址:https://www.cnblogs.com/dongye95/p/14175042.html
Copyright © 2011-2022 走看看