尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
FastAPI WebSocket 测试实战:TestClient 连接与消息断言
FastAPI WebSocket 测试实战TestClient 连接与消息断言【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi场景锚点给 FastAPI 的 WebSocket 端点写自动化测试最常被问的一句话是要不要再装一个 WebSocket 测试库——答案是不用。面向同步测试函数复用同一个TestClient靠websocket_connect建立长连接会话在会话里receive_*收消息并断言就能完成端到端验证。读完本文你可以独立写出可运行的 WebSocket 测试并理解断连、lifespan、异步边界三处易错点。下面从一个最短的可运行示例切入。机制速写先看两个一眼就能定性的文件。fastapi/testclient.py 全文只有一行from starlette.testclient import TestClient as TestClient # noqafastapi/websockets.py 同样只是再导出WebSocket、WebSocketDisconnect、WebSocketState。换句话说FastAPI 的 WebSocket 测试能力全部建立在 Starlette 的TestClient.websocket_connect()会话机制之上框架本身没有二次封装。与 HTTP 测试的本质区别在于会话二字HTTP 是client.get(/)一次请求、一个response断言落在状态码和响应体上WebSocket 是先握手、后收发的消息流断言落在会话内逐条收到的消息上。HTTP 测试WebSocket 测试入口client.get/post(...)with client.websocket_connect(url)断言对象response.status_code、response.json()会话内逐条收到的消息清理请求结束即完成退出with块自动关闭连接最小可运行示例被测对象一个极简 WebSocket 端点from fastapi import FastAPI from fastapi.websockets import WebSocket app FastAPI() app.websocket(/ws) async def websocket(websocket: WebSocket): await websocket.accept() await websocket.send_json({msg: Hello WebSocket}) await websocket.close()测试代码with 语句建立连接会话from fastapi.testclient import TestClient def test_websocket(): client TestClient(app) with client.websocket_connect(/ws) as websocket: data websocket.receive_json() assert data {msg: Hello WebSocket}逐行拆解执行流程client TestClient(app)实例化客户端同步驱动异步 ASGI 应用测试函数内无需awaitwith client.websocket_connect(/ws) as websocket:——关键行。它是整个测试里唯一触发 WebSocket 握手的语句上下文进入即建立连接websocket.receive_json()阻塞等待服务端发来的第一条 JSON 消息并自动解码对应端点里的send_jsonassert data ...与预期完全一致才算通过退出with块连接自动关闭。容易忽略的一点——若端点未先accept()握手无法完成连接建立不起来。对照同文件里的 HTTP 测试client.get(/)断言200与{msg: Hello World}可以看到同一份TestClient同时服务两类端点写法完全对称。仓库中可运行原文见 docs_src/app_testing/tutorial002_py310.py运行方式就是标准的pytest。变体与边界处理服务端主动断连端点收尾通常是一句await websocket.close()测试端若在此之后继续receive_*会收到WebSocketDisconnect异常。仓库真实用例tests/test_route_scope.py的写法import pytest from fastapi.websockets import WebSocketDisconnect def test_websocket_invalid_path_doesnt_match(): with pytest.raises(WebSocketDisconnect): with client.websocket_connect(/itemsx/portal-gun): pass结论用pytest.raises(WebSocketDisconnect)包裹断连路径就从会炸掉的副作用变成可验证的分支注意该异常正是从fastapi/websockets.py再导出的那个。嵌套 TestClient 触发 lifespan应用依赖lifespan预置状态时只有进入with TestClient(app)才执行初始化——参考 docs_src/app_testing/tutorial004_py310.py外层with之前items为空进入后字典就绪退出后清空。因此 WebSocket 测试要写成两层嵌套def test_websocket_with_lifespan(): with TestClient(app) as client: with client.websocket_connect(/ws) as websocket: data websocket.receive_json() assert data {msg: Hello WebSocket}结论外层with负责启停 lifespan内层with只管连接生命周期——少写外层端点里读到的就是未初始化的空状态。异步测试不能沿用这套写法TestClient的魔法依赖同步调用栈去驱动异步 ASGI 应用一旦测试函数本身是async def函数体内就不能再用它。对照 docs_src/async_tests/app_a_py310/test_main.pypytest.mark.anyio场景下走的是httpx.AsyncClientASGITransport而且它只覆盖 HTTP。pytest.mark.anyio async def test_root(): async with AsyncClient( transportASGITransport(appapp), base_urlhttp://test ) as ac: response await ac.get(/)结论异步测试场景下 WebSocket 需要单独设计测试策略不能把同步会话写法原样搬进async def。会话常用方法与断言速查方法作用配套断言写法websocket.receive_text()接收一条文本消息assert data fMessage text was: {message}websocket.receive_json()接收并解码一条 JSON 消息assert data {msg: Hello WebSocket}websocket.receive_bytes()接收一条二进制消息直接比较bytes内容websocket.send_text(...)发送文本配合端点receive_text()发送后再receive_*断言应答websocket.send_json(...)发送 JSON配合端点receive_json()同上websocket.send_bytes(...)发送二进制配合端点receive_bytes()同上收发必须严格成对、按序端点每send_*一次测试端就receive_*一次错位就会阻塞。仓库里回显式完整对话的用例见 tests/test_tutorial/test_websockets/test_tutorial001.py两条消息各走一遍send_text→receive_text→ 断言最后整个会话被pytest.raises(WebSocketDisconnect)兜住。踩坑清单同步/异步混用TestClient只能在同步测试函数里用async def测试体内再放它会失去驱动异步应用的能力这是 docs/en/docs/advanced/async-tests.md 明确区分的两条路线。握手先于一切端点里await websocket.accept()必须在send_*之前否则连接建立不起来websocket_connect直接失败。断言对象错位HTTP 断言盯status_code与response.json()WebSocket 没有状态码断言只落在逐条消息上——把两者混写是常见错误。收发顺序敏感消息流没有请求-响应边界测试端每多调一次receive_*而服务端没有对应send_*就会卡住。lifespan 未进入不初始化不套with TestClient(app)时 lifespan 不执行tutorial004的断言序列进入前空、退出后清空直接证明这一点。延伸链路fastapi/testclient.py单行再导出的源码确认没有第二个测试客户端这一前提fastapi/websockets.pyWebSocketDisconnect等类型的出处处理断连断言时先来这里对类型tests/test_tutorial/test_websockets/WebSocket 教程的回归测试目录含断连与回显的完整对话式用例docs_src/websockets_/端点本身的写法含 Query 参数、Cookie 鉴权与WebSocketExceptiontests/test_tutorial/test_testing/tutorial002中两个测试函数的直接调用方式照此组织自己的测试文件。【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

