天天看點

websocket接口自動化內建pytest測試架構

作者:碼同學軟體測試

每天進步一點點,關注我們哦,每天分享測試技術文章

本文章出自【碼同學軟體測試】

碼同學公衆号:自動化軟體測試

碼同學抖音号:小碼哥聊軟體測試

01

websocket協定

1、介紹

WebSocket是一種在單個TCP通信的協定。WebSocket通信協定于2011年被IETF定為标準RFC 6455,并由RFC7936補充規範。WebSocket API也被W3C定為标準。

WebSocket使得用戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向用戶端推送資料。在WebSocket API中,浏覽器和伺服器隻需要完成一次握手,兩者之間就直接可以建立持久性的連接配接,并進行雙向資料傳輸

2、原理

websocket接口自動化內建pytest測試架構
websocket接口自動化內建pytest測試架構

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

websocket接口自動化內建pytest測試架構

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"}           
websocket接口自動化內建pytest測試架構

免費領取 碼同學軟體測試 課程筆記+超多學習資料+完整視訊+最新面試題,可以轉發文章 + 私信「碼同學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"}
           
websocket接口自動化內建pytest測試架構

02

python調用websocket接口

  • 安裝第三方庫
websocket接口自動化內建pytest測試架構
  • 接口調用
websocket接口自動化內建pytest測試架構
  • 接口架構中适配websocket封裝

1、封裝底層websocket類

在config目錄下建立一個websocket.yml的檔案,寫上如下内容:

websocket接口自動化內建pytest測試架構

在client.py中增加如下代碼

websocket接口自動化內建pytest測試架構

2、封裝websocket api層

在api包下建立websoket_api包,其下建立imserver_api.py ,寫上如下代碼

websocket接口自動化內建pytest測試架構

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"]}')           
websocket接口自動化內建pytest測試架構

免費領取碼同學軟體測試課程筆記+超多學習資料+學習完整視訊,可以關注我們公衆号哦:自動化軟體測試

本文著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

繼續閱讀