『動善時』JMeter基礎 — 30、JMeter中JSON斷言詳解

JMeter中有個元件叫做斷言(Assertion),它的作用和LoadRunner中的檢查點類似。用於檢查測試中得到的響應數據是否符合預期,用以保證性能測試過程中的數據交互與預期一致。

若介面的返回的Response Body為JSON格式數據,使用JSON斷言組件來判斷測試結果是較好的選擇,判定也更靈活一些。

1、JSON斷言組件介面詳解

添加JSON斷言組件操作:選中「取樣器」右鍵 —> 添加 —> 斷言 —> JSON斷言

介面如下圖所示:

image

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)測試計劃內包含的元件

添加元件操作步驟

  1. 創建測試計劃。
  2. 創建執行緒組:選中「測試計劃」右鍵 —> 添加 —> 執行緒(用戶) —> 執行緒組
  3. 在執行緒組裡面,添加取樣器「HTTP請求」組件:選中「執行緒組」右鍵 —> 添加 —> 取樣器 —> HTTP請求
  4. 在取樣器下,添加斷言「JSON斷言」組件:選中「取樣器」右鍵 —> 添加 —> 斷言 —> JSON斷言
  5. 在取樣器下,添加監聽器「斷言結果」組件:選中「取樣器」右鍵 —> 添加 —> 監聽器 —> 斷言結果
  6. 在執行緒組裡面,添加監聽器「察看結果樹」組件:查看結果,選中「執行緒組」右鍵 —> 添加 —> 監聽器 —> 察看結果樹

最終測試計劃中的元件如下:

image

點擊運行按鈕,會提示你先保存該腳本,腳本保存完成後會直接自動運行該腳本。

(2)登陸介面請求介面內容

標準的Post請求,填寫請求的基本資訊和參數即可。

編寫內容如下:

image

(3)JSON斷言介面內容

我們需要根據JSON Path,從返回的JSON數據中提取需要判斷的實際結果。再設置預期結果,兩者進行比較得出斷言結果。

  • JSON斷言介面中我們要編寫JSONPath表達式,來從響應體數據中找到需要的數據。
  • 然後要勾選Additionally assert value選項。
  • 最後在Expected Value填寫預期值。

以上是通用步驟,編寫好的JSON斷言如下圖所示:

image

說明JSON斷言的模式

JSON斷言可以對伺服器返回的JSON文檔進行驗證,JSON斷言有兩種使用模式:

  1. 根據JSONPath表達式,能否在JSON文檔中找到路徑。也就是只關注路徑存不存在,不管值找的對不對。
  2. 根據JSONPath表達式提取值,並對值進行驗證。

JSON斷言的判斷方式

  • 若文檔格式為非JSON,則斷言失敗。(重點)
  • 若找不到JSONPath路徑,則斷言失敗。(重點)
  • 若JSONPath表達式找到提取值,且沒有設置預期值,則斷言通過。
  • 若JSONPath表達式找到提取值,且與預期值不一致,則斷言失敗。(重點)
  • 若JSONPath表達式找到提取值,且與預期值一致,則斷言通過。
  • 若JSONPath表達式找到提取值是一個數組,迭代判斷是否有提取值與預期值匹配,有則通過,沒有則失敗。

(4)查看運行結果

我們在察看結果樹組件中,觀察腳本運行之後的結果。

如果斷言正確,和正常發送請求一樣,如下圖:

image

如果斷言失敗,則會出現斷言失敗的提示,如下圖所示:

image

(5)斷言結果組件說明

也添加斷言結果監聽器,通過斷言結果組件來判斷斷言是否通過。

如下圖所示:

image

說明:

  • 已通過的斷言僅顯示取樣器名稱。
  • 未通過的,除了顯示取樣器的名稱,還顯示錯誤原因。

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語法如下表:

image

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
    }
  }
}

具體示例如下表:

image

參考: