用 TestClient 完成 FastAPI WebSocket 测试的完整流程
用 TestClient 完成 FastAPI WebSocket 测试的完整流程【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi消息推送功能上线前你怎么确认连接能建立、第一条消息不会错序、断开不会把服务搞挂FastAPI WebSocket 测试的答案就一行用TestClient.websocket_connect()模拟真实客户端连进端点收消息、做断言。不需要起真实服务也不需要第三方库。结论先行用和 HTTP 测试同一个 TestClient。它是内置的进程内客户端直接驱动你的应用不走真实网络。测试函数里只写收消息 断言。建连和断开都由with块自动完成。测试函数必须写成同步def。TestClient 在内部驱动异步应用你不需要写await。一个最小可运行的 WebSocket 测试场景换成聊天房间用户进入 77 号房间时服务端推送一条入群通知。端点和测试一共 14 行from fastapi import FastAPI, WebSocket from fastapi.testclient import TestClient app FastAPI() app.websocket(/room/{room_id}) async def join_room(socket: WebSocket, room_id: str): await socket.accept() await socket.send_json({event: joined, room: room_id}) await socket.close() def test_join_notification(): client TestClient(app) with client.websocket_connect(/room/77) as socket: payload socket.receive_json() assert payload {event: joined, room: 77}端点只做三件事接连接、发通知、关连接。测试断言收到的第一条 JSON 等于期望字典。这段代码到底发生了什么你在端点里写await socket.accept()框架完成握手连接才进入可读状态。你进入with client.websocket_connect(/room/77)框架在进程内完成握手不监听端口。应用是 ASGI 应用即一套框架与服务端约定的通信接口。你调用receive_json()框架读走服务端发出的第一帧解码成 Python 字典。assert做值比较pytest 据此记通过或失败。你退出with时框架关闭连接并释放会话。with块就是上下文管理器意思是块结束时代码会自动帮你做清理。它像一次通话拿起建立连接挂断拆除一切。按消息类型选断言写法按消息类型匹配客户端和服务端的方法再对返回值断言文本消息服务端send_text()测试端receive_text()断言assert text xxx。JSON 消息服务端send_json()测试端receive_json()断言assert data {event: joined}。推荐默认用它结构一目了然。二进制消息服务端send_bytes()测试端receive_bytes()断言assert raw b...。同一条连接混用多种类型时按服务端发出的顺序依次读取用对应的receive_*逐个消费。三个容易翻车的点 ⚠️1. 在 async def 测试里用 TestClient错误症状连接无响应或抛出事件循环相关错误。# ❌ 反例 pytest.mark.anyio async def test_room(): client TestClient(app) # 异步上下文里没有可用事件循环正确写法把测试改回同步def。TestClient 只能在同步调用栈里工作。2. 收发顺序和服务端错位错误症状测试卡死或突然抛出WebSocketDisconnect。# ❌ 服务端只发一次测试却收两次 with client.websocket_connect(/room/77) as socket: first socket.receive_json() second socket.receive_json() # 没有第二帧阻塞正确写法把服务端的send_*列表和测试的receive_*列表逐条对齐一一对应。3. 应用靠 lifespan 初始化数据lifespan 是应用启动和停止时执行的回调常用来预置房间、令牌等数据。直接写client TestClient(app)时lifespan 不会运行端点里的数据还是空壳。# ✅ 两层 with 嵌套 with TestClient(app) as client: with client.websocket_connect(/room/77) as socket: payload socket.receive_json()正确写法外层with启动应用内层with管理这条连接两层都要写。跑完后的自查清单测试函数是同步 def函数体里没有 await每次 receive 都能在服务端找到对应的 send依赖 lifespan 时写成了嵌套的 with TestClient(app)服务端 close() 后断连路径有显式断言直接运行 pytest 能一次跑绿想继续深入读官方教程 Testing WebSockets看断连异常类型的再导出源码 fastapi/websockets.py对比异步测试写法 async-tests.md。需要直接可抄的完整示例参考 docs_src/app_testing/tutorial002_py310.py。【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

香港服务器托管与配置优化全指南

香港服务器托管与配置优化全指南

1. 香港服务器托管的战略价值解析香港作为亚太地区重要的网络枢纽,其服务器托管服务具有独特的区位优势。从网络拓扑来看,香港拥有14条国际海底光缆接入,与全球主要互联网交换节点直连,平均延迟低于50ms。这种网络架构使香港成为连…

2026/9/14 16:58:18 阅读更多 →
Vue3+NestJS全栈开发企业级应用实战

Vue3+NestJS全栈开发企业级应用实战

1. 为什么选择Vue3NestJS全栈开发?全栈开发在当下企业级应用开发中已经成为标配技能组合。我最近用Vue3NestJS完整开发了一个供应链管理系统,这套技术栈的配合度远超预期。前端选择Vue3是因为其Composition API带来的代码组织优势,而后端Nest…

2026/9/14 16:58:18 阅读更多 →
Django+Python运维管理系统毕业设计实战指南

