jsonpath對json數據進行分析校驗做接口測試


      在做接口測試的時候, 我們需要對返回的數據進行分析校驗, 一般返回的都是json格式的數據, 怎么來解析校驗呢? 之前有看過使用遞歸遍歷json數據的, 然后找到了jsonpath, 可以很方便的對json數據進行解析分析。

jsonpath

jsonpath是一種信息抽取類庫, 是從json文檔中抽取指定信息的工具 
jsonpath對於json來說, 相當於xpath對於xml

[官方文檔地址](‘http://goessner.net/articles/JsonPath‘)

jsonpath和xpath語法對比

json結構信息, 可讀性高, 復雜度低, 非常容易匹配, 下表對應了xpath的用法

xpath jsonpath 描述
/ $ 根節點
. @ 現行節點
/ .or[] 取子節點
.. n/a 父元素
// .. 遞歸下降,所有符合條件的
* * 通配符, 表示所有元素
@ n/a 屬性訪問字符
[] [] 子元素操作符
  [,] 數組索引
n/a [start:end:step] 數組分割
[] ?() 應用過濾表達式

jsonpath例子

{ 
“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 
}

有這樣一個json數據

XPath JSONPath 結果
/store/book/author $.store.book[*].author 所有書的作者
//author $..author 所有的作者
/store/* $.store.* store的所有元素。所有的bookst和bicycle
/store//price $.store..price store里面所有東西的price
//book[3] $..book[2] 第三個書
//book[last()] $..book[(@.length-1)] 最后一本書
//book[position()<3] ..book[:2] 前面的兩本書
//book[isbn] $..book[?(@.isbn)] 過濾出所有的包含isbn的書
//book[price<10] $..book[?(@.price<10)] 過濾出價格低於10的書。
//* $..* 所有元素。
 
 
 那么如何利用jsonpath進行接口測試?
 
通常我們校驗接口有這樣幾種:
1. 判斷字段值與預期是否相等
2.判斷是否包含某字段
3.判斷數據數量是否正確
4.判斷數據格式
 
如果是數據格式校驗, 個人認為可以用jsonschema, 既然要做到整體數據格式校驗層了就應該做的完善了。后面會記錄下如何用jsonschema來進行數據格式校驗。
 
利用jsonschema對返回數據做整體校驗(數據結構, 數據類型, 數據value等):  https://www.cnblogs.com/dreamyu/p/9317721.html
 
import requests
import jsonpath

CHECK_TYPE = (
    'equal',
    'contains',
    'data_size',
    'data_type',
)
url = "http://www.lagou.com/lbs/getAllCitySearchLabels.json"
data1 = requests.get(url)
print(data1.json())

citylist = jsonpath.jsonpath(data1.json(), "$..[?(@.name=='安慶')]")
print(citylist)

# 例如我們要校驗 parentId是否等於 541 check_dic
= { 'key': 'parentId', 'check_type': 'equal', 'value': 541 } # 在jsonpath中它是去找到所有符合path規則的數據, 會以list的形式返回,所以判斷是否相等和是否包含其實是一樣的, 只要在json中找到 key=value就會返回數據 def check_json(dic, data): if dic['key'] and dic['check_type']: key = dic['key'] check_type = dic['check_type'] if check_type == 'data_size': expo = '$..%s' % key json_data = jsonpath.jsonpath(data.json(), expo) print('data_size: ' + str(len(json_data[0]))) return json_data = get_json(dic, data) if json_data: print('pass') print(json_data) else: print('false') else: print('check_dic有問題') def get_json(dic, data): # 判斷value是int 還是str if isinstance(dic['value'], int): expo = "$..[?(@.%s==%s)]" % (dic['key'], dic['value']) elif isinstance(dic['value'], str): expo = "$..[?(@.%s=='%s')]" % (dic['key'], dic['value']) json_data = jsonpath.jsonpath(data.json(), expo) return json_data check_json(check_dic, data1)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM