每天進步一點點,關注我們哦,每天分享測試技術文章
本文章出自【碼同學軟體測試】
碼同學公衆号:自動化軟體測試
碼同學抖音号:小碼哥聊軟體測試
01
websocket協定
1、介紹
WebSocket是一種在單個TCP通信的協定。WebSocket通信協定于2011年被IETF定為标準RFC 6455,并由RFC7936補充規範。WebSocket API也被W3C定為标準。
WebSocket使得用戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向用戶端推送資料。在WebSocket API中,浏覽器和伺服器隻需要完成一次握手,兩者之間就直接可以建立持久性的連接配接,并進行雙向資料傳輸
2、原理
3、與http協定的比較
相同之處:
- 都是基于TCP的應用層協定;
- 都使用Request/Response模型進行連接配接的建立;
- 在連接配接的建立過程中對錯誤的處理方式相同,在這個階段WS可能傳回和HTTP相同的傳回碼;
- 都可以在網絡中傳輸資料。
不同之處:
- WS使用HTTP來建立連接配接,但是定義了一系列新的header域,這些域在HTTP中并不會使用;
- WS的連接配接不能通過中間人來轉發,它必須是一個直接連接配接;
- WS連接配接建立之後,通信雙方都可以在任何時刻向另一方發送資料;
- WS連接配接建立之後,資料的傳輸使用幀來傳遞,不再需要Request消息;
- WS的資料幀有序。
4、websocket應用場景
websocket的使用場景:
社交聊天、彈幕、多玩家遊戲、協同編輯、股票基金實時報價、體育實況更新、視訊會議/聊天、基于位置的應用、線上教育、智能家居等 需要高實時的場景
02
websocket接口測試實戰
以碼同學全棧接口項目中的websocket接口為例,項目位址 http://**.***.**.**:****/pinter/
接口名稱 | 接口類型 | URL | 參數 |
比對接口 | websocket | /pinter/imserver/使用者id | {"type":"match","from":"發送者","to":"system"} |
發送聊天消息接口 | websocket | /pinter/imserver/使用者id | {"msgId":"消息id","type":"normal","from":"發送者","to":"老師id","msg":"消息内容"} |
01
抓包檢視,熟悉接口業務
1、通路項目首頁,打開浏覽器的開發者工具,選擇Network-->WS
2、點選頁面上websocket案例的開始練習,抓包看到以下資料
綠色箭頭表示浏覽器向伺服器發送的資料,紅色箭頭表示伺服器傳回的資料
本次請求是的業務是打開聊天視窗後,比對一個背景的客服老師
請求參數:
- type為match表示這是個比對類型的動作
- from表示客戶id
- to表示該請求發送給誰
- system為伺服器系統
{"type":"match","from":"發送者","to":"system"}
伺服器傳回資料:
- code是業務狀态碼,0表示成功
- from表示該資料是誰發來的,system表示是系統發來的
- msg表示系統為客戶比對到的老師id
- msgId表示的是消息id
- timestamp目前時間戳
- to表示該資料是發給誰的,發給客戶admin的
- type表示請求類型,match表示這個比對請求
{
"code":"0", "from":"system", "msg":"cf2137234f3943e3898df8fcd14f099a__mtx", "msgId":"4c7ff9b3-ce6b-4891-8c14-41e0f45e0bd0", "timestamp":"1665630374482", "to":"admin", "type":"match"}
免費領取 碼同學軟體測試 課程筆記+超多學習資料+完整視訊+最新面試題,可以轉發文章 + 私信「碼同學666」擷取資料哦
3、聊天視窗發送聊天資訊,抓包檢視
第1步:對應數字圖中的數字1,發送資料到伺服器,伺服器會根據資訊進行推送,将資料發給指定的客服老師
- type表示請求類型,normal是正常聊天消息的意思
- from表示這個資料是從誰發來的,從客戶admin發出來的
- to表示這個是發給誰的,發給cf2137234f3943e3898df8fcd14f099a__mtx這個客服老師的
- msg是發給客服老師具體的資訊
{
"type":"normal", "from":"admin", "to":"cf2137234f3943e3898df8fcd14f099a__mtx", "msg":"你好"}
第2步:對應圖中的數字2,伺服器将消息推送給客服老師成功後,把成功的資訊發送給客戶,其中核心字段msg為push success表示推送成功,type為receipt表示伺服器傳回的
{"code":"0","from":"system","msg":"push success","msgId":"130f4370-6b2b-4634-b3f1-59a9728eb8f1","timestamp":"1665631227681","to":"admin","type":"receipt"}
第3步:對應圖中的數字3,客服老師在收到伺服器推送給自己的客戶消息後,傳回給客戶的資訊,也是由伺服器轉發過來的,而并不是直接傳回給客戶的
- type表示請求類型,normal是正常聊天消息的意思
- from表示這個資料是從誰發來的,從客服老師cf2137234f3943e3898df8fcd14f099a__mtx發出來的
- to表示這個是發給誰的,發給admin這個客戶的
- msg是發給客服具體的資訊
{"code":"0","from":"cf2137234f3943e3898df8fcd14f099a__mtx","msg":"同學,你好,非常高興為你服務,有什麼需要我幫忙的呢?","msgId":"8486956c-e804-42b9-bb9b-d1574f1ca23f","timestamp":"1665631228807","to":"admin","type":"normal"}
02
python調用websocket接口
- 安裝第三方庫
- 接口調用
- 接口架構中适配websocket封裝
1、封裝底層websocket類
在config目錄下建立一個websocket.yml的檔案,寫上如下内容:
在client.py中增加如下代碼
2、封裝websocket api層
在api包下建立websoket_api包,其下建立imserver_api.py ,寫上如下代碼
3、編寫測試用例層
在testcases目錄下建立websocketapi包,在其下建立test_websocket_api.py
# !/usr/bin python3
# encoding: utf-8 -*- # @file : test_websocket_api.py # @author : 沙陌 Matongxue_2# @Time : 2022-10-19 16:07# @Copyright: 北京碼同學
import jsonimport pytest
from api.websoket_api.imserver_api import ImServerApiclass TestImServerApi: kfid = '' # 定義客服id,全局變量作為各個測試用例的關聯資料
def setup_class(self): self.im = ImServerApi() # 建立一個websocket協定的接口對象
# 測試客服比對
def test_match(self): params = { "msgId": "111", "type": "match", "from": "shamo", "to": "system" } self.im.send(json.dumps(params)) res = self.im.recv() res = json.loads(res)# 将其轉換成json對象 assert res['code'] == '0' # 提取msg,msg是比對到的客服id self.__class__.kfid = res['msg'] # 測試給客服發送正常消息
def test_message(self): params={ "msgId": "111", "type": "normal", "from": "admin", "to": f"{self.__class__.kfid}", "msg": "你好" } self.im.send(json.dumps(params)) res = self.im.recv() res = json.loads(res)# 将其轉換成json對象 # 斷言系統推送消息的結果是否正确 pytest.assume(res['code'] == '0',f'期望值是0,實際結果是{res["code"]}') pytest.assume(res['msg'] == 'push success', f'期望值是0,實際結果是{res["msg"]}')
# 再次接收客服發來的資料 res = self.im.recv() res = json.loads(res)# 将其轉換成json對象 pytest.assume(res['code'] == '0',f'期望值是0,實際結果是{res["code"]}') pytest.assume(res['msg'] == '同學,你好,非常高興為你服務,有什麼需要我幫忙的呢?', f'期望值是0,實際結果是{res["msg"]}')
# 測試發送資料時消息是空的
def test_message_msgisnull(self): params={ "msgId": "111", "type": "normal", "from": "admin", "to": f"{self.kfid}", "msg": "" } self.im.send(json.dumps(params)) res = self.im.recv() res = json.loads(res)# 将其轉換成json對象 # 斷言系統推送消息時對于消息的判斷 pytest.assume(res['code'] == '1',f'期望值是1,實際結果是{res["code"]}') pytest.assume(res['msg'] == '消息内容為空', f'期望值是0,實際結果是{res["msg"]}')
免費領取碼同學軟體測試課程筆記+超多學習資料+學習完整視訊,可以關注我們公衆号哦:自動化軟體測試
本文著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。