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!