1、JSON提取器介紹
相信做過自動化測試的朋友經常會遇到這樣的場景:我想調用系統中的某個業務接口,但是需要先登錄系統。也就是現在很多接口的訪問,都是需要登錄接口的token做為基礎。
在JMeter中先訪問登錄接口,使用后置處理器提取出來token或者Cookie的值,然后將該值帶到后續的業務接口中,這時就會用到JSON提取器組件。
為什么要用 JSON 提取器
- JSON是目前大多數接口響應內容的數據格式。
- 在接口測試中,不同接口之間可能會有數據依賴,在JMeter中可以通過后置處理器來提取接口的響應內容。
- JSON 提取器是其中一個可以用來提取響應內容的元件。
2、JSON提取器界面詳解
添加JSON提取器組件操作:選中“取樣器”右鍵 —> 添加 —> 后置處理器 —> JSON提取器
。
界面如下圖所示:
下面是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提取器的使用
需求:用戶登錄系統,並在系統中查詢個人信息。
實現思路:
- 登陸系統,記錄Cookie信息。
- 提取出用戶的ID信息。
- 保持登陸的狀態,根據用戶ID,查詢用戶信息。
(1)測試計划內包含的元件
添加元件操作步驟:
- 創建測試計划。
- 創建線程組:
選中“測試計划”右鍵 —> 添加 —> 線程(用戶) —> 線程組
。 - 在線程組里面,添加配置原件“HTTP Cookie管理器”組件:
選中“線程組”右鍵 —> 添加 —> 配置元件 —> HTTP Cookie管理器
。 - 在線程組下,添加取樣器“HTTP請求”組件:
選中“線程組”右鍵 —> 添加 —> 取樣器 —> HTTP請求
。 - 在取樣器下,添加后置處理器“JSON提取器”組件:
選中“取樣器”右鍵 —> 添加 —> 后置處理器 —> JSON提取器
。 - 在線程組下,添加監聽器“察看結果樹”組件:
選中“線程組”右鍵 —> 添加 —> 監聽器 —> 察看結果樹
。
提示:需要重復添加的組件這里不重復描述。
最終測試計划中的元件如下:
點擊運行按鈕,會提示你先保存該腳本,腳本保存完成后會直接自動運行該腳本。
(2)HTTP Cookie管理器內容
什么都不用填寫,保持原樣即可。
簡單說明一下:
- JMeter中自動收集的Cookie,是不會在HTTP Cookie管理器中進行展示的,但是運行后通過查看結果樹可以查看到Cookie信息,接受到的Cookie會被自動存儲在線程變量中。(使用
Debug Sampler
組件查看) - HTTP Cookie管理器會自動記錄每一個請求所產生的Cookie,在后邊對同源站點進行的請求中,都可以自動的使用對應Cookie進行發送。
(3)用戶登陸請求界面內容
發送一個標准POST請求,參數格式為JSON,這里就不做解釋了。
界面內容如下圖所示:
(4)JSON提取器界面內容
我們在編輯JSON提取器組件之前,一般先請求一下需要提取返回數據的接口。
因為我們需要先查看一下需要提取的數據在什么位置,同時我們也能夠提前編寫一下JSON Path
表達式。
如下圖所示:
然后選擇JSON Path Tester
視圖模式,先手動編寫JSON Path
表達式,看看是否能夠取到需要的數據。
如下圖所示:
之后我們就可以編寫JSON提取器組件界面了,如下:
編寫引用名稱、JSON表達式、匹配數據選擇,如下圖:
提示:如果要獲取多個元素,則可以在HTTP請求組件中,加入多個后置處理器來提取需要的值。即:每一個后置處理器只能獲取一個值。
JSON提取器組件提取出來的數據,會存儲在線程變量中,供其他后續接口使用。
(5)查看用戶信息請求頁面內容
填寫接口的基本請求信息,然后把JSON提取器提取出來的數據,作為參數化變量應用到請求中。
如下圖所示:
(6)查看結果
我們可以看到在第二個請求中,拿到了第一個請求提取出來的用戶ID數據。
如下圖所示:
再來看看第二個請求響應的結果,可以看到對應用戶的信息我們已經查詢到了。
提示:可以添加
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中元素的編號。
常用JSON Path
表達式使用實例,如下:
- 獲取第一層中的某個屬性的值:
$.key
。 - 獲取List中某個key的value值:
$.result[0].name
。 - 獲取列表中的某個列表的屬性值:
$.result[1].approver[0]
。 - 獲取一個列表下全部的某一個元素:
$.result[*].name
。 - 獲取N個值:
取前兩條數據:$.result.records[2].id
。
取后兩條數據:$.result.records[-2].id
。 - 提取特定條件的某個值:
$.result.records[?(@.object_id==0)].id
。 - 獲取固定條件下的多個key的value值:
$.result.records[?(@.object_id==0)].["id","name","is_active"]
。