前言
做接口測試的時候,大部分情況下返回的是json數據,我們需要對返回的json斷言。
當返回的數據量比較大,並且嵌套的層級很深的時候,很多小伙伴不會取值,往往在返回結果取值上浪費很多時間,於是就有了jsonpath解析庫,專門解決json路徑深,取值難的問題。
字典取值
對接口返回的json,轉成dict類型,通過字典鍵值對取值
#返回結果,下面是dict
result = {
"code": 0,
"data": [
{
"age": 20,
"create_time": "2019-09-15",
"id": 1,
"mail": "283340479@qq.com",
"name": "xiaohua",
"sex": "M"
},
{
"age": 21,
"create_time": "2019-09-16",
"id": 2,
"mail": "123445@qq.com",
"name": "tree",
"sex": "M"
}
],
"msg": "success!"
}
assert result["code"]==0
assert result["msg"]=="success!"
assert result["data"][0]["name"]=="xiaohua"
assert result["data"][1]["name"]=="xiaohua"
運行結果

當層級越來越深的時候,會發現取值變得困難,並且list里面的內容往往不知道是第幾個
比如我想判斷返回的結果連有沒有"name":"xiaohua",並且你不知道它是data列表中的第幾個,這種情況斷言就寫的很復雜了
正則取值
比如我想判斷返回的結果里面有沒有"name":"xiaohua" 並且你不知道它是data列表中的第幾個,這種情況斷言就寫的很復雜了。
可以用萬能的正則取值,正則只能是針對字符串取值,dict對象先轉json字符串。
#返回結果,下面是dict
import json
import re
result = {
"code": 0,
"data": [
{
"age": 20,
"create_time": "2019-09-15",
"id": 1,
"mail": "283340479@qq.com",
"name": "xiaohua",
"sex": "M"
},
{
"age": 21,
"create_time": "2019-09-16",
"id": 2,
"mail": "123445@qq.com",
"name": "tree",
"sex": "M"
}
],
"msg": "success!"
}
#斷言result中包含"name": "xiaohua"
j=json.dumps(result) #字典轉json
print(type(j))
#方法1,正則取值
rename=re.findall("name\": \"(.+?)\"",j)
#rename=re.findall('"name": "(.+?)"',j)
print(type(rename),rename)
assert "xiaohua" in rename
#方法2 直接判斷包含
#assert "\"name\": \"xiaohua\"" in j
assert '"name": "xiaohua"' in j
運行結果

jsonpath解析
接下來講一個非常強大並且方便的jsonpath專門用於json解析,解決路徑深的老大難問題!
先安裝依賴包
pip install jsonpath
學習jsonpath不得不提到xpath,這兩者之間的語法是差不多的

使用示例
$是查找的根節點,傳參就是python的dict類型,當查找到的時候返回一個list結果,查找失敗的時候返回False
#返回結果,下面是dict
import jsonpath
result = {
"code": 0,
"data": [
{
"age": 20,
"create_time": "2019-09-15",
"id": 1,
"mail": "283340479@qq.com",
"name": "xiaohua",
"sex": "M"
},
{
"age": 21,
"create_time": "2019-09-16",
"id": 2,
"mail": "123445@qq.com",
"name": "tree",
"sex": "M"
}
],
"msg": "success!"
}
c=jsonpath.jsonpath(result,'$.code')
print(c)
name=jsonpath.jsonpath(result,'$..name')
print(name)
o=jsonpath.jsonpath(result,'$..msgg')
print(o)
運行結果

這樣就可以不用管層級也能取值了。
