『動善時』JMeter基礎 — 50、使用JMeter測試WebSocket介面

繁華似錦Fighting發表於2021-06-30

因為我之前對WebSocket介面也不是很瞭解,所以本篇文章先簡單的概括的說明一下WebSocket的相關概念。在文章的後半部分,進行測試WebSocket介面的步驟說明。

1、什麼是WebSocket介面

WebSocket是一種網路通訊協議。

我們在上網過程中經常用到的是HTTP和HTTPS協議,HTTP協議和HTTPS協議的通訊過程,通常是客戶端通過瀏覽器發出一個請求,伺服器按受請求後進行處理並返回結果給客戶端,客戶端接收響應的結果。

這種機制對於資訊變化不是特別頻繁的應用,可以良好支撐。但對於實時資訊要求高、海量併發的應用來說,顯得捉襟見肘。尤其在移動網際網路蓬勃發展的趨勢下,高併發與使用者實時響,應是Web應用經常面臨的問題。比如金融證券的實時資訊、社交網路的實時訊息推送、網路直播等。

Websocket通訊協議出現前我們實現推送技術,用的都是輪詢,在特定的時間間隔,瀏覽器自動發出請求,將伺服器的訊息主動的拉回來。這種情況下,我們需要不斷的向伺服器傳送請求,這樣會佔用很多的頻寬和伺服器資源,並且伺服器不能主動向客戶端推送資料。在這種情況下需要一種高效節能的雙向通訊機制,來保證資料的實時傳輸,於是基於HTML5規範的WebSocket網路通訊協議應運而生。

WebSocket是類似Socket的TCP長連線通訊模式。一旦WebSocket連線建立後,後續資料都以幀序列的形式傳輸。在客戶端斷開WebSocket連線或Server端中斷連線前,不需要客戶端和服務端重新發起連線請求。在海量併發,及客戶端與伺服器互動負載流量大的情況下,極大的節省了網路頻寬資源的消耗,有明顯的效能優勢,且客戶端傳送和接受訊息是在同一個持久連線上發起,實時性優勢明顯。

2、為什麼需要WebSocket

初次接觸 WebSocket的人,都會問同樣的問題:我們已經有了HTTP協議,為什麼還需要另一個協議?它能帶來什麼好處?

答案很簡單,因為HTTP協議有一個缺陷:通訊只能由客戶端發起。

舉例來說,我們想了解今天的天氣,只能是客戶端向伺服器發出請求,伺服器返回查詢結果。HTTP協議做不到伺服器主動向客戶端推送資訊。

這種單向請求的特點,註定瞭如果伺服器有連續的狀態變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢",每隔一段時候,就發出一個詢問,瞭解伺服器有沒有新的資訊。輪詢的效率低,非常浪費資源。因此,工程師們一直在思考,有沒有更好的方法,WebSocket就是這樣發明的。

WebSocket的最大特點就是,伺服器可以主動向客戶端推送資訊,客戶端也可以主動向伺服器傳送資訊,是真正的雙向平等對話,屬於伺服器推送技術的一種。

WebSocket是雙向的,在客戶端和伺服器通訊的場景中使用的全雙工協議,與HTTP不同,它以ws://wss://開頭。它是一個有狀態協議,這意味著客戶端和伺服器之間的連線將保持活動狀態,直到被任何一方(客戶端或伺服器)終止,WebSocket連線才從兩端終止。

3、測試WebService介面前的準備

在JMeter中測試WebSocket協議的介面,需要先安裝WebSocket外掛和依賴包。

開啟JMeter中的外掛管理器:選項 —> Plugins Manager

提示:沒有安裝JMeter外掛管理器的,請點選後面文章連結:【JMeter外掛管理器的安裝與使用】

開啟JMeter外掛管理器後,點選Available Plugins選項頁,在搜尋框中輸入WebSocket,然後選擇安裝WebSocket Sampler by Maciej Zaleski外掛。

image

