大家好,我是狂師。
在之前分享中,給大家介紹過一篇:如何快速稽核介面返回值全部欄位解決方案,詳見原文:介面自動化測試,一鍵快速校驗介面返回值全部欄位 。當時,提到解決這類問題,市面上常見的解決方案有兩種:
- 根據業務校驗需求,自定義開發校驗規則庫
- 藉助現有的第三方庫
而文章中介紹到的方案,就是藉助現有的第三方庫來實現:DeepDiff
。對於一些特殊業務或者複雜的測試場景來說,這類通用方案,總會有一些需求無法滿足。因此往往還需要根據這類業務校驗需求,自定義開發校驗規則庫。
我們今天不講如何開發一款自定義開發校驗規則庫,而是給大家分享一款在開發自定義校驗規則庫或者常規的介面自動化測試時,經常會用到的一款資料提取神器:JSonPath
。
1. JSonPath介紹
JSonPath是一種簡單的方法來提取給定JSON
文件的部分內容。 JSonPath有許多程式語言,如Javascript
,Python
和PHP
,Java
等。
JSonPath提供的json解析非常強大,它提供了類似正規表示式的語法,基本上可以滿足所有你想要獲得的JSON內容。
專案地址:
https://github.com/json-path/JsonPath
一句話概括:JsonPath就是用來解析提取Json資料用的。
2. JSonPath語法
JSONPath
是參照,Xpath表示式來解析XML文件的方式,JSON資料結構通常是匿名的並且不一定需要有根元素。JSONPaht 用一個抽象的名字$來表示最外層物件,即$ 代表整個JSON資料的值。
JSonpath的語法如下:jsonpath.jsonpath()
-
引數:json物件,jsonpath表示式
-
返回值:列表
JSONPath 表示式可以使用. 符號如下:
$.store.book[0].title
或者使用[] 符號
$['store']['book'][0]['title']
JSONPath 允許使用萬用字元 * 表示所以的子元素名和陣列索引,還允許使用 '..' 。
表示式在下面的指令碼語言中可以使用顯示的名稱或者索引:
$.store.book[(@.length-1)].title
使用'@'符號表示當前的物件,?(<判斷表示式>) 使用邏輯表示式來過濾。
$.store.book[?(@.price > 100)].title
其中XPath和JSONPath語法區別如下:
需要額外注意的是:
- []在xpath表示式總是從前面的路徑來運算元組,索引是從1開始。
- 使用JOSNPath的[]操作符操作一個物件或者陣列,索引是從0開始。
3. JsonPath實戰使用
安裝:
pip install jsonpath
例如:待提取的json資料變數名為: json_datas
。
json_datas = {"store": {
"book": [
{ "category": "測試開發技術",
"author": "狂師",
"title": "關注公眾號:測試開發技術",
"price": 129
},
{ "category": "自動化測試",
"author": "狂師1",
"title": "《自動化測試實戰寶典》",
"price": 109
},
{ "category": "Python",
"author": "狂師2",
"title": "Python實戰教程",
"isbn": "0-110-234567-30",
"price": 99
},
{ "category": "Java",
"author": "狂師3",
"title": "小白學Java",
"isbn": "0-13095-19295-8",
"price": 89
}
],
"info": {
"color": "red",
"price": 88
}
}
}
1. 查詢book下面所有的author
import jsonpath
datas = jsonpath.jsonpath(json_datas, '$.store.book[*].author')
print(datas)
輸出結果為:['狂師', '狂師1', '狂師2', '狂師3']
上述提取表示式,可以改為如下:
datas = jsonpath.jsonpath(json_datas, '$..author')
print(datas)
具備同等效果,輸出所有author,結果同樣為:['狂師', '狂師1', '狂師2', '狂師3']
2. 查詢store下面book所有節點資料
datas = jsonpath.jsonpath(json_datas, '$.store.book.*')
print(datas)
輸出結果為:
[{'category': '測試開發技術', 'author': '狂師', 'title': '關注公眾號:測試開發技術', 'price': 129}, {'category': '自動化測試', 'author': '狂師1', 'title': '《自動化測試實戰寶典》', 'price': 109}, {'category': 'Python', 'author': '狂師2', 'title': 'Python實戰教程', 'isbn': '0-110-234567-30', 'price': 99}, {'category': 'Java', 'author': '狂師3', 'title': '小白學Java', 'isbn': '0-13095-19295-8', 'price': 89}]
3. 查詢book下面第三個book
datas = jsonpath.jsonpath(json_datas, '$.store.book[2]')
print(datas)
輸出結果為:
[{'category': 'Python', 'author': '狂師2', 'title': 'Python實戰教程', 'isbn': '0-110-234567-30', 'price': 99}]
4. 查詢book下面最後個book,返回的是一個列表
datas = jsonpath.jsonpath(json_datas, '$.store.book[(@.length-1)]')
print(datas)
輸出結果:
[{'category': 'Java', 'author': '狂師3', 'title': '小白學Java', 'isbn': '0-13095-19295-8', 'price': 89}]
5.查詢 book下面前3本書
datas = jsonpath.jsonpath(json_datas, '$.store.book[0,2]')
print(datas)
輸出結果為:
[{'category': '測試開發技術', 'author': '狂師', 'title': '關注公眾號:測試開發技術', 'price': 129}, {'category': 'Python', 'author': '狂師2', 'title': 'Python實戰教程', 'isbn': '0-110-234567-30', 'price': 99}]
6. 查詢所有的包含isbn這個鍵的所有book
datas = jsonpath.jsonpath(json_datas, '$.store.book[?(@.isbn)]')
print(datas)
輸出結果為:
[{'category': 'Python', 'author': '狂師2', 'title': 'Python實戰教程', 'isbn': '0-110-234567-30', 'price': 99}, {'category': 'Java', 'author': '狂師3', 'title': '小白學Java', 'isbn': '0-13095-19295-8', 'price': 89}]
7. 查詢價格大於100的所有書
datas = jsonpath.jsonpath(json_datas, '$.store.book[?(@.price>100)]')
print(datas)
輸出結果:
[{'category': '測試開發技術', 'author': '狂師', 'title': '關注公眾號:測試開發技術', 'price': 129}, {'category': '自動化測試', 'author': '狂師1', 'title': '《自動化測試實戰寶典》', 'price': 109}]
4. 最後,JsonPath小技巧
最後再給大家推薦一個技巧,如果一開始對JSONPath表示式不太熟悉,可以將需要提取的JSON資料,通過jsonpath線上解析工具測試一下,線上解析JSONPath網址很多,例如:
http://www.e123456.com/aaaphp/online/jsonpath/
在介面自動化測試中,只有你懂得利用好JSONPath
,那麼至少可以讓你在自動化測試資料提取這塊,隨心所欲的提取自己要想的資料。
好了,今天的乾貨分享就到這了,你學會了嗎?