一、jsonpath
之前我寫接口自動化測試時候,對於復雜的json返回,會使用jsonpath這個第三方庫,就像寫xpath一樣,方便的查詢json元素。
因為之前寫WEB自動化時候,總用xpath去查找元素,所以用起來非常順手。
這里是github上的鏈接,感興趣的童鞋也可以去學習一下:jsonpath
二、jmespath
不過httprunner使用的是另一個第三方庫jmespath,這個我還是第一次聽。大概看了下好像也很不錯,這里是github鏈接和官方教程。
github地址
官方教程
1. 基礎表達式
①. 對於字典,可以直接輸入key來獲取到對應的value。(注意,search是jmespath提供的查詢方法,第一個參數是查詢語法,第二個則是要查詢的數據)
import jmespath
dic_1 = {"a": "foo", "b": "bar", "c": "baz"}
path = jmespath.search("a", dic_1)
print(path)
#運行結果
D:\Daily\whatisyeild>python jmespath_demo.py
foo
如果索引的key不存在,那么會返回null,或者等效於null的語言,比如在Python中返回就是None。
import jmespath
dic_1 = {"a": "foo", "b": "bar", "c": "baz"}
path = jmespath.search("d", dic_1)
print(path)
#運行結果
D:\Daily\whatisyeild>python jmespath_demo.py
None
②. 實際中接口的返回值很多是多層嵌套的,比如我要獲取最里面一層的value,可以這樣查詢:
import jmespath
dic_1 = {"a": {"b": {"c": {"d": "value"}}}}
path = jmespath.search("a.b.c.d", dic_1)
print(path)
#運行結果
D:\Daily\whatisyeild>python jmespath_demo.py
value
同樣,如果引用的鍵不存在,則返回null值。
2. 切片
①. 對於一個列表[],可以直接用下標查詢,類似於python中list元素訪問。(注意,索引基於0開始的)
import jmespath
# dic_1 = {"a": {"b": {"c": {"d": "value"}}}}
list_1 = ["a", "b", "c", "d", "e", "f"]
path = jmespath.search("[1]", list_1)
print(path)
#運行結果
D:\Daily\whatisyeild>python jmespath_demo.py
b
②. 字典和列表的嵌套也非常常見,同樣查詢也可以組合使用:
import jmespath
dic_1 = {"a": {
"b": {
"c": [
{"d": [0, [1, 2]]},
{"d": [3, 4]}
]
}
}}
path = jmespath.search("a.b.c[0].d[1][0]", dic_1)
print(path)
#運行結果
D:\Daily\whatisyeild>python jmespath_demo.py
1
③. 列表的切片操作,在這里也可以適用:
import jmespath
dic_1 = {"a": {
"b": {
"c": [
{"d": [0, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]},
{"d": [3, 4]}
]
}
}}
path = jmespath.search("a.b.c[0].d[1][5:10]", dic_1)
print(path)
#運行結果
D:\Daily\whatisyeild>python jmespath_demo.py
[5, 6, 7, 8, 9]
如果切片參數里的步長是負數,則可以反向切片:
import jmespath
dic_1 = {"a": {
"b": {
"c": [
{"d": [0, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]},
{"d": [3, 4]}
]
}
}}
path = jmespath.search("a.b.c[0].d[1][::-2]", dic_1)#步長是負數
print(path)
#運行結果
D:\Daily\whatisyeild>python jmespath_demo.py
[9, 7, 5, 3, 1]
上面是一些常規的用法,但是jmespath還提供了一個更強大的核心功能:Projections,可以應用於元素集合的表達式,這個另起再講。