我們可以從上圖中看到在外掛的說明中,該外掛包含websocket-api.jarwebsocket-common.jarwebsocket-client.jarjetty-http.jarjetty-io.jarjetty-util.jar這6個JAR包。

這些JAR包可以使JMeter中的取樣器,傳送支援WebSocket協議的請求。

如下圖所示:

image

提示:安裝完WebSocket Sampler by Maciej Zaleski外掛後需要重啟JMeter。

4、WebSocket Sampler元件介面詳解

WebSocket Sampler元件新增方式:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> WebSocket Sampler

介面如下圖所示:

image

針對介面中各選項說明:

  • 名稱WebSocket Sampler元件的自定義名稱,見名知意最好。
  • 註釋:即新增一些備註資訊,對該WebSocket Sampler元件的簡短說明,以便後期回顧時檢視。

(1)WebServer

  1. Server Name or IP:傳送請求的目標伺服器的IP地址或者域名。
  2. Port Number:伺服器地址後的埠號,有則填寫,沒有不用填寫。

(2)Timeout (milliseconds)

  1. Connection:連結建立的最大超時時間,單位毫秒。如果達到超時時間設定後連結未建立,則sampler失敗。
  2. Response :對響應訊息的最大等待時間,單位毫秒。到達設定時間後WebSocket連結關閉。

(3)WebSocket Request

  1. Implementation:只支援RFC6455(v13) ,WebSocket協議標準的最新版。
  2. Protocol:有wswss之分。ws字首是WebSocket連線的辨別標識,wss字首是WebSocket安全連線的辨別標識。根據自己需要訪問介面的實際情況填寫。
  3. Content encoding:內容編碼。有中文推薦編寫UTF-8。
  4. Connection Id:連線ID。
  5. Path:訪問介面的路徑。
  6. Ignore SSL certificate errors:忽略SSL證書錯誤。
  7. Streaming connection:選擇TCP session要不要保持,如果勾上標識連線會一直存在,如果沒有勾上,那麼第一次響應後該連結就會被關閉。

(4)同請求一起傳送引數

  • 可以填寫key-value形式的引數。(傳送了好像不太好使,請求引數還是填寫在下面的Request data中吧)
  • Request data:填入同請求一起傳送引數,與HTTP取樣器類似,結合被測介面說明文件來進行配置。

(5)Web Socket Response:介面響應相關設定

  1. Response pattern:取樣器將等待含有該標識的訊息並繼續通訊(或者直到timeout,該連線關閉)
  2. Close connection pattern:如果伺服器返回的訊息含有填寫的字元,就結束會話。
  3. Proxy Server (currently not supported by Jetty):編輯代理伺服器資訊代(當前不支援Jetty)
    Server Name or IP:伺服器IP地址或域名。
    Port Number:埠號。
    Username:使用者名稱。
    Password:密碼。
  4. Message Backlog:定義伺服器返回訊息保留的最大長度。

5、使用JMeter測試WebSocket介面示例

我們請求一個WebSocket介面為例,進行演示。

訪問地址:echo.websocket.org

(1)測試計劃內包含的元件

新增元件操作步驟

  1. 建立測試計劃。
  2. 建立執行緒組:選中“測試計劃”右鍵 —> 新增 —> 執行緒(使用者) —> 執行緒組
  3. 線上程組中,新增取樣器WebSocket Sampler元件:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> WebSocket Sampler
  4. 線上程組中,新增監聽器“察看結果樹”元件:選中“執行緒組”右鍵 —> 新增 —> 監聽器 —> 察看結果樹

最終測試計劃中的元件如下:

image

點選執行按鈕,會提示你先儲存該指令碼,指令碼儲存完成後會直接自動執行該指令碼。

(2)WebSocket Sampler元件內容

就和編輯HTTP請求一樣,編寫必要的請求資訊和請求資料即可。

編輯WebSocket介面內容,如下圖所示:

image

(3)執行檢視結果

結果如下圖所示:

image

說明使用JMeter成功傳送WebSocket請求並且得到了響應。

參考:

相關文章