Django+Python运维管理系统毕业设计实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 16:57:17 阅读更多 →

最新新闻

Roo Code 长期记忆接入指南:用 Hindsight 的 recall/retain 打造跨会话记忆工作流

Roo Code 长期记忆接入指南:用 Hindsight 的 recall/retain 打造跨会话记忆工作流

Roo Code 长期记忆接入指南:用 Hindsight 的 recall/retain 打造跨会话记忆工作流 【免费下载链接】hindsight Hindsight: Agent Memory That Learns 项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight 导读 本文讲解 Hindsight 为 Roo …

2026/9/14 17:47:54 阅读更多 →
IoT-For-Beginners 农场项目实战:在 Raspberry Pi 与虚拟 IoT 设备中使用 X.509 证书连接 Azure IoT Hub

IoT-For-Beginners 农场项目实战:在 Raspberry Pi 与虚拟 IoT 设备中使用 X.509 证书连接 Azure IoT Hub

IoT-For-Beginners 农场项目实战:在 Raspberry Pi 与虚拟 IoT 设备中使用 X.509 证书连接 Azure IoT Hub 【免费下载链接】IoT-For-Beginners 12 Weeks, 24 Lessons, IoT for All! 项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners 本文…

2026/9/14 17:47:54 阅读更多 →
Cesium 中的 KHR_materials_clearcoat 扩展解析:以 BoxClearcoat 测试模型为例

Cesium 中的 KHR_materials_clearcoat 扩展解析:以 BoxClearcoat 测试模型为例

Cesium 中的 KHR_materials_clearcoat 扩展解析:以 BoxClearcoat 测试模型为例 【免费下载链接】cesium An open-source JavaScript library for world-class 3D globes and maps :earth_americas: 项目地址: https://gitcode.com/GitHub_Trending/ce/cesium …

2026/9/14 17:47:54 阅读更多 →
扩散模型微调不再玄学:AI Toolkit 三步搞定 FLUX、Wan2.2 的 LoRA 训练

扩散模型微调不再玄学:AI Toolkit 三步搞定 FLUX、Wan2.2 的 LoRA 训练

扩散模型微调不再玄学:AI Toolkit 三步搞定 FLUX、Wan2.2 的 LoRA 训练 【免费下载链接】ai-toolkit The ultimate training toolkit for finetuning diffusion models 项目地址: https://gitcode.com/GitHub_Trending/ai/ai-toolkit 同一个模型,…

2026/9/14 17:47:54 阅读更多 →
MCP Toolbox for Databases:BigQuery MCP Server 完整实战指南

MCP Toolbox for Databases:BigQuery MCP Server 完整实战指南

MCP Toolbox for Databases:BigQuery MCP Server 完整实战指南 【免费下载链接】mcp-toolbox MCP Toolbox for Databases is an open source MCP server for databases. 项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox 导读:本文以…

2026/9/14 17:47:54 阅读更多 →
ADS导出曲线数据的底层逻辑与可靠方法

ADS导出曲线数据的底层逻辑与可靠方法

1. 为什么“最简易版”导出曲线数据反而最难搞清楚? 在ADS(Advanced Design System)里导出仿真曲线数据,表面看就是右键→Export→选格式→保存,三步搞定。但实际工作中,我见过太多工程师卡在这一步&#x…

2026/9/14 17:46:53 阅读更多 →

日新闻

AI音乐侵权案中的测试工程与版权保护技术

AI音乐侵权案中的测试工程与版权保护技术

1. 项目概述:当测试工程师遇上AI音乐侵权案去年夏天,我作为技术顾问参与了一起特殊的著作权纠纷案——某音乐平台AI作曲功能被指控批量侵权。这起案件的特殊性在于:原告方并非传统音乐人,而是一家拥有百万级曲库的数字音乐发行商&…

2026/9/14 0:00:26 阅读更多 →
嵌入式面试I2C与SPI深度解析:从协议到量产调试

嵌入式面试I2C与SPI深度解析:从协议到量产调试

1. 这份“高频知识点洞察”到底是什么,又为什么值得你花时间细读? 如果你最近在刷嵌入式开发岗位的招聘JD,或者正坐在工位上改第7版简历,又或者刚被面试官一句“讲讲I2C和SPI的区别”问得手心冒汗——那你不是一个人。过去两年我带…

2026/9/14 0:00:26 阅读更多 →
51单片机开环控制磁阻传感器的硬件匹配与代码实现

51单片机开环控制磁阻传感器的硬件匹配与代码实现

简介:本资源是一份面向嵌入式初学者与单片机课程实践者的51单片机开关磁阻电机(SRM)开环控制教学方案,聚焦磁阻位置检测、固定时序驱动与基础状态可视化。资源包含1个C语言主程序文件(zhuang600.c)实现电机…

2026/9/14 0:00:26 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/14 5:45:49 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/14 0:52:26 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/14 0:06:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/14 17:35:10 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/14 16:59:29 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/14 5:45:14 阅读更多 →