性能測試PTS的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,選擇
,可看到新增的配件元件選項WebSocket Binary Frame Filter、WebSocket Ping/Pong Frame Filter和WebSocket Text Frame Filter。右鍵單擊Test Plan,選擇
,可看到新增的斷言選項 Binary Response Assertion。右鍵單擊Test Plan,選擇
,在編輯頁面左下方的下拉列表中,可看到新增的選項Binary。右鍵單擊Test Plan,選擇
,右鍵單擊Thread Group,選擇 ,可看到以下新增的采樣器選項。重要因為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,選
,將一個線程組添加到測試計劃中。在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,選擇
。說明Server URL配置請替換成您的待測服務配置。這里使用Python搭建一個簡易的WebSocket服務來做演示。這是一個Echo服務,因此發送到此服務的所有消息都將回顯給客戶端。
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,選擇
。說明Pong(read)timeout(ms):6000
Pong(讀)超時表示如果JMeter在6000ms內沒有收到Pong消息,則Sampler將失效。此Sampler會復用已有連接。
右鍵單擊Thread Group,選擇
。配置項
示例值
說明
Connection
use existing connection
創建新的連接或復用已有連接。
數據類型
Text
指定數據類型、請求數據和響應超時值。
Request data
PTS
請求數據,這里以文本為例
Response (read) timeout (ms)
6000
響應超時時間
右鍵單擊Thread Group,選擇
。此請求是非阻塞的,只是將數據發送到服務端不需要等待響應。配置項
示例值
說明
Connection
use existing connection
創建新的連接或復用已有連接。
數據類型
Text
指定數據類型。
Request data
PTS bang bang bang
請求數據,這里以文本為例。
右鍵單擊 Thread Group,選擇
。接收服務端的消息響應需要使用這個Sampler。配置項
示例值
說明
Connection
use existing connection
創建新的連接或復用已有連接。
數據類型
文本
指定數據類型。
Response (read) timeout (ms)
6000
響應超時時間。
右鍵單擊Thread Group,選擇
。此采樣器將關閉現有的WebSocket連接,由于是協商關閉,響應消息為:1000:sampler requested close
。配置項
示例值
說明
Close Status
1000
關閉連接時定義的狀態碼,數據幀的頭兩個字節
Response (read) timeout (ms)
6000
響應超時時間
(可選)如果您需要在通信中添加Token等Header,單擊Thread Group,選擇JMeter官方文檔。
,在線程組中添加配置元件HttpHeaderManager,并添加對應的Header。具體詳情,請參見右鍵單擊Thread Group,選擇
,在線程組中添加監聽器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. 導出腳本
當本地腳本調試成功后,選擇頂部菜單欄的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壓測報告。