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

繁華似錦Fighting發表於2021-06-01

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

參考:

相關文章