在之前的的章節已經簡單介紹了如何斷言接口的響應值,在實際工作過程中,json 的響應內容往往十分復雜,面對復雜的 json 響應體,主要通過 JSONPath 解決。JSONPath 提供了強大的 JSON 解析功能,使用它自帶的類似 XPath 的語法,可以更便捷靈活的用來獲取對應的 JSON 內容。
環境準備
Python/ target=_blank class=infotextkey>Python 版本安裝
pip install jsonpath
JAVA 版本安裝
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.6.0</version>
</dependency>
https://qrcode.ceba.ceshiren.com/link?from=toutiao&name=toutiao&project_id=qrcode&author=anlinger
XPath 和 JSONPath 語法
下表是 XPath 和 JSONPath 語法進行對比,這兩者的定位方式,有著非常多的相似之處:
image1020×1134 41.3 KB
比如同樣一個字段,XPath 中的語法是:
/store/book[0]/title
JSONPath 的語法是:
$.store.book[0].title
$['store']['book'][0]['title']
下面是一組 json 結構,分別通過 JSONPath 和 XPath 的方式提取出來
{
"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
}
}
}
下表列出了 XPath 與 JSONPath 的對比:
1034×1044 44.6 KB
更多內容請訪問:
https://goessner.NET/articles/JsonPath
https://qrcode.ceba.ceshiren.com/link?from=toutiao&name=toutiao&project_id=qrcode&author=anlinger
實戰練習
以下是 測試人生 | 從外包菜鳥到測試開發,薪資一年翻三倍,連自己都不敢信!(附面試真題與答案) 這個接口的正常響應值(因響應篇幅過長,刪除了部分內容):
{
'post_stream': {
'posts': [
{
'id': 17126,
'name': '思寒',
'username': 'seveniruby',
'avatar_template': '/user_avatar/ceshiren.com/seveniruby/{size}/2_2.png',
'created_at': '2020-10-02T04:23:30.586Z',
'cooked': '<p>一直以來的平均漲薪率在30%以上,這次刷新的記錄估計要保持好幾年了</p>',
'post_number': 6,
'post_type': 1,
'updated_at': '2020-10-02T04:23:48.775Z',
'reply_to_post_number': None,
'reads': 651,
'readers_count': 650,
'score': 166.6,
'yours': False,
'topic_id': 6950,
'topic_slug': 'topic',
'display_username': '思寒',
'primary_group_name': 'python_12',
...省略...
},
],
},
'timeline_lookup': ,
'suggested_topics':,
'tags': [
'精華帖',
'測試開發',
'測試求職',
'外包測試'
],
'id': 6950,
'title': '測試人生 | 從外包菜鳥到測試開發,薪資一年翻三倍,連自己都不敢信!(附面試真題與答案)',
'fancy_title': '測試人生 | 從外包菜鳥到測試開發,薪資一年翻三倍,連自己都不敢信!(附面試真題與答案)',
}
接下來則需要實現一個請求,斷言以上的響應內容中 name 字段為’思寒’所對應的 cooked 包含"漲薪"
Python 演示代碼
JSONPath 斷言
import requests
from jsonpath import jsonpath
r = requests.get("https://ceshiren.com/t/topic/6950.json").json()
result = jsonpath(r, "$..posts[?(@.name == '思寒')].cooked")[1]
assert "漲薪" in result
Java 演示代碼
JSONPath 斷言
import com.jayway.jsonpath.JsonPath;
import org.junit.jupiter.api.Test;
import java.util.List;
import static io.restassured.RestAssured.given;
public class jsonTest {
@Test
void jsonTest() {
//獲取響應信息,并轉成字符串類型
String res = given().when().
get("https://ceshiren.com/t/topic/6950.json")
.then().extract().response().asString();
//通過jsonpath表達式提取需要的字段
List<String> result = JsonPath.read(res, "$..posts[?(@.name == '思寒')].cooked");
// 斷言驗證
assert result.get(1).contains("漲薪");
}
}
https://qrcode.ceba.ceshiren.com/link?from=toutiao&name=toutiao&project_id=qrcode&author=anlinger