Performance Testing Service的JMeter壓測功能依賴Apache JMeter產生的指令碼。本文以JMeter WebSocket Samplers外掛程式為例,介紹如何在本地使用Apache JMeter編寫、調試壓測指令碼,並在PTS中完成WebSocket協議的壓測情境。
方案概覽
使用Apache JMeter產生WebSocket壓測指令碼並在PTS中完成壓測,共需以下五步:
1. 安裝外掛程式JMeter WebSocket Samplers
下載JMeter WebSocket Samplers,建議下載最新版本(本樣本中使用 JMeterWebSocketSamplers-1.2.10.jar)。
將下載的外掛程式.jar包存放在<JMeter安裝目錄>/lib/ext路徑下。
重要在PTS中發起壓測時,此處下載的外掛程式.jar包需要上傳到PTS。
重啟Apache JMeter,並按照以下步驟確認外掛程式是否安裝成功。
按右鍵Test Plan,選擇Add > Config Element,可看到新增的配件元件選項WebSocket Binary Frame Filter、WebSocket Ping/Pong Frame Filter和WebSocket Text Frame Filter。

按右鍵Test Plan,選擇 Add > Assertions,可看到新增的斷言選項 Binary Response Assertion。

按右鍵Test Plan,選擇Add > listener > View Results Tree,在編輯頁面左下方的下拉式清單中,可看到新增的選項Binary。

按右鍵Test Plan,選擇Add > Threads(Users) > Thread Group,按右鍵Thread Group,選擇Add > Sampler,可看到以下新增的採樣器選項。
重要因為WebSocket是長串連流式通訊,所以可能存在發送一個請求收到多條響應的情況。收到的響應會以先後順序排在一個響應隊列中。當執行一個有讀操作的Sampler時,就從隊列頭部取出一個響應;每當收到一個響應時,就將其放到隊列尾部。
WebSocket Single Read Sampler是一個唯讀Sampler,它只從隊列頭部讀取一個響應,如果讀不到就等待,直至逾時。
WebSocket Single Write Sampler是一個唯寫Sampler,它只向串連通道發送一個請求且不等待響應。
WebSocket Request Response Sampler是一個讀寫Sampler,它向串連通道發送一個請求,然後從響應隊列頭部讀取一個響應,如果讀不到就等待,直至逾時。
如果放置的讀Sampler和寫Sampler數量不合適,可能會出現讀到的資料錯位的現象。
關於本文沒有涉及的代理、過濾、分區等資訊,請參見 JMeter WebSocket Samplers 外掛程式介紹。
2. 建立指令碼
這裡將示範如何在測試情境中添加並配置Sampler。以下為簡單樣本,您可以根據業務需要進行調整。
按右鍵Test Plan,選Add > Thread (Users) > Thread Group,將一個線程組添加到測試計劃中。
在Thread Group中依次添加以下採樣器(Sampler),並進行配置。
Sampler名稱
說明
WebSocket Open Connection
建立一個WebSocket串連
WebSocket Ping/Pong
控制幀,發送Ping並接收Pong
WebSocket request-response Sampler
發送和接收文本或二進位WebSocket幀
WebSocket Single Write Sampler
發送文本或二進位WebSocket幀
WebSocket Single Read Sampler
接收文本或二進位WebSocket幀
WebSocket Close
關閉WebSocket串連
按右鍵Thread Group,選擇Add > Sampler > WebSocket Open Connection。
說明Server URL配置請替換成您的待測服務配置。這裡使用Python搭建一個簡易的WebSocket服務來做示範。這是一個Echo服務,因此發送到此服務的所有訊息都將回顯給用戶端。
server.py範例程式碼import asyncio import websockets async def echo(websocket, path): async for message in websocket: message = "Your message: {}".format(message) await websocket.send(message) asyncio.get_event_loop().run_until_complete(websockets.serve(echo, '0.0.0.0', 8080)) asyncio.get_event_loop().run_forever()按右鍵Thread Group,選擇Add > Sampler > WebSocket Ping/Pong。
說明Pong(read)timeout(ms):6000
Pong(讀)逾時表示如果JMeter在6000ms內沒有收到Pong訊息,則Sampler將失效。此Sampler會複用已有串連。
按右鍵Thread Group,選擇Add > Sampler > WebSocket request-response Sampler。

