WebSocket
seldom > 3.6.0 支持该功能
有些时间我们需要通过WebSocket
实现长连接,很高兴的告诉告诉你seldom支持WebSocket
测试了。
WebSocket 生命周期
WebSocket 生命周期中包含几个关键的事件,这些事件允许开发人员在连接的不同阶段执行代码。以下是WebSocket API中定义的主要事件:
open
: 当WebSocket连接成功建立时触发。这个事件表明客户端与服务器之间的连接已经打开,可以开始数据传输。message
: 当客户端接收到服务器发送的消息时触发。这个事件用于处理从服务器接收到的所有消息。error
: 当发生错误,导致WebSocket连接关闭之前或连接无法成功建立时触发。这个事件可以用来处理和响应WebSocket过程中出现的任何异常或错误情况。close
: 当连接被关闭时触发,无论是客户端还是服务器端主动关闭连接,或是因为某种原因连接被迫关闭。这个事件表明WebSocket连接已经彻底关闭,可以进行清理和后续处理。
seldom测试WebSocket
在seldom中测试WebSocket非常简单。
- 首先,需要一个WebSocket服务。
通过aiohttp
实现websocket_server.py
。
# websocket_server.py
from aiohttp import web
import aiohttp
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
print("message", msg.data)
if msg.data == 'close':
await ws.close()
else:
await ws.send_str(f"Message text was: {msg.data}")
elif msg.type == aiohttp.WSMsgType.ERROR:
print('ws connection closed with exception %s' %
ws.exception())
print('websocket connection closed')
return ws
app = web.Application()
app.router.add_get('/ws', websocket_handler)
web.run_app(app, port=8765)
- 然后,通过seldom编写WebSocket测试用例。
import seldom
from seldom.logging import log
from seldom.websocket_client import WebSocketClient
class WebSocketTest(seldom.TestCase):
def start(self):
# 创建WebSocket客户端线程
self.client = WebSocketClient("ws://0.0.0.0:8765/ws")
self.client.start()
# 等待客户端连接建立
self.sleep(1) # 这里假设服务器可以在1秒内响应连接
def tearDown(self):
# 发送关闭消息
self.client.send_message("close")
# 停止WebSocket客户端线程
self.client.stop()
self.client.join()
def test_send_and_receive_message(self):
# 发送消息
self.client.send_message("Hello, WebSocket!")
self.client.join(1) # 等待接收消息
self.client.send_message("How are you?")
self.client.join(1) # 等待接收消息
# 验证是否收到消息
log.info(self.client.received_messages)
self.assertEqual(len(self.client.received_messages), 2)
self.assertIn("Hello, WebSocket!", self.client.received_messages[0])
self.assertIn("How are you?", self.client.received_messages[1])
if __name__ == '__main__':
seldom.main(debug=True)
- 运行日志
> python test_websocket.py
test_send_and_receive_message (test_websocket.WebSocketTest.test_send_and_receive_message) ...
2024-04-05 23:36:33 | INFO | case.py | 💤️ sleep: 1s.
2024-04-05 23:36:33 | INFO | websocket_client.py | WebSocket connection opened.
2024-04-05 23:36:36 | INFO | test_websocket.py | ['Message text was: Hello, WebSocket!', 'Message text was: How are you?']
ok
----------------------------------------------------------------------
Ran 1 test in 3.006s
OK
2024-04-05 23:36:36 | SUCCESS | runner.py | A run the test in debug mode without generating HTML report!