Http接口测试-参数校验--JSON匹配

JsonPath:

基础描述符描述
$查询的根节点对象,用于表示一个json数据,可以是数组或对象
@过滤器(filter predicate)处理的当前节点对象
*获取所有节点
.获取子节点
..递归搜索,筛选所有符合条件的节点
?()过滤器表达式,筛选操作
[start:end]数组片段,区间为[start,end),不包含end
[A]或[A,B]迭代器下标,表示一个或多个数组下标

函数
可以在JsonPath表达式执行后进行调用,其输入值为表达式的结果。

名称描述
min()获取数值类型数组的最小值
max()获取数值类型数组的最大值
length()获取数值类型数组的长度,例如$.data.length()

过滤器
过滤器是用于过滤数组的逻辑表达式。

操作符描述
==等于
!=不等于
<小于
=~判断是否符合正则表达式,例如[?(@.name =~ /foo.*?/i)]
in所属符号,例如[?(@.type in ["小雨","中到大雨"])]
nin排除符号

如响应体:

BODY
{"code" : 200,"msg" : "成功!","data" : {"yesterday" : {"date" : "13日星期一","high" : "高温 23℃","fx" : "东北风","low" : "低温 18℃","fl" : "","type" : "小雨"},"city" : "杭州","aqi" : null,"forecast" : [{"date" : "14日星期二","high" : "24","fengli" : "","low" : "18","fengxiang" : "东北风","type" : "多云"},{"date" : "15日星期三","high" : "22","fengli" : "","low" : "19","fengxiang" : "东北风","type" : "中到大雨"},{"date" : "16日星期四","high" : "25","fengli" : "","low" : "19","fengxiang" : "东北风","type" : "多云"},{"date" : "17日星期五","high" : "30","fengli" : "","low" : "22","fengxiang" : "无持续风向","type" : "小雨"},{"date" : "18日星期六","high" : "33","fengli" : "","low" : "19,"fengxiang" : "无持续风向","type" : "多云"}],"ganmao" : "各项气象条件适宜,无明显降温过程,发生感冒机率较低。","wendu" : "21"}
}

表示支持JsonPath语法定义判断校验返回值是否符合预期值,示例如下:

表达式含义获取值
$.data.forecast[0].position_name获取data.forecast[0]对象中position_name值。滨江
$.data.forecast[*].aqi使用迭代器,获取data中forecast数组中所有aqi的值。[62,68]
$..forecast[?(@.aqi >= 60)].primary_pollutant使用迭代器,获取forecast数组中所有的aqi值大于等于60的primary_pollutant值。['null','null']
{$.data.forecast[*].aqi}[0]使用迭代器,获取data中forecast数组中aqi的第一个值。62
$.data.forecast[?(@.level=="良")].pm25获取data中forecast数组中level等于"良"对象,并获取该对象中pm25的值。[43]
$.data.forecast[?((@.level=="良")&&(@.aqi==62))].pm10获取data中forecast数组中level等于“良”与等于aqi等于63的所有对象,并获取该对象中pm10的值。[73]
$.data.forecast[?(@.aqi>65)].position_name获取data中forecast数组中aqi大于65的所有对象,并获取该对象中position_name值。["西溪"]

实际中的应用场景示例:

1、校验返回体中某一个字段是否包含某一个值或多个值或某些内容,校验包含多个值以&&符号连接。例如type值中是否包含“多云”。

表达式:$.data.forecast[*].type 获取值为:["多云","中到大雨","多云","小雨","多云"]

用法:校验类型:Json匹配 参数:$.data.forecast[*].type 值:多云

描述:此块逻辑平台做了兼容处理,若值列填写的值包含于表达式获取的数组列表中,则校验通过。

2、在用例中校验或场景中表达式过滤输出获取到的值中某一个,例如type值中第一个值。

表达式:$.data.forecast[*].type 获取值为:["多云","中到大雨","多云","小雨","多云"]

取获取值中第一个值“多云”:{$.data.forecast[*].type}[0],依次类推。

3、若校验的返回体中参数key中含有 . () *等关键字时(与平台校验逻辑中关键字冲突,导致校验不通过)可以使用以下方法:

{"data" : [{"count(*)" : 123,"left(send_address,2)":456}]
}

表达式:$.["data"][0]["count(*)"] 获取值为:123
表达式:{$.["data"][0]}['left(send_address,2)'] 获取值为:456

4、若校验返回体中某一个数组中参数包含或不包含某一个参数时,例如校验不包含avgUv7D

[{"supplierId":523,"goodsId":55280465,"onlineStatus":1,"title":"多颜色商品-auto-20161121154939513","importType":1,}
]

表达式:{$.[?(@.goodsId == 55280465)]}.containsKey('avgUv7D') 获取值为false

表达式:!{$.[?(@.goodsId == 55280465)]}.containsKey('avgUv7D') 获取值为true

表达式:$.[?(@.goodsId == 55280465)].[?(@.avgUv7D)] 获取值为[]

5、若校验返回体中数组长度,Jsonpath语法表达式获取到的为二维数组形式,则可以使用length()函数。

[[{"picUrl": "https://yanxuan.nosdn.127.net/54fe672080fa28052e5faa72fe780663.jpg","expireTime": 0,"onlineTime": 0},{"picUrl": "https://yanxuan.nosdn.127.net/cb509d41739f8ce3764973e4888e06f3.jpg","expireTime": 0,"onlineTime": 0}]
]

6、若校验返回体中数组中某个参数值符合正则表达式,例如校验productName参数值中都包含lv字符串。

{"code" : 200,"message" : "成功","result" : {"list" : [{"id" : 3002,"businessAccount" : "laotest6@163.com","itemId" : "7777","productName" : "LV"},{"id" : 3002,"businessAccount" : "laotest6@163.com","itemId" : "7777","productName" : "Velvet by Graham & Spencer"}]}
}

表达式:{$.result.list[?(@.productName =~ /.*lv.*/i)].id}.size() 获取值为2

表达式:{$.result.list[?(!(@.productName =~ /.*lv.*/i))].id}.size() 获取值为0

7、若校验返回体中某一个参数值参数类型,例如校验he参数是否为string类型。

{"data": {"eh": null,"ad": 12345,"he": "快使用双节棍,哼哼哈嘿!!","da": ["呜哇呜哇","滴答滴答","嗷呜嗷呜"]}
}

表达式:{$.data}.getClass().getName() 获取值为java.util.LinkedHashMap
表达式:{$.data.he}.getClass().getName() 获取值为java.lang.String

表达式:{$.data.he}.getClass().getSampleName() 获取值为string

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部