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
}
}
}
具體示例如下表:
參考: