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