为什么要用 JSON 提取器
- JSON 是目前大多数接口响应内容的数据格式
- 在接口测试中,不同接口之间可能会有数据依赖,在 Jmeter 中可以通过后置处理器来提取接口的响应内容
- JSON 提取器是其中一个可以用来提取响应内容的元件
JSON 提取器的应用场景
JSON 提取器
我们通过实际栗子去讲述理论知识点
JSON 提取器界面介绍
字段含义
入门栗子
栗子的前提
这个栗子,我都会以这个地址的接口来完成 JSON 提取器的实战栗子,大家可以注册个账号玩一玩哦
YesApi 小白免费接口 | 果创云,一个账号,搞定接口开发
测试计划树结构
下面多个栗子都以这个测试计划为基础哦
提取某个特定的值的栗子
登录接口响应
登录是执行其他接口的前置接口,所以要获取用户登录后的 token、uuid
提取 token
相对路径的方式
提取 uuid
绝对路径的方式
其他接口调用 token、uuid
知识点
综合栗子
JSON 字符串
这也是某个接口返回的响应内容,后面的栗子也是以这个 JSON 字符串为基础来提取各种值
感兴趣也可以自己玩一玩:2013 获取会员列表接口 - App.User.GetList - YesApi 小白免费接口 | 果创云,一个账号,搞定接口开发
{ "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","reg_time": "2020-06-22 14:27:17","uuid": "0164DC0680F84DCE40D3DD4A36640ECA","username": "fangjieyaossa",{ "role": "admin","reg_time": "2020-03-23 22:48:32","role_desc": "管理员","uuid": "079BF6BB82AFCFC7084F96AECAF0519F","username": "fangjieyaoss","status": 0 } ] } }
提取单个值
Jsonpath | 结果 |
---|---|
$.data.total | 3 |
$..total | 3 |
$..users[0].role | user |
$..uuid | 079BF6BB82AFCFC7084F96AECAF0519F |
$.data.users[0].ext_info.yesapi_points | 0 |
重点
还会告诉你匹配了多少个值 ${uuid_matchNr} ,记住,调用变量时,不再是 ${uuid} 而是 ${uuid_1} 、 ${uuid_2}
利用切片提取单个值
和 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 |
提取多个值
$.data.users[*].role
提取所有 role 字段值
[*] 表示取数组的所有元素
$..users..role_desc
提取所有 role_desc 字段值
$..reg_time
提取所有 reg_time 字段值
$..[*].username
提取所有 username 字段值
按条件提取值
有时候只需要提取某个特定条件下的参数值
语法格式
[?(expression)]
栗子
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 的记录 |
@
代表当前节点,像上面的四个栗子,@代表 users 这个列表字段
=~
- 后面跟正则表达式,如果想提取包含指定字符的值,可以使用此正则: /.*指定字符串.*?/i
- i 代表大小写不敏感
提取数据指定字段的值的栗子
提取 users 第一条记录的 uuid、username 字段的值
$..users[0].['uuid','username']
测试结果
new_1={"uuid":"6D5EDCB459F0917A98106E07D5438C58","username":"luojunjiessb"}
勾选 Compute concatenation var 的栗子
JSON 提取器
测试结果
uuid_1=6D5EDCB459F0917A98106E07D5438C58 uuid_2=0164DC0680F84DCE40D3DD4A36640ECA uuid_3=079BF6BB82AFCFC7084F96AECAF0519F uuid_ALL=6D5EDCB459F0917A98106E07D5438C58,0164DC0680F84DCE40D3DD4A36640ECA,079BF6BB82AFCFC7084F96AECAF0519F uuid_matchNr=3
一个 JSON 提取器有多个 Jsonpath 的栗子
JSON 提取器
测试结果
uuid1_1=6D5EDCB459F0917A98106E07D5438C58 uuid1_2=0164DC0680F84DCE40D3DD4A36640ECA uuid1_3=079BF6BB82AFCFC7084F96AECAF0519F uuid1_matchNr=3 uuid2_1=6D5EDCB459F0917A98106E07D5438C58 uuid2_2=0164DC0680F84DCE40D3DD4A36640ECA uuid2_3=079BF6BB82AFCFC7084F96AECAF0519F uuid2_matchNr=3
知识点