最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

websocket接口自動化集成pytest測試框架

2023-02-24 09:35 作者:碼同學(xué)軟件測試  | 我要投稿

每天進(jìn)步一點點,關(guān)注我們哦,每天分享測試技術(shù)文章

本文章出自【碼同學(xué)軟件測試】

碼同學(xué)公眾號:自動化軟件測試,領(lǐng)取資料可加:magetest

碼同學(xué)抖音號:小碼哥聊軟件測試

?

01

websocket協(xié)議


1、介紹

WebSocket是一種在單個TCP通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補(bǔ)充規(guī)范。WebSocket API也被W3C定為標(biāo)準(zhǔn)。


WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸


2、原理


3、與http協(xié)議的比較

相同之處:

  • 都是基于TCP的應(yīng)用層協(xié)議;

  • 都使用Request/Response模型進(jìn)行連接的建立;

  • 在連接的建立過程中對錯誤的處理方式相同,在這個階段WS可能返回和HTTP相同的返回碼;

  • 都可以在網(wǎng)絡(luò)中傳輸數(shù)據(jù)。


不同之處:

  • WS使用HTTP來建立連接,但是定義了一系列新的header域,這些域在HTTP中并不會使用;

  • WS的連接不能通過中間人來轉(zhuǎn)發(fā),它必須是一個直接連接;

  • WS連接建立之后,通信雙方都可以在任何時刻向另一方發(fā)送數(shù)據(jù);

  • WS連接建立之后,數(shù)據(jù)的傳輸使用幀來傳遞,不再需要Request消息;

  • WS的數(shù)據(jù)幀有序。


4、websocket應(yīng)用場景

websocket的使用場景:?

社交聊天、彈幕、多玩家游戲、協(xié)同編輯、股票基金實時報價、體育實況更新、視頻會議/聊天、基于位置的應(yīng)用、在線教育、智能家居等?需要高實時的場景


02

websocket接口測試實戰(zhàn)


以碼同學(xué)全棧接口項目中的websocket接口為例,項目地址 ?http://**.***.**.**:****/pinter/

接口名稱接口類型URL參數(shù)

匹配接口

websocket

/pinter/imserver/用戶id

{"type":"match","from":"發(fā)送者","to":"system"}

發(fā)送聊天消息接口

websocket

/pinter/imserver/用戶id

{"msgId":"消息id","type":"normal","from":"發(fā)送者","to":"老師id","msg":"消息內(nèi)容"}


01抓包查看,熟悉接口業(yè)務(wù)


1、訪問項目首頁,打開瀏覽器的開發(fā)者工具,選擇Network-->WS

2、點擊頁面上websocket案例的開始練習(xí),抓包看到以下數(shù)據(jù)

綠色箭頭表示瀏覽器向服務(wù)器發(fā)送的數(shù)據(jù),紅色箭頭表示服務(wù)器返回的數(shù)據(jù)


本次請求是的業(yè)務(wù)是打開聊天窗口后,匹配一個后臺的客服老師

請求參數(shù):

  • type為match表示這是個匹配類型的動作

  • from表示客戶id

  • to表示該請求發(fā)送給誰

  • system為服務(wù)器系統(tǒng)

{

"type":"match",

"from":"發(fā)送者",

"to":"system"

}

服務(wù)器返回數(shù)據(jù):

  • code是業(yè)務(wù)狀態(tài)碼,0表示成功

  • from表示該數(shù)據(jù)是誰發(fā)來的,system表示是系統(tǒng)發(fā)來的

  • msg表示系統(tǒng)為客戶匹配到的老師id

  • msgId表示的是消息id

  • timestamp當(dāng)前時間戳

  • to表示該數(shù)據(jù)是發(fā)給誰的,發(fā)給客戶admin的

  • type表示請求類型,match表示這個匹配請求

{

"code":"0", ? ?

"from":"system", ? ?

"msg":"cf2137234f3943e3898df8fcd14f099a__mtx", ? ?

"msgId":"4c7ff9b3-ce6b-4891-8c14-41e0f45e0bd0", ? ?

"timestamp":"1665630374482", ? ?

"to":"admin", ? ?

"type":"match"

}


3、聊天窗口發(fā)送聊天信息,抓包查看

第1步:對應(yīng)數(shù)字圖中的數(shù)字1,發(fā)送數(shù)據(jù)到服務(wù)器,服務(wù)器會根據(jù)信息進(jìn)行推送,將數(shù)據(jù)發(fā)給指定的客服老師

  • type表示請求類型,normal是正常聊天消息的意思

  • from表示這個數(shù)據(jù)是從誰發(fā)來的,從客戶admin發(fā)出來的

  • to表示這個是發(fā)給誰的,發(fā)給cf2137234f3943e3898df8fcd14f099a__mtx這個客服老師的

  • msg是發(fā)給客服老師具體的信息

{

"type":"normal", ? ?

"from":"admin", ? ?

"to":"cf2137234f3943e3898df8fcd14f099a__mtx", ? ?

"msg":"你好"

}

第2步:對應(yīng)圖中的數(shù)字2,服務(wù)器將消息推送給客服老師成功后,把成功的信息發(fā)送給客戶,其中核心字段msg為push success表示推送成功,type為receipt表示服務(wù)器返回的

{

"code":"0",

"from":"system",

"msg":"push success",

"msgId":"130f4370-6b2b-4634-b3f1-59a9728eb8f1",

"timestamp":"1665631227681",

"to":"admin",

"type":"receipt"

}

第3步:對應(yīng)圖中的數(shù)字3,客服老師在收到服務(wù)器推送給自己的客戶消息后,返回給客戶的信息,也是由服務(wù)器轉(zhuǎn)發(fā)過來的,而并不是直接返回給客戶的

免費領(lǐng)取碼同學(xué)軟件測試課程筆記+超多學(xué)習(xí)資料+完整視頻+面試題,可加微信:magetest


  • type表示請求類型,normal是正常聊天消息的意思

  • from表示這個數(shù)據(jù)是從誰發(fā)來的,從客服老師cf2137234f3943e3898df8fcd14f099a__mtx發(fā)出來的

  • to表示這個是發(fā)給誰的,發(fā)給admin這個客戶的

  • msg是發(fā)給客服具體的信息

{

"code":"0",

"from":"cf2137234f3943e3898df8fcd14f099a__mtx",

"msg":"同學(xué),你好,非常高興為你服務(wù),有什么需要我?guī)兔Φ哪?",

"msgId":"8486956c-e804-42b9-bb9b-d1574f1ca23f",

"timestamp":"1665631228807",

"to":"admin",

"type":"normal"

}

02python調(diào)用websocket接口


  • 安裝第三方庫

  • 接口調(diào)用

  • 接口框架中適配websocket封裝

1、封裝底層websocket類

在config目錄下創(chuàng)建一個websocket.yml的文件,寫上如下內(nèi)容:

在client.py中增加如下代碼


2、封裝websocket api層

在api包下創(chuàng)建websoket_api包,其下創(chuàng)建imserver_api.py?,寫上如下代碼


3、編寫測試用例層

在testcases目錄下創(chuàng)建websocketapi包,在其下創(chuàng)建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: 北京碼同學(xué)


import json

import pytest


from api.websoket_api.imserver_api import ImServerApi

class TestImServerApi: ? ?

? kfid = '' # 定義客服id,全局變量作為各個測試用例的關(guān)聯(lián)數(shù)據(jù) ? ? ? ??


? def setup_class(self): ? ? ? ?

? ? ?self.im = ImServerApi() # 創(chuàng)建一個websocket協(xié)議的接口對象 ? ?


? # 測試客服匹配 ? ?

? 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)# 將其轉(zhuǎn)換成json對象 ? ? ? ?

?? ? ??assert res['code'] == '0' ? ? ? ?

? ? ???# 提取msg,msg是匹配到的客服id ? ? ? ?

? ? ???self.__class__.kfid = res['msg'] ? ?

? # 測試給客服發(fā)送正常消息 ? ?

? 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)# 將其轉(zhuǎn)換成json對象 ? ? ? ?

?? ? ?? # 斷言系統(tǒng)推送消息的結(jié)果是否正確 ? ? ? ?

?? ? ???pytest.assume(res['code'] == '0',f'期望值是0,實際結(jié)果是{res["code"]}') ? ? ? ?

?? ? ???pytest.assume(res['msg'] == 'push success', f'期望值是0,實際結(jié)果是{res["msg"]}') ? ? ? ?


? ? ????# 再次接收客服發(fā)來的數(shù)據(jù) ? ? ? ?

? ? ??? res = self.im.recv() ? ? ? ?

?? ? ???res = json.loads(res)# 將其轉(zhuǎn)換成json對象 ? ? ? ?

??? ? ??pytest.assume(res['code'] == '0',f'期望值是0,實際結(jié)果是{res["code"]}') ? ? ? ?

??? ? ??pytest.assume(res['msg'] == '同學(xué),你好,非常高興為你服務(wù),有什么需要我?guī)兔Φ哪?', ? ? ? ? ? ? ? ? ? ? ?f'期望值是0,實際結(jié)果是{res["msg"]}') ? ?


? # 測試發(fā)送數(shù)據(jù)時消息是空的 ? ?

? 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)# 將其轉(zhuǎn)換成json對象 ? ? ? ?

? ? ???# 斷言系統(tǒng)推送消息時對于消息的判斷 ? ? ? ?

?? ? ? pytest.assume(res['code'] == '1',f'期望值是1,實際結(jié)果是{res["code"]}')

?? ? ??pytest.assume(res['msg'] == '消息內(nèi)容為空', f'期望值是0,實際結(jié)果是{res["msg"]}')

免費領(lǐng)取碼同學(xué)軟件測試課程筆記+超多學(xué)習(xí)資料+學(xué)習(xí)完整視頻 ? 可加:magetest/關(guān)注碼同學(xué)公眾號:自動化軟件測試

本文著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。


websocket接口自動化集成pytest測試框架的評論 (共 條)

分享到微博請遵守國家法律
蒙山县| 霍林郭勒市| 利辛县| 清远市| 天气| 崇文区| 增城市| 山东| 辰溪县| 红原县| 武穴市| 陆良县| 瑞安市| 文安县| 环江| 新绛县| 南开区| 拉孜县| 呼和浩特市| 左贡县| 临洮县| 黄大仙区| 高州市| 阳春市| 通辽市| 通榆县| 玛沁县| 宁强县| 凤翔县| 贵定县| 象州县| 万盛区| 阳西县| 沐川县| 平利县| 内江市| 沂水县| 右玉县| 莒南县| 砀山县| 肥西县|