FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题

其实代码没有问题,但是我们忽略了一个问题,就是在正常的开发中,肯定是遇到过这样的情况,我们频繁的有客户端链接,断开连接,需要统一的管理这些链接,那么应该如何管理呢。其实可以声明一个类去管理这些链接。接下来我们看下该如何优化。

一、优化测试接口方法

1.定义链接管理类,处理所有链接

复制代码
"""
websocket 链接管理
"""


from typing import List, Dict

from starlette.websockets import WebSocket


class ConnectionManager:

    def __init__(self):
        """存放链接"""
        self.active_connections: List[Dict[str, WebSocket]] = []

    async def connect(self, user: str, ws: WebSocket):
        """链接"""
        self.active_connections.append({"user": user, "ws": ws})

    async def disconnect(self, user: str, ws: WebSocket):
        """断开链接,移除"""
        self.active_connections.remove({"user": user, "ws": ws})

2.修改应用代码

我们增加了链接,移除链接的操作,那么对应修改下代码

复制代码
from connection_tool import ConnectionManager
from starlette.websockets import WebSocketDisconnect
ws_manager = ConnectionManager()


@app.websocket("/items/ws")
async def websocket_endpoint(
    websocket: WebSocket,
    cookie_or_token: str = Depends(get_cookie_or_token),
):
    await websocket.accept()
    await ws_manager.connect(cookie_or_token, websocket)
    try:
        while True:
            data = await websocket.receive_text()
            await websocket.send_text(f"Message is: {data}")
    except WebSocketDisconnect as e:
        await ws_manager.disconnect(cookie_or_token, websocket)

3.测试

这样我们在链接处理的时候就可以正常处理了。之前报错是因为我们没有正常的关闭链接导致的,那么我们再测试一下

复制代码
"""
测试websockets
"""

from fastapi.testclient import TestClient
from main import app


def test_websocket():
    client = TestClient(app)
    with client.websocket_connect("/items/ws?token=fake-token") as websocket:
        websocket.send_text("Hello, this is testing websocket")
        data = websocket.receive_text()
        print(data)
        assert str(data) == f"Message is: Hello, this is testing websocket"


if __name__ == '__main__':
    test_websocket()

此时,发现代码不会再报错

二、增加测试用例并优化

1.增加用例代码

复制代码
import unittest

from fastapi.testclient import TestClient

from main import app


class FastApiTestWeb(unittest.TestCase):

    def setUp(self) -> None:
        self.client = TestClient(app)

    def tearDown(self) -> None:
        self.client = None

    def test_websocket(self):
        with self.client.websocket_connect("/items/ws?token=fake-token") as websocket:
            websocket.send_text("Hello, this is using test case to test websocket")
            data = websocket.receive_text()
            print(data)
            assert str(data) == "Message is: Hello, this is using test case to test websocket"

    def test_websocket_again(self):
        with self.client.websocket_connect("/items/ws?token=fake-token") as websocket:
            websocket.send_text("Hello, this is using test case to test websocket again")
            data = websocket.receive_text()
            print(data)
            assert str(data) == "Message is: Hello, this is using test case to test websocket again"


if __name__ == '__main__':
    unittest.main()

2.执行用例

这样我们的一个测试用例就更加的完整了。我们执行正常是没有报错的

3. 查看代码的覆盖率

pip install coverage

我们想要看下代码的覆盖率,应该如何看呢。我是用的coverage。

然后再report

我们想看html测试报告,可以运行下 coverage html。

然后打开index.html

因为我的main.py还有其他的方法,我们还需要点进去看我们对应方法的覆盖率。

如果想要将覆盖率都达到100%,还需要针对其他方法增加测试用例。

到这里,我们对于WebSockets接口测试完毕,但是如果我们想实现上线通知,下线通知,如何实现呢?见下一节。

相关推荐
研究点啥好呢1 天前
专为求职者开发的“面馆”!!!摆脱面试焦虑!!!
python·面试·开源·reactjs·求职招聘·fastapi
.柒宇.3 天前
AI掘金头条项目-K8s部署实战教程
python·云原生·容器·kubernetes·fastapi
Muyuan19983 天前
28.Paper RAG Agent 开发记录:修复 LLM Rerank 的解析、Fallback 与可验证性
linux·人工智能·windows·python·django·fastapi
观无3 天前
Python读取excel并形成api接口案例
python·pandas·fastapi
绘梨衣5474 天前
Docker+FastAPI+MySQL 项目部署报错汇总
mysql·docker·fastapi
Muyuan19984 天前
27.RAG 系统中的上下文充分性判断:从 Chunk 数量、FAISS 距离到 LLM Relevance Gate
python·django·pdf·fastapi·faiss
曲幽4 天前
FastAPI 少有人提的实用技巧:把 Depends 依赖提到路由层,代码少写60%
python·fastapi·web·routes·depends·prefix·apiroute
.柒宇.4 天前
AI掘金头条项目部署实践指南
linux·运维·python·fastapi
风流 少年4 天前
Python Web框架:FastAPI
前端·python·fastapi
iuu_star4 天前
Vue+FastAPI 项目宝塔Linux部署指南
linux·运维·fastapi