通過Apache JMeter和對應的插件編寫腳本,并在PTS中上傳這些腳本、插件JAR包和其他相關文件,即可發起壓測。 本文以JMeter WebSocket Samplers插件為例,主要介紹如何在本地使用Apache JMeter編寫、調試壓測腳本,以實現WebSocket協議的業務場景壓測。
前提條件
已有正在運行的WebSocket服務。本示例使用Python搭建一個簡易的WebSocket服務來做演示。
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()
使用python server.py
運行服務端程序。
背景信息
WebSocket的插件較多,本文僅以JMeter WebSocket Samplers為例。JMeter WebSocket Samplers具有以下特性:
提供了六種WebSocket Sampler,這些Sampler不會新建額外的線程,節省資源。
支持WSS (WebSocket over TLS)。
JMeter的SSLManager能設置WSS,包括客戶端證書。
支持二進制的WebSocket數據幀。
支持二進制響應的斷言。
View Results Tree里可以查看二進制結果。
支持使用JMeter的Header Manager設置WebSocket Upgrade Request上額外的HTTP Header。
支持使用JMeter的Cookie Manager設置升級協議的請求里的Cookie。
支持代理。
支持過濾數據幀。
關于本文沒有涉及的代理、過濾、分片等信息,請參見 JMeter WebSocket Samplers 插件介紹。
操作步驟如下:
步驟一:安裝插件JMeter WebSocket Samplers
下載JMeter WebSocket Samplers,建議下載最新版本。本示例中使用 JMeterWebSocketSamplers-1.2.10.jar
將下載的插件.jar包存放在<JMeter安裝目錄>/lib/ext路徑下。
重要在PTS中發起壓測時,此處下載的插件.jar包需要上傳到PTS。請參見步驟五:上傳腳本、插件JAR包和其他文件至PTS進行壓測。
重啟JMeter。
重啟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,選擇 ,可看到以下新增的采樣器選項,具體說明如下。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連接
重要因為WebSocket是長連接流式通訊,所以可能存在發送一個請求收到多條響應的情況。收到的響應會以先后順序排在一個響應隊列中。當執行一個有讀操作的Sampler時,就從隊列頭部取出一個響應;每當收到一個響應時,就將其放到隊列尾部。
WebSocket Single Read Sampler是一個只讀Sampler,它只從隊列頭部讀取一個響應,如果讀不到就等待,直至超時。
WebSocket Single Write Sampler是一個只寫Sampler,它只向連接通道發送一個請求且不等待響應。
WebSocket Request Response Sampler是一個讀寫Sampler,它向連接通道發送一個請求,然后從響應隊列頭部讀取一個響應,如果讀不到就等待,直至超時。
如果放置的讀Sampler和寫Sampler數量不合適,可能會出現讀到的數據錯位的現象。
步驟二:創建腳本
這里將演示如何在測試場景中添加并配置Sampler。以下為簡單示例,您可以根據業務需要進行調整。
在JMeter頁面中,右鍵單擊Test Plan,選 ,將一個線程組添加到測試計劃中。
在線程組中依次添加采樣器(Sampler),并進行配置。右鍵單擊Thread Group,選擇 。當前的Sampler將建立WebSocket連接。
相關的配置如下:
配置項
示例值
說明
協議
WS
協議可以是WS或WSS(Secure WebSocket)。使用WSS進行加密連接。
Server name or IP
echo.example.com
域名或IP
Port
8080
端口
Path
-
可為空
Connection timeout(ms)
20000
建連的超時時間
Read timeout(ms)
6000
等待服務器響應的超時時間
右鍵單擊Thread Group,選擇 。該Sampler用來測試Ping/Pong功能。
相關配置如下:
Pong(讀)超時(ms):6000
Pong(讀)超時表示如果JMeter在6秒內沒有收到Pong消息,則Sampler將失效。此Sampler會復用已有連接。
右鍵單擊Thread Group,選擇 。
相關配置如下:
配置項
示例值
說明
Connection
use existing connection
創建新的連接或復用已有連接。
數據類型
文本
指定數據類型、請求數據和響應超時值。
Request data
PTS
請求數據,這里以文本為例
Response (read) timeout (ms)
6000
響應超時時間
右鍵單擊Thread Group,選擇 。此請求是非阻塞的,只是將數據發送到服務端不需要等待響應。
相關配置如下:
配置項
示例值
說明
Connection
use existing connection
創建新的連接或復用已有連接
數據類型
文本
指定數據類型、請求數據和響應超時值
Request data
PTS
請求數據,這里以文本為例
Response (read) timeout (ms)
6000
響應超時時間
右鍵單擊 Thread Group,選擇 。接收服務端的消息響應需要使用這個Sampler。
相關配置如下:
配置項
示例值
說明
Connection
use existing connection
創建新的連接或復用已有連接
數據類型
文本
指定數據類型、請求數據和響應超時值
Response (read) timeout (ms)
6000
響應超時時間
右鍵單擊Thread Group,選擇 。接收服務端的消息響應需要使用這個Sampler。
相關配置如下:
配置項
示例值
說明
Close Status
二進制
關閉連接時定義的狀態碼,數據幀的頭兩個字節
Response (read) timeout (ms)
6000
響應超時時間
此采樣器將關閉現有的WebSocket連接,由于是協商關閉,顯示原因為“1000:sampler requested close”。
如果您需要在通信中添加Token等Header,右鍵單擊Thread Group,選擇JMeter官方文檔。 ,在線程組中添加配置元件HttpHeaderManager,并添加對應的Header。具體詳情,請參見
右鍵單擊Thread Group,選擇 ,在線程組中添加監聽器View Results Tree。接收服務端的消息響應需要使用這個Sampler。
步驟三:運行腳本
腳本編輯完成后,單擊頁面頂部的開始按鈕,運行腳本。
通過View Results Tree監聽器查看腳本是否運行正常。在左側導航樹中,選擇View Results Tree,檢查所有Sampler是否都配置正確并符合預期。在該監聽器中,如果Sampler前面有綠色對勾表示運行正常。
如出現運行異常的Sampler,請參見步驟二:創建腳本進行調試。
部分示例結果如下:
WebSocket request-response Sampler
根據腳本配置,Request信息如下:
根據腳本配置,Text格式的Response data如下:
WebSocket Single Read Sampler
根據腳本配置,Text格式的Response data如下:
步驟四:導出腳本
當本地腳本調試成功后,選擇頂部菜單欄的
,將腳本文件保存至本地。步驟五:上傳腳本、插件JAR包和其他文件至PTS進行壓測
您需準備以下文件,上傳到PTS:
導出的JMeter腳本(.jmx文件)。
JMeter WebSocket Samplers的JAR包。
(可選)腳本中使用的其他數據文件。
關于在PTS中壓測的操作步驟,請參見創建JMeter場景。