『動善時』JMeter基礎 — 35、JMeter介面關聯【JSON提取器】詳解

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

1、JSON提取器介紹

相信做過自動化測試的朋友經常會遇到這樣的場景:我想呼叫系統中的某個業務介面,但是需要先登入系統。也就是現在很多介面的訪問,都是需要登入介面的token做為基礎。

在JMeter中先訪問登入介面,使用後置處理器提取出來token或者Cookie的值,然後將該值帶到後續的業務介面中,這時就會用到JSON提取器元件。

為什麼要用 JSON 提取器

  • JSON是目前大多數介面響應內容的資料格式。
  • 在介面測試中,不同介面之間可能會有資料依賴,在JMeter中可以通過後置處理器來提取介面的響應內容。
  • JSON 提取器是其中一個可以用來提取響應內容的元件。

2、JSON提取器介面詳解

新增JSON提取器元件操作:選中“取樣器”右鍵 —> 新增 —> 後置處理器 —> JSON提取器

介面如下圖所示:

image

下面是JSON提取器元件的詳細說明:

  • 名稱JSON提取器元件的自定義名稱,見名知意最好。
  • 註釋:即新增一些備註資訊,對該JSON提取器元件的簡短說明,以便後期回顧時檢視。

(1)Apply to:作用範圍(返回內容的取值範圍)

  • Main sample and sub-samples:作用於父節點的取樣器及對應子節點的取樣器。
  • Main sample only:僅作用於父節點的取樣器。(選預設的 main sample only 就行了)
  • Sub-samples only:僅作用於子節點的取樣器。
  • JMeter Variable Name to use:作用於JMeter變數(輸入框內可輸入JMeter的變數名稱),從指定變數中提取需要的值。

(2)第二部分內容

  • Names of created variables:定義引用提取值的變數名,後面介面中使用${變數名}引用,必填項。
  • JSON Path expression:填寫JSON Path表示式,用來提取某個值。必填項。
  • Match No.(0 for Random):表示取值是第幾個匹配結果,因為有可能XPath表示式會匹配到多個值。0表示隨機,-1表示全部,1代表第一個,2代表第二個,以此類推。(非必填項)
  • Compute concatenation var(suffix_ALL):勾選此項後,如果匹配到多個結果,JMeter會使用,將他們連線起來,儲存在的變數中,會自動命名為<variable name>_ALL
  • Default Values:預設值,如果JSON Path表示式匹配不到值的時候,將使用該預設值。(非必填項)

3、JSON提取器的使用

需求:使用者登入系統,並在系統中查詢個人資訊。

實現思路:

  1. 登陸系統,記錄Cookie資訊。
  2. 提取出使用者的ID資訊。
  3. 保持登陸的狀態,根據使用者ID,查詢使用者資訊。

(1)測試計劃內包含的元件

新增元件操作步驟

  1. 建立測試計劃。
  2. 建立執行緒組:選中“測試計劃”右鍵 —> 新增 —> 執行緒(使用者) —> 執行緒組
  3. 線上程組裡面,新增配置原件“HTTP Cookie管理器”元件:選中“執行緒組”右鍵 —> 新增 —> 配置元件 —> HTTP Cookie管理器
  4. 線上程組下,新增取樣器“HTTP請求”元件:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> HTTP請求
  5. 在取樣器下,新增後置處理器“JSON提取器”元件:選中“取樣器”右鍵 —> 新增 —> 後置處理器 —> JSON提取器
  6. 線上程組下,新增監聽器“察看結果樹”元件:選中“執行緒組”右鍵 —> 新增 —> 監聽器 —> 察看結果樹

提示:需要重複新增的元件這裡不重複描述。

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

image

點選執行按鈕,會提示你先儲存該指令碼,指令碼儲存完成後會直接自動執行該指令碼。

(2)HTTP Cookie管理器內容

什麼都不用填寫,保持原樣即可。

image

簡單說明一下:

  • JMeter中自動收集的Cookie,是不會在HTTP Cookie管理器中進行展示的,但是執行後通過檢視結果樹可以檢視到Cookie資訊,接受到的Cookie會被自動儲存線上程變數中。(使用Debug Sampler元件檢視)
  • HTTP Cookie管理器會自動記錄每一個請求所產生的Cookie,在後邊對同源站點進行的請求中,都可以自動的使用對應Cookie進行傳送。

(3)使用者登陸請求介面內容

傳送一個標準POST請求,引數格式為JSON,這裡就不做解釋了。

介面內容如下圖所示:

image

(4)JSON提取器介面內容

我們在編輯JSON提取器元件之前,一般先請求一下需要提取返回資料的介面。

因為我們需要先檢視一下需要提取的資料在什麼位置,同時我們也能夠提前編寫一下JSON Path表示式。

如下圖所示:

image

然後選擇JSON Path Tester檢視模式,先手動編寫JSON Path表示式,看看是否能夠取到需要的資料。

如下圖所示:

image

之後我們就可以編寫JSON提取器元件介面了,如下:

編寫引用名稱、JSON表示式、匹配資料選擇,如下圖:

image

提示:如果要獲取多個元素,則可以在HTTP請求元件中,加入多個後置處理器來提取需要的值。即:每一個後置處理器只能獲取一個值。

JSON提取器元件提取出來的資料,會儲存線上程變數中,供其他後續介面使用。

(5)檢視使用者資訊請求頁面內容

填寫介面的基本請求資訊,然後把JSON提取器提取出來的資料,作為引數化變數應用到請求中。

如下圖所示:

image

(6)檢視結果

我們可以看到在第二個請求中,拿到了第一個請求提取出來的使用者ID資料。

如下圖所示:

image

再來看看第二個請求響應的結果,可以看到對應使用者的資訊我們已經查詢到了。

image

提示:可以新增Debug PostProcessor(除錯後置處理器),或者Debug Sampler(除錯取樣器),來檢視JSON提取器中,提取出的內容是否正確。

注意:正常跑用例時刪除或禁用它們。

4、總結

JSON提取器通常在介面返回是JSON格式的資料,並提取資料時用的比較多。提取完引數後,相當於把引數以 key-value 的形式放到引數池,以便後面的請求使用。

注意:不能超前引用。

5、補充:JSON Path表示式說明

JSON提取器用於提取請求返回結果中的某個值或者某一組值,用法比正規表示式要簡單,標準寫法為$.key,其中key為返回結果map中的一個鍵,如果是多層則繼續用.key進行即可,如果遇到key的value值為一個List,則使用.key[n],其中n為list中元素的編號。

image

常用JSON Path表示式使用例項,如下:

  1. 獲取第一層中的某個屬性的值:$.key
  2. 獲取List中某個key的value值:$.result[0].name
  3. 獲取列表中的某個列表的屬性值:$.result[1].approver[0]
  4. 獲取一個列表下全部的某一個元素:$.result[*].name
  5. 獲取N個值:
    取前兩條資料:$.result.records[2].id
    取後兩條資料:$.result.records[-2].id
  6. 提取特定條件的某個值:$.result.records[?(@.object_id==0)].id
  7. 獲取固定條件下的多個key的value值:$.result.records[?(@.object_id==0)].["id","name","is_active"]

參考:https://blog.csdn.net/df0128/article/details/86535117

相關文章