目錄
前言
WebSocket介紹
HTTP與WebSocket的區(qū)別
二者關(guān)系
WebSocket測試方法
使用Postman
使用Jmeter
使用Python
結(jié)語
前言
隨著Web應(yīng)用的日益普及,WebSocket作為一種全雙工通信協(xié)議,在移動端、游戲、視頻會議等方面得到廣泛應(yīng)用。
而對于需要實時通信的Web應(yīng)用來說,WebSocket接口測試是非常重要的一環(huán)。然而,許多測試人員在進行WebSocket接口測試時,可能會遇到很多困惑和挑戰(zhàn)。這些問題包括如何模擬WebSocket消息、如何進行連接和斷開操作以及如何驗證返回結(jié)果等。
今天,我將分享一些關(guān)于WebSocket接口測試的心得和技巧,幫助大家更好地掌握這個技能,無論你是初學者還是有經(jīng)驗的測試人員,相信這篇文章都會給你帶來不少啟發(fā)。
WebSocket介紹
WebSocket 是一種基于在單個 TCP 連接上進行全雙工通信的協(xié)議,是從HTML5開始提供的一種瀏覽器與服務(wù)器之間進行全雙工通訊的網(wǎng)絡(luò)技術(shù),解決了HTTP協(xié)議不適用于實時通信的缺點,相較于 HTTP 協(xié)議,WebSocket 協(xié)議實現(xiàn)了持久化網(wǎng)絡(luò)通信,可以實現(xiàn)客戶端和服務(wù)端的長連接,能夠進行雙向?qū)崟r通信,協(xié)議名為"ws"。
HTTP與WebSocket的區(qū)別
- 兩者都是基于TCP協(xié)議進行數(shù)據(jù)傳輸,具有可靠的傳輸能力,而且都是應(yīng)用層協(xié)議
- HTTP是單向的通信,只能由客戶端向服務(wù)端發(fā)送請求,服務(wù)端無法主動向客戶端發(fā)送消息
- WebSocket是雙向通信,客戶端和服務(wù)端是通過握手建立連接,可實現(xiàn)全雙工通信,雙方可以同時主動向?qū)Ψ桨l(fā)送消息
- WebSocket在建立連接時數(shù)據(jù)是通過HTTP協(xié)議傳輸?shù)模墙⒅螅嬲齻鬏敂?shù)據(jù)時使用的是更加可靠的TCP協(xié)議
二者關(guān)系
- WebSocket在建立連接時,HTTP通過Upgrade消息頭來通知客戶端需要采用WebSocket協(xié)議來完成這個請求,在發(fā)送完此響應(yīng)最后的空行后,服務(wù)器就會切換到WebSocket協(xié)議,接口返回狀態(tài)碼為
101
,表示服務(wù)器已經(jīng)理解了客戶端的請求,需要升級協(xié)議
WebSocket測試方法
使用在線工具
在線工具有很多,自行百度吧!個人習慣用這個工具
使用Postman
Postman支持測試WebSocket協(xié)議的接口,此文章發(fā)布時還處于公測階段,需要登錄后才能使用,入口如下圖所示
操作跟測試HTTP請求類似,不過多介紹啦!如下圖所示
使用Jmeter
使用Jmeter既可以單獨測接口,也可以進行性能測試,但測試WebSocket協(xié)議需要安裝插件,下載插件后放到Jmeter安裝路徑中的lib/ext
目錄下,重啟Jmeter后在【選項】菜單中會出現(xiàn)【Plugins Manager】,然后在可用插件Tab頁搜索WebSocket,進行安裝即可,如下圖所示
安裝后新建【線程組】,在添加【取樣器】中會出現(xiàn)6項WebSocket的組件
- WebSocket Close:用于關(guān)閉WebSocket連接
- WebSocket Open Connection:只建立WebSocket連接,不發(fā)送數(shù)據(jù)
- WebSocket Ping/Pong:用于心跳檢測,為了保持長連接,防止客戶端被服務(wù)端判定為不活躍而被斷開
- WebSocket Single Read Sampler:用于接收一個(文本或二進制)數(shù)據(jù)
- WebSocket Single Write Sampler:用于發(fā)送一個(文本或二進制)數(shù)據(jù)
- WebSocket request-response Sampler:用于執(zhí)行基本的請求和響應(yīng)交換,既能發(fā)送數(shù)據(jù)又可以接收數(shù)據(jù)
若有使用過Jmeter就肯定能明白這些組件的使用方法,以WebSocket request-response Sampler為例,頁面信息介紹如下圖所示
使用Python
首先需要安裝websocket-client
pip install websocket-client
對于只是測試WebSocket接口發(fā)送接收消息是否正常,不需要長時間連接,可以使用下面的短連接方法,在請求結(jié)束后會主動斷開連接
from websocket import create_connection
user1 = create_connection("ws://localhost:6688/1") # 用戶1打開連接
user2 = create_connection("ws://localhost:6688/2") # 用戶2打開連接
print("獲取響應(yīng)狀態(tài)碼:", user1.getstatus()) # 正常應(yīng)返回101
print("獲取響應(yīng)頭:", user2.getheaders())
user1.send("你好呀!") # 用戶1向服務(wù)端發(fā)送消息
res1 = user1.recv() # 查看服務(wù)端推送的消息
res2 = user2.recv()
if res1 == res2:
print("服務(wù)端消息推送成功!\n")
else:
print("消息獲取異常!\n")
print("查看用戶1收到的消息:",res1,"\n查看用戶2收到的消息:",res2)
若是要對WebSocket接口做持續(xù)監(jiān)聽工作,需要長連接,但不需要傳參,只是監(jiān)聽消息,使用WebSocketApp類就更合適啦!方法如下
import websocket
def on_open(ws): # 定義用來處理打開連接的方法
print("打開連接")
def on_message(ws, message): # 定義用來監(jiān)聽服務(wù)器返回消息的方法
print("監(jiān)聽到服務(wù)器返回的消息,:\n", message)
def on_error(ws, error): # 定義用來處理錯誤的方法
print("連接出現(xiàn)異常:\n", error)
def on_close(ws): # 定義用來處理斷開連接的方法
print("關(guān)閉連接")
if __name__ == "__main__":
websocket.enableTrace(True) # 可選擇開啟跟蹤,在控制臺可以看到詳細的信息
ws = websocket.WebSocketApp("ws://localhost:6688",
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.run_forever() # 調(diào)用run_forever方法,保持長連接
還可以使用Pytest對WebSocket接口實現(xiàn)自動化測試,示例如下
import pytest
from websocket import create_connection
class TestDyd():
url = "ws://localhost:6688"
@classmethod
def setup_class(cls):
cls.ws = create_connection(cls.url) # 建立連接
cls.ws.settimeout(5) # 設(shè)置超時時間
def test_connect(self):
# 通過狀態(tài)碼判斷連接是否正常
assert self.ws.getstatus() == 101
def test_send(self):
params = "你好呀!" # 定義傳參
self.ws.send(params) # 發(fā)送請求
result = self.ws.recv() # 獲取響應(yīng)結(jié)果
print("收到來自服務(wù)端的消息:", result) # 打印響應(yīng)結(jié)果
# 因為該測試項目傳參會顯示在響應(yīng)中,所以通過判斷傳參是否在響應(yīng)結(jié)果中進行斷言
assert params in result
if __name__ == '__main__':
pytest.main(["-vs"])
傳參可以使用@pytest.mark.parametrize()
裝飾器,示例如下
import pytest
from websocket import create_connection
class TestDyd():
data = [("/user/2", "今天開直播賣魚!?。。?),("/user/3", "魚可以買來放生嗎?"),
("/user/4", "那條翻白肚的魚有死亡證明嗎?"),("/user/5", "你的魚會唱歌嗎?"),
("/user/6", "你的魚上大學了嗎?"),("/user/7", "你的魚買回來需要隔離嗎?")]
@pytest.mark.parametrize("user, word", data)
def test_send(self, user, word):
ws = create_connection("ws://localhost:6688"+user)
params = word
ws.send(params) # 發(fā)送請求
result = ws.recv() # 獲取響應(yīng)結(jié)果
print("來自服務(wù)端的消息:", result)
assert params in result # 斷言
先簡單介紹這些吧,關(guān)于Python腳本,可以參考官方文檔,里面有示例和常見問題解決方法
結(jié)語
這篇貼子到這里就結(jié)束了,最后,希望看這篇帖子的朋友能夠有所收獲。文章來源:http://www.zghlxwxcb.cn/news/detail-492998.html
如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強動力!文章來源地址http://www.zghlxwxcb.cn/news/detail-492998.html
到了這里,關(guān)于測試人必備技能:如何進行WebSocket接口測試?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!