『動善時』JMeter基礎 — 30、JMeter中JSON斷言詳解
JMeter中有個元件叫做斷言(Assertion),它的作用和LoadRunner中的檢查點類似。用於檢查測試中得到的響應數據是否符合預期,用以保證性能測試過程中的數據交互與預期一致。
若介面的返回的Response Body
為JSON格式數據,使用JSON斷言組件來判斷測試結果是較好的選擇,判定也更靈活一些。
1、JSON斷言組件介面詳解
添加JSON斷言組件操作:選中「取樣器」右鍵 —> 添加 —> 斷言 —> JSON斷言
。
介面如下圖所示:
JSON斷言組件的詳細說明:
- 名稱:JSON斷言組件的自定義名稱,見名知意最好。
- 注釋:即添加一些備註資訊,對該JSON斷言組件的簡短說明,以便後期回顧時查看。
Assert JSON Path exists
:填寫 JSONPath 表達式。Additionally assert value
:斷言值,也就是否額外驗證根據JSONPath表達式提取的值。
如果不勾選,則驗證JSONPath表達式在JSON文檔中找到路徑。
如果勾選,則驗證根據JSONPath表達式提取的值,是否與預期值一樣。(勾選)Match as regular expression
:預期值是否可以使用正則表達式。
如果不勾選,則預期值不能使用正則表達式表示。
如果勾選,則預期值可以使用正則表達式表示。Expected Value
:填寫預期值。Expect null
:預期值為NULL。
若驗證提取的值為NULL,則勾選此項。
注意:
1)如驗證NULL值,還是需要勾選Additionally assert value
選項,否則驗證的是JSONPath表達式能否找到路徑。
2)預期值不填表示空字元,與NULL不等價。Invert assertion (will fail if above conditions met)
:若勾選,表示對斷言結果取反。
注意:預期值除了NULL外,還有一種特殊的值,就是空數組。這時預期值不能不填,需要設置為
[]
,表示空數組。
2、JSON斷言組件的使用
我們以一個登陸介面,來演示JSON斷言組件的應用。
(1)測試計劃內包含的元件
添加元件操作步驟:
- 創建測試計劃。
- 創建執行緒組:
選中「測試計劃」右鍵 —> 添加 —> 執行緒(用戶) —> 執行緒組
。 - 在執行緒組裡面,添加取樣器「HTTP請求」組件:
選中「執行緒組」右鍵 —> 添加 —> 取樣器 —> HTTP請求
。 - 在取樣器下,添加斷言「JSON斷言」組件:
選中「取樣器」右鍵 —> 添加 —> 斷言 —> JSON斷言
。 - 在取樣器下,添加監聽器「斷言結果」組件:
選中「取樣器」右鍵 —> 添加 —> 監聽器 —> 斷言結果
。 - 在執行緒組裡面,添加監聽器「察看結果樹」組件:查看結果,
選中「執行緒組」右鍵 —> 添加 —> 監聽器 —> 察看結果樹
。
最終測試計劃中的元件如下:
點擊運行按鈕,會提示你先保存該腳本,腳本保存完成後會直接自動運行該腳本。
(2)登陸介面請求介面內容
標準的Post請求,填寫請求的基本資訊和參數即可。
編寫內容如下:
(3)JSON斷言介面內容
我們需要根據JSON Path,從返回的JSON數據中提取需要判斷的實際結果。再設置預期結果,兩者進行比較得出斷言結果。
- JSON斷言介面中我們要編寫JSONPath表達式,來從響應體數據中找到需要的數據。
- 然後要勾選
Additionally assert value
選項。 - 最後在
Expected Value
填寫預期值。
以上是通用步驟,編寫好的JSON斷言如下圖所示:
說明JSON斷言的模式:
JSON斷言可以對伺服器返回的JSON文檔進行驗證,JSON斷言有兩種使用模式:
- 根據JSONPath表達式,能否在JSON文檔中找到路徑。也就是只關注路徑存不存在,不管值找的對不對。
- 根據JSONPath表達式提取值,並對值進行驗證。
JSON斷言的判斷方式:
- 若文檔格式為非JSON,則斷言失敗。(重點)
- 若找不到JSONPath路徑,則斷言失敗。(重點)
- 若JSONPath表達式找到提取值,且沒有設置預期值,則斷言通過。
- 若JSONPath表達式找到提取值,且與預期值不一致,則斷言失敗。(重點)
- 若JSONPath表達式找到提取值,且與預期值一致,則斷言通過。
- 若JSONPath表達式找到提取值是一個數組,迭代判斷是否有提取值與預期值匹配,有則通過,沒有則失敗。
(4)查看運行結果
我們在察看結果樹組件中,觀察腳本運行之後的結果。
如果斷言正確,和正常發送請求一樣,如下圖:
如果斷言失敗,則會出現斷言失敗的提示,如下圖所示:
(5)斷言結果組件說明
也添加斷言結果監聽器,通過斷言結果組件來判斷斷言是否通過。
如下圖所示:
說明:
- 已通過的斷言僅顯示取樣器名稱。
- 未通過的,除了顯示取樣器的名稱,還顯示錯誤原因。
3、JSON與JSON Path的簡單說明
(1)JSON
JSON(JavaScript Object Notation
)是一種輕量級的數據交換格式。
JSON數據容易理解,便於閱讀和編寫,同時電腦也易於解析和生成,所以JSON有廣泛的應用。
JSON常用數據結構:
-
對象(object)格式:
{ "name": "zhangsan", "sex": 1, "age": 25 }
-
數組(Array)格式:
{ "man": [ { "name": "zhangsan", "sex": 1, "age": 21 }, { "name": "lisi", "sex": 1, "age": 18 } ], "weman": [ { "name": "wangwu", "sex": 0, "age": 25 }, { "name": "zhaoliu", "sex": 0, "age": 28 } ] }
(2)JSONPath
我們經常使用XPath來分析、轉換以及有選擇地從XML文檔中提取數據。
與XPath類似,JOSNPath可以方便的從JSON結構中發現和提取數據。
JSONPath中的「根成員對象」總是被稱為$
,無論它是對象還是數組。
JSONPath表達式有dot–notation
(.
號)和bracket–notation
([]
號)兩種不同的表示風格。
例如:
$.store.book[0].title
$['store']['book'][0]['title']
(3)JSONPath語法
JSONPath語法如下表:
JSON數據如下:
{ "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
}
}
}
具體示例如下表:
參考: