为什么要用 JSON 提取器
- JSON 是目前大多数接口响应内容的数据格式
- 在接口测试中,不同接口之间可能会有数据依赖,在 Jmeter 中可以通过后置处理器来提取接口的响应内容
- JSON 提取器是其中一个可以用来提取响应内容的元件
JSON 提取器的应用场景
- 提取某个特定的值
- 提取多个值
- 按条件取值
- 提取值组成的列表
JSON 提取器
JSON 提取器界面介绍
字段含义
字段 | 结果 |
---|---|
Apply to | 应用范围,选默认的 main sample only 就行了 |
Names of created variables |
|
JSON Path expression |
|
Match No.(0 for Random) |
|
Compute concatenation var(suffix_ALL) |
|
Default Values |
|
测试计划树结构
响应结果:
{ "status":"1", "code":"1", "msg":"成功", "probeId":"10000005213103", "strategyVersion":null, "startTime1":null, "endTime1":null, "startTime2":null, "endTime2":null, "cycle":null, "heartCycle":null, "eventCycle":null, "kafkaParam":"iwdtv.iwangding.com:39091,iwdtv.iwangding.com:39092,iwdtv.iwangding.com:39093,iwdtv.iwangding.com:39094|32|gnsts2017", "ext":"1", "serverTime":1619432337, "enable":"0", "city":"2601", "area":"40303", "opt":"M", "province":"26", "itemList":null, "strategy": { "turnon":1, "excTime":8, "minMemRate":5, "packageName":"com.iwangding.monitorservicetest", "action":"com.iwangding.idle.test", "category":"", "broadcastAction":"" } }
调用接口后,所以要获取 packageName、action
提取 packageName
相对路径的方式
提取 action
绝对路径的方式
其他接口调用 packageName、action
知识点
- 提取某个特定值的方式有两种:绝对路径、相对路径
- 提其他接口可以通过 ${action} 这种格式,来获取提取到的值
1)json提取数组
匹配到多个值的场景 ,一般会结合 ForEach控制器(遍历获取),可以循环将提取到的值赋予到 HTTP 请求中
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 } ] } }
提取单个值
Jsonpath | 结果 |
---|---|
$.data.total | 3 |
$..total | 3 |
$..users[0].role | user |
$..uuid | 079BF6BB82AFCFC7084F96AECAF0519F |
$.data.users[0].ext_info.yesapi_points | 0 |
重点
- 如果匹配到多个值(像 $..uuid ),也只能提取到一个值
- 如果想提取匹配到的所有 uuid,可以设置为 -1,结果如下图
还会告诉你匹配了多少个值 ${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 |
提取多个值
- 四种写法类似,选一种方法自己熟记即可
- 重点:提取多个值,提取器的 Match No. 必须填 -1
$.data.users[*].role
提取所有 role 字段值
[*] 表示取数组的所有元素
$..users..role_desc
提取所有 role_desc 字段值
$..reg_time
提取所有 reg_time 字段值
$..[*].username
提取所有 username 字段值
提取数据指定字段的值的栗子
提取 users 第一条记录的 uuid、username 字段的值
测试结果
勾选 Compute concatenation var 的栗子
JSON 提取器
测试结果
一个 JSON 提取器有多个 Jsonpath 的栗子
JSON 提取器
测试结果
利用 FOrEach控制器遍历获取:
将获取的值传递给请求参数