基于Hadoop+Spark的小红书评论情感分析系统设计与实现

基于Hadoop+Spark的小红书评论情感分析系统设计与实现

1. 项目背景与核心需求解析这个毕业设计项目瞄准了当前社交电商平台数据分析的热点需求——通过大数据技术实现小红书评论的情感倾向分析。小红书作为国内领先的社交电商平台,每天产生海量用户评论数据,这些数据蕴含着用户对产品的真实感受和市场反馈。传…

📅 2026/9/14 18:23:17
SAP银行对账单再处理原因CDS视图解析与应用

SAP银行对账单再处理原因CDS视图解析与应用

1. 项目背景与核心价值银行对账单处理是财务系统中最关键也最容易出错的环节之一。在SAP系统中,当银行对账单项目需要重新处理时,系统会记录具体的再处理原因。CDS视图I_BankStmntItmReprocessRsnName就是专门为这一需求设计的数据模型。这个CDS视图的价…

📅 2026/9/14 18:18:17
Opik 优化器模块开发指南:从目录结构、构建命令到测试与贡献规范的完整解读

Opik 优化器模块开发指南:从目录结构、构建命令到测试与贡献规范的完整解读

Opik 优化器模块开发指南:从目录结构、构建命令到测试与贡献规范的完整解读 【免费下载链接】comet-llm Debug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and produc…

📅 2026/9/14 18:18:17
MORE NEWS

更多资讯

📰

网盘直链下载助手完整指南:一次获取九大网盘真实下载直链

网盘直链下载助手完整指南:一次获取九大网盘真实下载直链 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…

📰

DS1302三线协议驱动详解:STM32 GPIO模拟时序与BCD时间校准

1. DS1302不是“普通IC器件”,它用的是三线同步串行协议——这是所有初学者踩坑的起点刚接触DS1302时,我手头只有STM32F103C8T6最小系统板和一块带电池的DS1302模块,照着某论坛“STM32DS1302”教程抄代码,烧录后串口打印全是0x00或…

📰

BLE广播者模式功耗优化与CH592芯片实践

1. 广播者模式的基础概念与功耗特性在低功耗蓝牙(BLE)开发领域,广播者(Broadcaster)模式是最基础的工作方式之一。这种模式下设备会周期性地发送广播包,但不会建立任何连接。沁恒微电子的CH592系列芯片作为…

📰

Simulink频率响应法控制器设计与实现

1. Simulink频率响应法控制器设计概述频率响应法是控制系统设计中一种经典且实用的方法,它通过分析系统在不同频率下的响应特性来设计控制器。在Simulink环境下实现这一过程,可以充分发挥可视化建模的优势,让复杂的控制理论变得直观可操作。我…

📰

彩色绕线画制作技术:色彩优化与密度控制算法

1. 彩色绕线画的艺术价值与技术痛点 彩色绕线画作为一种新兴的手工艺品形式,近年来在DIY爱好者圈子里越来越受欢迎。这种艺术形式通过在不同位置的钉子上缠绕彩色线绳,形成具有立体感和层次感的图案。与传统绘画不同,绕线画通过线条的叠加和交…

📰

Sympy physics.vector 深度解析:向量、参考系与刚体运动学的符号化建模

Sympy physics.vector 深度解析:向量、参考系与刚体运动学的符号化建模 【免费下载链接】sympy A computer algebra system written in pure Python 项目地址: https://gitcode.com/GitHub_Trending/sy/sympy 在 sympy 中,sympy.physics.vector 是…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