Jmeter對Web Socket進行壓力測試 —— 200人直播課實戰經驗
最近接到一個任務,是爲直播課進行500人壓力測試。而我們的上課是通過Web Socket長連接的。之前沒有接觸過Web Socket,也沒要來接口文檔。就一點點自己摸索,也算完成了這次任務。
- Jmeter的WebSocket Sampler
- Chrome查看WebSocket會話
- 設計jmx腳本(實戰)
- 開始測試
- 總結
- 參考文章
Jmeter的WebSocket Sampler
Jmeter有一個WebSocket採樣器插件,需要額外下載。除了JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar還需要6個依賴文件,可以直接從這裏下載。 —— [ 沃·茲基索德 ]
1.簡單介紹一下Sample Socket組件的界面
1) IP & Port: 訪問地址和端口號 2) Timeout (Connection & Response): 連接超時和響應超時時間 3) Protocol: 協議分ws和wss(wss更安全,具體要看你的測試對象使用的是什麼協議) 4) Connection Id: 連接ID (*重要!就是通過這個來區分不同會話) 5) Streaming connection: 保持長連接(*重要!不勾選的話,請求成功就會斷開連接) 6) Request data: 請求內容 7) Message backlog: 保留返回結果的數量(如果希望只保留最新一條,可以設定爲1)
2.嘗試發起WebSocket請求。
這裏有一個第三方開放的接口可供學習使用。網址: https://www.websocket.org/echo.html
當然,我們可以在Jmeter上完成相同的請求。需求是建立2個websocket會話。第1個會話發出3條消息,第2個會話發出2條消息。1) 添置5個WebSocket Sampler,按照上一步圖中內容填好。 2) 將前3個採樣器的Connection Id填入1,將後2個採樣器的Connection Id填入2 3) 添置監視器,運行後查看結果。
我們可以看到第5個採樣器的Message count是2,第4個採樣器建立了新的會話,第5個採樣器請求時,連接還沒中斷。
*Jmeter執行完成後,會斷開所有連接。
Chrome查看WebSocket會話
Chrome就可以查看WebSocket會話,而且十分方便。當然也可以用Fiddler查看WebSocket會話,有興趣的可以百度一下。但是Web端建議使用Chrome,直觀方便。
還是拿剛纔的https://www.websocket.org/echo.html做例子。我們用Chrome訪問這個網址,然後用以下方式查看ws會話。
1) 按F12調出開發者工具,刷新頁面 2) 選擇Network 3) 開啓篩選器Filter 4) 選擇ws,就可以看到WebSocket請求了 5) 點擊一個請求,右側會彈出詳細會話 6) Frames裏面就是會話Log了
綠色向上箭頭是我們發出的,紅色箭頭是我們收到的。如果你是要做接口測試,而你又沒有文檔。那你可以通過手動在頁面操作,同時觀察Frames中的請求內容。然後用Jmeter去模擬請求這些內容。
設計jmx腳本(實戰)
設計一個能完成需求的腳本。
測試方案:
a) 用一臺負載機分別模擬,無學生、50個學生、100個學生、200個學生同時上課的情況。如果結果可以接受,繼續增加上課學生。 b) 用一臺客戶機分別登錄老師和單個真實學生,查看課堂情況。 c) 監控服務器資源佔用情況。(本次教程不涉及)
實現方案:
a) Jmeter 發起Web Socket請求,最基本連接請求外,額外學生髮言一次,並且每25秒循環請求一次保持長連接。
1.根據剛纔學到的用Chrome可以看到WebSocket會話方法。我獲取到學生進入直播課WS接口最基本的3個東西。
1) 協議&地址&端口&query參數組成的URL
2) Headers頭信息
2.新建一個Jmeter腳本,添加HTTP信息頭管理器和WebSocket Sampler。然後填入基本信息。
1) 頭信息可以直接從Chrome全複製下來一鍵粘進HTTP信息頭管理器。
2) URL填入這幾個地方。
3.其實這個時候應該就可以正確建立連接了。但是我們希望學生上課,要傳達這個信息給服務器。就需要傳入請求參數。
其實不難發現,進入教室就是紅框裏的三個綠色箭頭,也就是說我們要上課,至少要請求3次。之後的綠色箭頭判斷下來請求內容無實際意義,作用之後會提到。
4.將WebSocket Sampler 複製3個,分別把Chrome裏三次請求的請求內容填進去。這樣一個基本的ws腳本就構成了。
5.當時寫完這個我請求了一次是ok的。但是jmx腳本執行完成後,學生就掉線了。也就是說需要jmx腳本一直不停的執行下去。
6.之前Chrome中有一些紅框外的綠箭頭,之前介紹過WebSocket有一個超時機制,我們可以看到這些請求之間都恰巧間隔25秒(這裏截圖沒截好)。我們需要模擬這個動作,來保證長連接不會斷開。也就是就算什麼都不做,也每隔25秒請求一次。
7.同時我發現,200個學生,用5個線程20個循環跑是不不正確的。因爲1個線程的多次循環代表一個線程的生命週期裏先後代表了個多個學生,但是一個學生執行完後就會退出,所以不正確。所以需要200個線程,同時每個線程加定時器後不斷循環。
8.最終腳本設計如下
a) 線程組設定線程數50、100、200,循環爲1。 b) 用戶參數前置處理器 生成區分不同學生的id、name、Connection Id。注意勾選"每次迭代更新一次"。 c) 1-5 2-5 3-5 是進入教室的基本請求 d) 4-5 是學生髮言(手動瀏覽器發言一次,獲取到發言操作的接口請求內容) e) 循環控制器勾選永遠。 f) 5-5 在循環控制器下的循環,並設定定時器,間隔25秒。
9.最終實現目標
開始測試
使用負載機執行腳本。使用客戶機登錄老師和學生,分屏查看雙方音畫和聊天的延遲情況和卡頓情況。
由於時間關係就不展開了。
總結
在昨天之前,我還完全沒接觸過Web Socket。所以起初接到這個任務是一臉懵逼的。不過通過查找教程和學習原理,最終還是實現了。所以記錄一下學習過程和學習方法。
我的學習過程如下:
a)百度WebSocket介紹 關鍵詞 b)百度Jmeter WebSocket 關鍵詞 c)百度WebSocket 抓包 關鍵詞 d)整合資料,根據第三方開放接口寫Demo(如果本地可以模擬服務端,也可以使用Mock測試方法) e)運用到項目上,寫一個Demo,加上參數化 f)設計滿足需求的測試腳本 g)讀取數據庫,並保存用戶信息到文件,實現一個複用性高的測試腳本。
仍然存在的問題:
a)運用csv參數化用戶信息或_csvRead函數都會卡住,還沒解決。但是本次測試用id累計曲線救國了。 b)有時WebSocket會掉線,比如請求了200個學生,但最終會掉線十幾個。原理還不清楚。
參考文章
原來你是這樣的Websocket–抓包分析
https://blog.csdn.net/zara0830/article/details/80380873Jmeter進行webSocket接口測試
https://www.cnblogs.com/penghaihang/p/7724830.html