配置項
樣本值
說明
Connection
use existing connection
建立新的串連或複用已有串連。
資料類型
Text
指定資料類型、請求資料和響應逾時值。
Request data
PTS
請求資料,這裡以文本為例
Response (read) timeout (ms)
6000
響應逾時時間
按右鍵Thread Group,選擇Add > Sampler > WebSocket Single Write Sampler。此請求是非阻塞的,只是將資料發送到服務端不需要等待響應。

配置項
樣本值
說明
Connection
use existing connection
建立新的串連或複用已有串連。
資料類型
Text
指定資料類型。
Request data
PTS bang bang bang
請求資料,這裡以文本為例。
按右鍵 Thread Group,選擇Add > Sampler > WebSocket Single Read Sampler。接收服務端的訊息響應需要使用這個Sampler。

配置項
樣本值
說明
Connection
use existing connection
建立新的串連或複用已有串連。
資料類型
文本
指定資料類型。
Response (read) timeout (ms)
6000
響應逾時時間。
按右鍵Thread Group,選擇Add > Sampler > WebSocket Close。此採樣器將關閉現有的WebSocket串連,由於是協商關閉,響應訊息為:
1000:sampler requested close。
配置項
樣本值
說明
Close Status
1000
關閉串連時定義的狀態代碼,資料幀的頭兩個位元組
Response (read) timeout (ms)
6000
響應逾時時間
(可選)如果您需要在通訊中添加Token等Header,單擊Thread Group,選擇Add > ConfigElement > HttpHeaderManager,線上程組中添加配置元件HttpHeaderManager,並添加對應的Header。具體詳情,請參見JMeter官方文檔。
按右鍵Thread Group,選擇Add > Listener > View Results Tree,線上程組中添加監聽器View Results Tree。
3. 調試指令碼
指令碼編輯完成後,單擊頁面頂部的開始按鈕,運行指令碼。
通過View Results Tree監聽器查看指令碼是否運行正常。在該監聽器中,如果Sampler前面有綠色對勾表示運行正常。如出現運行異常的Sampler,請參見2. 建立指令碼進行調試。
部分樣本結果如下:
WebSocket request-response Sampler
根據指令碼配置,Request資訊如下:

根據指令碼配置,Text格式的Response data如下:

WebSocket Single Read Sampler
根據指令碼配置,Text格式的Response data如下:

4. 匯出指令碼
當本地指令碼調試成功後,選擇頂部功能表列的File > Save Test Plan as,將指令檔儲存至本地,並命名為wsTest.jmx。
5. 建立JMeter壓測情境並啟動壓測
登入PTS控制台,選擇效能測試 > 建立情境,然後單擊JMeter壓測。
配置情境
輸入情境名,並上傳匯出的
wsTest.jmx檔案。指令碼上傳成功後,PTS將自動進行外掛程式補全。如果補全失敗,您可單擊上傳檔案,添加下載的JMeter WebSocket Samplers的JAR包(本文使用
JMeterWebSocketSamplers-1.2.10.jar)和其他資料檔案,例如CSV格式的參數檔案等。
施壓配置
最大虛擬使用者數配置為
10,壓測時間長度和遞增時間長度配置2分鐘。其他配置保持預設即可。發起壓測涉及費用問題,建議您合理選擇施壓量級,如需瞭解更多資訊,請參見計費概述、壓力模式與量級配置。
調試並啟動壓測
調試情境可驗證配置是否合理,避免壓測失敗,建議您先調試情境。
單擊儲存去壓測,在溫馨提示頁面,選擇立即執行並勾選確認本次壓測已獲得准許並遵守當地法律,然後單擊啟動壓測。
關於在PTS中進行JMeter壓測的更多資訊,請參見建立JMeter情境。
分析壓測結果
壓測結束後,系統會自動擷取壓測資料,例如壓測情境指標、業務詳情資料、監控詳情資料和API採樣日誌等,產生壓測報告。更多資訊,請參見查看JMeter壓測報告。