Jmeter-json提取器

一、JsonPath简介

JsonPath 表达式总是以与 XPath 表达式与 XML 文档结合使用的相同方式引用 JSON 结构。JsonPath 中的“根成员对象”总是被引用,$无论它是对象还是数组。
JsonPath 表达式可以使用点符号

$.store.book[0].title

或括号符号

$['store']['book'][0]['title']
Operator 描述
$ 要查询的根元素。这将启动所有路径表达式。
@ 过滤谓词正在处理的当前节点。
* 通配符。可在任何需要名称或数字的地方使用。
深层扫描。可在任何需要名称的地方使用。
. 带点符号的孩子
[’’ (, ‘’)] 括号标记的孩子或孩子
[ (, )] 数组索引或索引
[start:end] 数组切片运算符
[?()] 过滤表达式。表达式必须计算为布尔值。
  • 功能
    函数可以在路径的尾端调用——函数的输入是路径表达式的输出。函数输出由函数本身决定。
Function 描述 输出类型
min() 提供数字数组的最小值 Double
max() 提供数字数组的最大值 Double
avg() 提供一组数字的平均值 Double
stddev() 提供数字数组的标准偏差值 Double
length() 提供数组的长度 Integer
sum() 提供数字数组的总和值 Double
keys() 提供属性键(终端波浪号的替代方案~ Set
concat(X) 提供带有新项目的路径输出的连接版本 like input
append(X) 向 json 路径输出数组添加一个项目 like input
  • 过滤器运算符
    过滤器是用于过滤数组的逻辑表达式。典型的过滤器将是[?(@.age > 18)]其中@代表正在处理的当前项目。可以使用逻辑运算符&&和来创建更复杂的过滤器||。字符串文字必须用单引号或双引号 ([?(@.color == 'blue')][?(@.color == "blue")])括起来。
操作符 描述
== 左等于右(注意1不等于’1’)
!= 左不等于右
< 左边小于右边
<= 左小于或等于右
> 左大于右
>= 左大于或等于右
=~ left 匹配正则表达式 [?(@.name =~ /foo.*?/i)]
in 左边存在于右边 [?(@.size in [‘S’, ‘M’])]
nin 左边不存在于右边
subsetof left 是 right [?(@.sizes subnetof [‘S’, ‘M’, ‘L’])] 的子集
anyof 左边与右边有交集 [?(@.sizes anyof [‘M’, ‘L’])]
noneof 左边与右边没有交集 [?(@.sizes noneof [‘M’, ‘L’])]
size 左侧(数组或字符串)的大小应与右侧匹配
empty 左(数组或字符串)应为空
  • 路径示例
    鉴于json
{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}
JsonPath 结果
$.store.book[*].author] 所有书籍的作者
$…author 所有作者
$.store.* 所有的东西,包括书籍和自行车
$.store…price 所有的价格
$…book[2] 第三本书
$…book[-2] 倒数第二本书
$…book[0,1] 前两本书
$…book[:2] 从索引 0(包含)到索引 2(不包含)的所有书籍
$…book[1:2] 从索引 1(包括)到索引 2(不包括)的所有书籍
$…book[-2:] 最后两本书
$…book[2:] 从索引 2(包括)到最后的所有书籍
$…book[?(@.isbn)] 所有有isbn 属性的书
$.store.book[?(@.price < 10)] price小于10的所有书
$…book[?(@.price <= $[‘expensive’])] price的值小于等于expensive的值(10)的所有书
$…book[?(@.author =~ /.*REES/i)] 所有匹配正则表达式的书籍(忽略大小写)
$…*] 所有的
$…book.length() 图书属性(数组)值的长度

完整的语法说明请见https://github.com/json-path/JsonPath

二、Jmeter中json提取器参数说明

1.添加后置处理器→json提取器
Jmeter-json提取器_第1张图片

  1. 参数说明:
参数 说明 是否必填
Names of created variables 保存的变量名称,多个变量用分号分隔
JSON Path Expressions json path表达式,多个时也是用分号分隔
Match No. (0 for Random) 0表示随机;-1匹配所有;n取第几个匹配值;。
若只要获取到匹配的第一个值,则填写1;
必须匹配变量数 ,如果此 n大于匹配数,则不返回任何内容。将使用默认值
Compute concatenation var 如果找到许多结果,则插件将使用’ , '分隔符将它们连接起来,并将其存储在名为 _ALL的var中
Default Values 缺省值,匹配不到值的时候取该值;多个值时用分号分隔,必须匹配变量数

