轉:JMeter測試WebSocket的經驗總結

 最近有一個微信聊天系統的項目須要性能測試,既然是測試微信聊天,確定繞不開websocket接口的測試,首選工具是Jmeter,網上能搜到現成的方法,可是網上提供的jar包每每不是最新的,既然是用最新版本的Jmeter4.0,那麼所依賴的插件jar包也應該追求新的。因此提供瞭如下連接供你們下載(甚至連源碼都提供):html

(1)Jmeter工具linux

(2)websocket請求模板 JMeterWebSocketSamplers web

(3)jetty-http正則表達式

(4)jetty-ioshell

(5)jetty-utilapache

(6)websocket-apiwindows

(7)websocket-client後端

(8)websocket-commonapi

將(2)~(4)中下載的jar包放到Jmeter如下目錄下,就可以被調用了:瀏覽器

#將你下載的全部jar包,複製到
apache-jmeter-4.0\lib\ext
#該目錄下
1、啓動JMeter

windows環境打開 bin下的jmeter.bat
linux環境打開bin下的jmeter.sh

因爲Jmeter4.0的界面是深色的(看不清字體),默認語言是英語,咱們能夠調一下。先修改語言:在bin\jmeter.properties中找到#language=en,將前面的註釋【#】去掉,改成language=zh_CN。這樣啓動後就是中文版的,而後到選項-->外觀中選擇Metal,這就變成傳統Jmeter樣式。

2、添加websocket Sampler

先在測試計劃中添加線程組,而後右鍵添Sampler時就能看到websocket的模板:

 

經常使用的就是websocket request-response Sampler(鏈接+發送data或者只發data),其次是WebSocket Open Connection(只鏈接,不發送data)

配置舉例以下:

 

說明:(1)Connection:有兩項,第一項是使用已有鏈接,就是上一個websocket請求所創建的鏈接通道,選擇後Server URL全置灰只讀不可操做。第二項是新建鏈接通道。

(2)Server URL:能夠發送ws協議和wss協議(加密的websocket),以上圖的配置所對應的鏈接串以下:

ws://192.18.24.211:8888/testPath   (這一點比舊版本的websocket插件配置要清晰明瞭)

(3)Data:支持文本(包括JSON)和Binary二進制數據的發送。默認請求響應的超時時間爲6S,超過這個時間報錯。(對於Data的文本格式最好是本身抓包獲取,好比谷歌瀏覽器的F12開發者工具或Fiddler,不要太相信開發提供的接口文檔)。

3、使用小技巧

一、Path和Requst data要注意編碼格式

websocket發送數據到後端,與http請求的原理是相通的,因此發送的數據若是含有很是字符,如"/"、"+"、"%"、引號等,就會引發解析錯誤,因此須要特別注意,好比:

 

如上所示,websocket請求的上一個請求TR-token能夠獲取一個token串(經過正則表達式提取器提取),而這個串的格式多是這樣的:Ivj6eZRx40+MTx2Zv/G8nA,能夠發現含有"+"、"/"字符,而咱們須要把這個串做爲Path的一部分來發送,那麼咱們就須要對${token}變量進行URL轉碼,用到jmeter的函數 __urlencode()

二、能夠經過邏輯控制器來模擬羣發消息

(1)經過循環控制器調取參數化文件(CSV)裏的用戶信息表來實現羣發消息,以下所示:

 

(2)或者先經過發送請求來獲取用戶信息(正則表達式提取),再用ForEach調取用戶組變量發送消息,以下所示:

 

三、以時間戳來查看當前聊天記錄應注意websocket的response延時

在併發的狀況下,websocket請求延時可能要遠大於http請求,好比延時2秒以上(從發送消息到看到聊天面板已通過了2秒以上)。因此在jmeter中用時間戳函數${__time(,)}來表示最新一條聊天記錄的時間是不可靠的。咱們應該在websocket請求中插入正則表達式提取器,經過在response中獲取其時間才能確保消息接收時間準確(即不要用客戶端時間來判斷你的聊天時間)。

(1)先提取websocket反饋的服務端時間戳

 

(2)再做爲查詢當前聊天記錄的時間戳依據

 

四、最後說一下jmeter4.0,若是是要作分佈式測試,jmeter4.0默認是要求RMI傳輸必須SSL加密的,不然jmeter-server就啓動不了,咱們能夠用簡單的配置來回避這個問題。就是server端和client端的jmeter咱們統一作以下配置:

(1)用編輯器打開bin/user.properties文件
(2)找到server.rmi.ssl.disable,將#註釋符去掉,改爲 server.rmi.ssl.disable=true

如今能夠奔跑了,我直接用如下shell腳本實如今linux下分佈式調用jmeter-server進行測試,並生成html報告:

#!/bin/bash
testAPI="websocket-test.jmx" #jmeter測試腳本
Cur_Dir=$(cd "$(dirname "$0")"; pwd)
sed -i "s/csvData\\\/csvData\//g" $Cur_Dir/jmeter4.0/bin/${testAPI} #替換參數路徑斜槓\爲/
$Cur_Dir/jmeter4.0/bin/jmeter -n -t $Cur_Dir/jmeter4.0/bin/${testAPI} -R 172.16.1.67,172.16.5.241 -l $Cur_Dir/DashReport/log-$(date -d "today" +"%Y%m%d%H%M%S").csv -e -o $Cur_Dir/DashReport/htmlReport-$(date -d "today" +"%m%d%H%M%S")
       另外測試還開啓了jmeter監控工具(influxDB+grafana),具體安裝配置方式參見個人另外一篇文章《關於Jmeter長時間壓測的可視化監控報告》(區別是這篇文章用的是windows版的,而我此次測試用的是Linux版的,網上有相關下載,開源工具)。

       添加配置後,監控後的效果以下:

 

 補充:除了經常使用的WebSocket Open Connection和WebSocket request-response 這兩個Sampler,WebSocket Single Read Sampler也比較經常使用,通常是用在羣聊消息已讀回執的發送。好比在微信羣裏發一條消息,經過抓包分析,能夠看到客戶端是發出了兩條消息(同時服務端也回發了兩條消息),以下所示:

 

 第二條消息表示發送消息已讀回執,按以往的方式,咱們須要經過正則表達式提取器提取第一條消息的返回值,而後發送第二條消息,這樣的效率就不高,咱們能夠直接用WebSocket Single Read Sampler來模擬消息的已讀回執:

相關文章
相關標籤/搜索