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

摘要:
之前报错是因为我们没有正常的关闭连接导致的,那么我们这个时候再来去看下测试代码deftest_websocket():client=TestClientwithclient.websocket_connect("/items/ws?token="+"leizishuoceshi")aswebsocket:websocket.send_textdata=websocket.receive_text()printassertstr=="消息是:HelloWebSocket"此时我们再去执行,发现代码应该不会报错我们在用例优化下classFastApiTestWeb:defsetUp-˃None:self.client=TestClientdeftearDown-˃None:self.client=Nonedeftest_websocket:withself.client.websocket_connect("/items/ws?token="+"leizishuoceshi")aswebsocket:websocket.send_textdata=websocket.receive_text()printassertstr=="消息是:Hello123"if__name__=="__main__":unittest.main()这样我们的一个测试用例就更加的完整了。就是不带token的访问,我们在增加下一条case去覆盖下。deftest_websocket_notoken:try:withself.client.websocket_connectaswebsocket:websocket.send_textdata=websocket.receive_text()self.assertEqualexcept:self.assertTrue覆盖了这行代码。到这里,我们对于WebSockets接口测试完毕,但是还有问题,我们真正的聊天中,还需要上线进行通知,下线进行通知,我们应该如何实现呢,且听下回分解。

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

定义一个链接管理类,处理我们所有的链接。

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

    async defconnect(self, user: str, ws: WebSocket):
        #链接
await ws.accept()
        self.active_connections.append({"user": user, "ws": ws})

    defdisconnect(self, user: str, ws: WebSocket):
        #关闭时 移除ws对象
        self.active_connections.remove({"user": user, "ws": ws})

我们增加了链接,移除链接的操作,那么我们垓下我们的工程代码

manager =ConnectionManager()


@app.websocket("/items/ws")
async defwebsocket_endpoint(
        websocket: WebSocket,
        cookie_or_token: str =Depends(get_cookie_or_token),
):
    await manager.connect(cookie_or_token, websocket)

    try:
        whileTrue:
            data =await websocket.receive_text()
            await websocket.send_text(f"消息是: {data}")
    exceptWebSocketDisconnect as e:
        manager.disconnect(cookie_or_token, websocket)

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

deftest_websocket():
    client =TestClient(app)
    with client.websocket_connect("/items/ws?token="+"leizishuoceshi") as websocket:
        websocket.send_text("Hello WebSocket")
        data =websocket.receive_text()
        print(data)
        assert str(data) =="消息是: Hello WebSocket"

此时我们再去执行,发现代码应该不会报错

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

我们在用例优化下

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

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

    deftest_websocket(self):
        with self.client.websocket_connect("/items/ws?token=" + "leizishuoceshi") as websocket:
            websocket.send_text("Hello WebSocket")
            data =websocket.receive_text()
            print(data)
            assert str(data) == "消息是: Hello WebSocket"

    deftest_websocket_two(self):
        with self.client.websocket_connect("/items/ws?token=" + "leizishuoceshi") as websocket:
            websocket.send_text("Hello 123")
            data =websocket.receive_text()
            print(data)
            assert str(data) == "消息是: Hello 123"


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

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

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

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

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

然后我们再去report,

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

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

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

然后看index.html

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

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

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

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

我们可以看到,我们的关键代码还差了一行没有覆盖到。就是不带token的访问,我们在增加下一条case去覆盖下。

  deftest_websocket_notoken(self):
        try:
            with self.client.websocket_connect("/items/ws") as websocket:
                websocket.send_text("Hello 123")
                data =websocket.receive_text()
                self.assertEqual("消息是: Hello 123",data)
        except:
            self.assertTrue(True)

覆盖了这行代码。但是我们用例需要判断这个异常。

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

到这里,我们对于WebSockets接口测试完毕,但是还有问题,我们真正的聊天中,还需要上线进行通知,下线进行通知,我们应该如何实现呢,且听下回分解。

文章首发在公众号,欢迎关注。

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

免责声明:文章转载自《FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇四色原型概念辨析[文明6] 最大化利用工厂等影响6格建筑的六边形网格规划(2016-10-27增加五、六节,19城+133锤方案,37城+259锤方案)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue+elementui +input输入框关键字筛选检索表格数据展示+分页功能

第一种用axios发送请求到后台,需要后台配合,才能在表格里面渲染页面;想偷懒的小伙建议去直接粘贴复制第三种 <template> <div class="tableDatas"> <div class="searchWord"> <div style="display: inline-block"> 搜索...

图像数据类型及颜色空间转换

一 图像数据类型转换 在skimage中,一张图片就是一个简单的numpy数组,数组的数据类型有很多种,相互之间可以转换。这些数据类型及取值范围如下表所示: 一张图片的像素值范围是[0,255], 因此默认类型是unit8, 可用如下代码查看数据类型: from skimage import io,data img=data.astronaut() pr...

linux 更改mysql的数据库目录

MYSQL默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/home/data下需要进行下面几步:1、home目录下建立data目录cd /homemkdir data2、把MySQL服务进程停掉: mysqladmin -u root -p shutdown3、把/var/lib/mysql整个目录移到/home/datamv /...

vue+element-ui实现可折叠的树形表格

先看看效果图: 一,首先创建一个公共的文件夹treeTable,里边放一个index.vue和eval.js 先看看index.vue,原理就是在element-ui的基础上做了进一步改造。 //利用element-ui的 <template slot-scope="scope">属性,在插入多级表格 <template>...

GS与MS之间通信

GS与MS之间通信 注意GS与MS是两个线程,现在是每个map一个线程,他们之间是内部协议进行通信的,那既然是两个线程那如何通信呢,看了net进程通信这个就比较简单了 举个例子 m_pMap->Gs2MsData(gs2ms_add_player, m_nChannelId, (void*)&rActorEx, sizeof(rActo...

django-将数据库数据转换成JSON格式(ORM和SQL两种情况)

最近打算搞一个自动化运维平台,所以在看Django的知识。 在实际项目开发中,遇到一个小问题:前后端发生数据交互主流采用的是JSON。前端传数据到服务器端比较简单,稍微麻烦的是服务器端传JSON到前端。 首先数据是从数据库中获取的,Django默认使用的是ORM技术,但是作为一个运维人员,我其实比较反感这类抽象出来的API。因为尽管它对于开发人员来说,将数...