三、Jmeter中json提取器使用

  1. json提取器提取单个变量的值

示例:提取登录后返回的ticket认证信息
Jmeter-json提取器_第2张图片
添加后置处理器→json提取器
Jmeter-json提取器_第3张图片
这里ticket的值只有一个,Match No. (0 for Random) 填不填写都可以

下个接口引用变量:

在这里插入图片描述

  1. json提取器提取多个变量的值
    示例:提取登录响应信息中的userId和ticket
    Jmeter-json提取器_第4张图片
    运行结果:
    Jmeter-json提取器_第5张图片

  2. json提取器设置1个变量获取多个数据
    示例:

  • 例如先获取所有的一级菜单ID,再根据一级菜单ID去查询获取所有的子菜单
    响应信息:
    Jmeter-json提取器_第6张图片

  • 添加json提取器,获取所有的一级菜单id信息
    Jmeter-json提取器_第7张图片
    Jmeter-json提取器_第8张图片

  • 将获取到的每一个一级菜单id循环进行获取子菜单的信息
    1)添加循环控制器,设置循环次数。
    Jmeter-json提取器_第9张图片
    2)在请求中添加json提取器每次提取到的id
    Jmeter-json提取器_第10张图片
    因为要把JSON提取器中匹配到的muenid_1,…muenid_35循环传递给查询菜单,

__counter为jmeter自带的一个计数函数,KaTeX parse error: Expected group after '_' at position 2: {_̲_counter(,)}引用这…{__counter(,)}运行第1次muenid_1,运行第2次muenid_2,以此类推,直到运行到循环次数muenid_22
_V为jmeter自带的一个嵌套变量函数,运行第1次muenid${__counter(,)}为muenid_1,${_V(muenid${__counter(,)},)}则为${muenid_1};以此类推,一直循环到${muenid_22}
Jmeter-json提取器_第11张图片
3) 运行结果:
Jmeter-json提取器_第12张图片

四、json提取器注意点

  1. Match No填写-1,获取所有时
    Jmeter-json提取器_第13张图片
    在引用时,需使用${参数名_n}否则直接使用${参数名}会无法引用,匹配结果确定是唯一匹配时不建议使用-1,建议不填写或1
    示例:
    Jmeter-json提取器_第14张图片
    在这里插入图片描述
    结果变量引用失败
    Jmeter-json提取器_第15张图片
    正确写法:
    Jmeter-json提取器_第16张图片
    可以正常获取值
    Jmeter-json提取器_第17张图片
    建议:
    匹配结果为多个值时Match No填写-1,否则匹配结果唯一值时,建议不填写或1.

  2. JsonPath结合正则表达式

{
    "list":[
        {
            "id":1803168517610080,
            "code":"jd1",
            "shortName":"jd1",
            "fullName":"jd1",
            "users":[
                {
                    "userName":"jd1",
                    "userType":1,
                    "threeRoleType":null
                }
            ],
            "fullPath":"/默认公司/jd1",
            "layNo":1,
            "sort":0,
            "parentId":1000,
            "description":null,
            "tags":[

            ],
            "layRec":"1000-1803168517610080",
            "valid":true
        },
        {
            "id":1445827415104496,
            "code":"ceshi",
            "shortName":"测试公司",
            "fullName":"测试公司",
            "users":[
                {
                    "userName":"ceshi",
                    "userType":1,
                    "threeRoleType":null
                }
            ],
            "fullPath":"/默认公司/测试公司",
            "layNo":1,
            "sort":0,
            "parentId":1000,
            "description":null,
            "tags":[

            ],
            "layRec":"1000-1445827415104496",
            "valid":true
        }
    ]
}

获取code以jd开头的id

$.list[?(@.code =~/^Jd.*$/i)].id  //不区分大小写
$.list[?(@.code =~/^jd.*$/)].id  //区分大小写

Jmeter-json提取器_第18张图片
Jmeter-json提取器_第19张图片

你可能感兴趣的:(Jmeter,jmeter,JsonPath,性能测试,接口测试)