1. 程式人生 > >jmeter下的websocket自動化與壓力測試

jmeter下的websocket自動化與壓力測試

最近新接手了個websocket專案,訊息模式有點類似聊天室的操作。

沒有辦法確定response的內容和時間。在網上搜了一圈,也沒有找到類似的科普文章。

在這裡寫一篇文章記錄一下問題和解決情況。

希望能拋磚引玉,把這個問題攻克下來。

 

首先,準備jmeter環境和websocket的支援庫。

相關操作在簡書《JMeter測試WebSocket的經驗總結》一文中可以找到。原文地址:

https://www.jianshu.com/p/bb8b3e928607

感謝 smooth00 大神的引用授權。

 

測試場景:

1.多名使用者加入房間。

2.房間人數為固定人數(比如4人) 

3.有人進入時,進入使用者會收到反饋當前房間人員列表。

4.其他人會收到反饋新加入使用者的資訊訊息。

5.當人數已滿時,會自動推送訊息給所有人。

6.在人滿後,每個人需要按固定序列,傳送訊息。

7.所有人傳送特定訊息後,推進房間狀態,返回新的一組資訊。

 

jmeter的邏輯結構

建立連線

迴圈1開始

  進入房間

  迴圈2開始

    接受訊息

    解析訊息

    if(訊息格式符合條件1)

      執行動作1

    if(訊息格式符合條件2)

      執行動作2

      設定迴圈2控制變數,跳出迴圈

    ...

  迴圈2結束

 迴圈1結束

 

 

在整個編輯過程中,踩了幾個小坑。

1.使用者自定義變數 不可修改

問題場景:在控制迴圈2的跳出條件時,直接使用了【使用者自定義變數】來定義控制迴圈2的變數,結果,總是無法正確觸發跳出迴圈。查詢資料才知道【使用者自定義變數】是會只讀一次的型別。

解決方案:修改為【使用者引數】,解決問題。

2.while迴圈和if判定的條件格式

問題場景:同樣是用於條件格式,只有if強調了需要使用 __jexl3() 來計算語句邏輯,最終必須為true格式。

然後在實際使用中發現,while的判斷也需要類似的需求。

最初填寫的內容為  ${x}==a  ,此處由於  ${x} 不為 null 或false,就直接驗證為成功了。

之後嘗試修改 ${x}的值,仍然無法正確跳出迴圈,再加上問題1,導致浪費了很多時間。

解決方案:通過修改為 ${__jexl3(${notInRoom}==1,)},強制邏輯計算,解決手問題。

3.變數格式不一致,導致的判斷異常

問題場景:同樣是if判斷,在判斷中,由於字元變數的表現格式,在jmeter和java中的差異導致。

原本的判斷型別為變數 stage 的值是否為字串 settle。開始使用 ${__jexl3( ${stage} == settle,)},總是無法正確獲取判斷結果。

解決方案:修改兩側格式為字串,${__jexl3( "${stage}" == "settle",)},解決問題。

4.固定定時器的延時狀態會導致接受訊息的時機被錯過。

問題場景:原本為了放緩程式碼的重新整理速度(除錯階段,太多了看不過來),在迴圈中添加了【固定定時器】延時。

結果在延時的過程中,經常會丟掉一些關鍵資訊,導致本地邏輯無法繼續。

解決方案:加長 response timeout的時長,代替延時