Jmeter獲取Websocket多幀訊息的實現方法

2023-09-11 06:01:15
     由於需要對WebSocket進行壓力測試,因此又迴歸到了JMeter的使用。網路上缺少具體的獲取多幀訊息的操作,且自己也踩了兩個坑,總結一下可行的操作供大家參考。
 
一、情況說明
       被測試的WebSocket會根據使用者端發起的資訊進行回覆,回覆幀數不確定。現在需要把所有回覆的內容都獲取到
 
二、工具
       經過調查,可以使用JMeter自帶的外掛WebSocket Sampler by Maciej Zaleski或者WebSocket Samplers by Peter Doornbosch。
       在JMeter的Plugin Manager裡面的Available Plugins搜尋鍵碼」WebSocket「即可搜尋出來,進行安裝。
       
       這兩個外掛都可以使用,下面以WebSocket Samplers by Peter Doornbosch的使用進行說明。
 
 
三、具體操作
      科普一下: WebSocket 以 frame 為單位傳輸資料, frame 是使用者端和伺服器端資料傳輸的最小單元, 當一條訊息過長時, 通訊方可以將該訊息拆分成多個 frame 傳送。
      那現在我們要解決的就是怎麼接收這不確定幀數的多幀內容,下面貼上返回的多幀資料樣式
      
      
      從返回訊息來看,我們可以通過判斷response值是否為空,或者flag是否等於end來判斷
 
      思路:從上面的返回資料可以看出來,我們需要使用while迴圈來獲取返回的資料。那判斷條件可以選擇判斷response值是否為空,或者flag是否等於end。下面就以response值是否為空作為條件來進行判斷。
     
     具體步驟:
          1. 我們先加入WebSocket的Open Connection,用於建立WebSocket通道
             

 

          2. 加入WebSocket Single Write Sampler,用於傳送一個(文字或二進位制)WebSocket 幀
          
           3. 加入WebSocket Single Read Sampler,用於接收一個(文字或二進位制)WebSocket 幀。在這裡我們用於接收第一幀訊息。到這個步驟,可以跑一遍,檢查是否能正常傳送和接收訊息。如果可以,再繼續下面步驟。   
            
          4. 建使用者自定義變數(即User Defined Variables)
           
 
        5. 建JSON Extractor,用於接收Websocket返回內容中json欄位的值。我這裡是返回的json,所以就用的JSON Extractor。把用於判斷的值取出來放到步驟4建立的使用者自定義變數裡面。
          
 
        6. 建迴圈(While Controller),條件寫${__jexl3("${WSresponse}"!="")},代表只要返回的值非空的情況就繼續執行迴圈裡的讀取訊息操作,即步驟7。
          
 
        7.迴圈裡建立第二個WebSocket Single Read Sampler,用於接收第二幀及其以後的訊息。
          
 
        8. 建WebSocket Close,用於正常關閉 websocket 連線。
         
 
       9.結束,執行結果:
          
 
四、下面說下踩過的坑,供大家參考
 
     1. 最大的坑:Debug Sampler
         為了偵錯,我加了幾個Debug Sampler,如圖Debug1,Debug11。
         出現了奇怪的事情,跑完以後看View Results Tree裡面的 Debug1,WSresponse 裡面有值且正確;但是檢視Debug11的WSresponse值就為空了。
         我認為是JSON Extractor的順序,以及裡面的設定」Apply to「導致,做了很多次調整都沒有解決此問題,直到把兩個Debug1,Debug11給disable了才解決。
         具體原因後續再做調查。
      
      2. while controller
          表示式寫錯了,但是沒有看JMeter的console,進入迴圈後就無限迴圈。被這個奇怪的現象困擾了很久最後才發現console裡面在報錯。
          得到的經驗是:
    • 一定要開啟console
    • while表示式寫錯了也會進入迴圈     
    •