Sanic Testing 快速上手:使用官方测试客户端编写 API 测试
Sanic Testing 快速上手使用官方测试客户端编写 API 测试【免费下载链接】sanicAccelerate your web app development | Build fast. Run fast.项目地址: https://gitcode.com/gh_mirrors/sa/sanic本篇技术指南围绕 Sanic 官方测试客户端sanic-testing展开介绍其安装方式、环境要求以及如何通过app.test_client与app.asgi_client编写同步与异步测试。读完本文后你将掌握 Sanic 应用测试的基础流程、三大测试客户端的差异与适用场景并能直接参考 Sanic 项目自身 tests 目录中的真实用法落地实践。什么是 Sanic Testingsanic-testing是 Sanic 的官方测试客户端official testing client。它的首要用途是驱动 Sanic 项目自身的测试——在本仓库的 tests 目录中几乎所有功能测试都通过app.test_client发起请求例如 tests/test_app.py 中就用一个最小应用验证路由处理器内的app.loop可用性def test_app_loop_running(app: Sanic): app.get(/test) async def handler(request): assert isinstance(app.loop, asyncio.AbstractEventLoop) return text(pass) request, response app.test_client.get(/test) assert response.text pass同时它也定位为让 API 测试快速跑起来的易用客户端只要把包装进环境即可直接通过应用实例上的test_client属性发起 HTTP 调用无需额外配置。最低环境要求依赖版本要求说明Python3.7运行时环境Sanic21.3使用独立的sanic-testing包需要特别说明的是Sanic 21.3 之前的版本该测试模块直接内置在 Sanic 中即sanic.testing21.3 起才拆分为独立的sanic-testing分发包。因此如果仍在使用旧版 Sanic无需单独安装本包。安装从 PyPI 直接安装即可pip install sanic-testing安装完成后不需要任何初始化动作——只要sanic-testing在当前 Python 环境中Sanic 应用实例就会自动暴露测试客户端。这一点可以从源码得到印证在 sanic/app.py 中test_client是一个惰性求值的属性首次访问时才导入并实例化客户端property def test_client(self) - SanicTestClient: if self._test_client: return self._test_client elif self._test_manager: return self._test_manager.test_client from sanic_testing.testing import SanicTestClient # type: ignore self._test_client SanicTestClient(self) return self._test_client同理asgi_client属性sanic/app.py在首次访问时惰性创建SanicASGITestClient。这意味着不装包也能正常使用 Sanic只有访问测试客户端属性时才需要sanic-testing。编写同步测试同步测试是 Sanic 应用最常见的测试方式。使用测试客户端只需两步在 fixture 中构造Sanic应用然后在测试中访问app.test_client属性并发起请求。import pytest from sanic import Sanic, response pytest.fixture def app(): sanic_app Sanic(TestSanic) sanic_app.get(/) def basic(request): return response.text(foo) return sanic_app def test_basic_test_client(app): request, response app.test_client.get(/) assert request.method.lower() get assert response.body bfoo assert response.status 200几点值得注意调用返回的是(request, response)二元组其中request是测试客户端收到的请求对象response是应用返回的响应对象对响应可同时使用response.body字节与response.text字符串两种访问方式仓库测试中两种写法都在使用Sanic(TestSanic)的第一个参数是应用名称仓库测试夹具 tests/conftest.py 中会用测试名生成唯一应用名避免应用注册表冲突。仓库自身的测试代码还展示了更丰富的断言模式例如在 tests/test_app.py 中直接断言response.text pass、在 tests/test_blueprint_group.py 中按不同 HTTP 方法逐个调用test_client.put/post/delete/patch并传入自定义headers。编写异步测试ASGI 客户端如果你希望测试以async函数编写可以使用 ASGI 客户端app.asgi_client。由于测试函数本身是协程需要在pytest中启用异步支持pip install pytest-asyncio安装后创建异步测试即可import pytest from sanic import Sanic, response pytest.fixture def app(): sanic_app Sanic(__name__) sanic_app.get(/) def basic(request): return response.text(foo) return sanic_app pytest.mark.asyncio async def test_basic_asgi_client(app): request, response await app.asgi_client.get(/) assert request.method.lower() get assert response.body bfoo assert response.status 200与同步版本相比唯一的区别是测试函数使用pytest.mark.asyncio装饰或按pytest-asyncio的全局配置方式标记每次调用前需要await即await app.asgi_client.get(/)。注意pytest-asyncio是本仓库测试栈之外的第三方插件不属于sanic-testing的依赖需要按需自行安装。三大测试客户端及其原理结合同一目录下的进阶文档 测试客户端详解sanic-testing共提供三种客户端能力各不相同按需选用1. 同步客户端SanicTestClient真实服务器SanicTestClient会在本机网络端口上真实启动一个 Sanic Server来运行测试每次调用端点时它都会拉起一次应用实例并绑定到宿主机操作系统的某个 socket 上然后使用httpx直接对该应用发起调用。这是 Sanic 应用测试的典型方式。安装sanic-testing后即可直接使用无需额外设置也可以通过 sanic/app.py 中test_client属性的惰性导入自动获得。当然你也可以自行实例化from sanic_testing.testing import SanicTestClient test_client SanicTestClient(app) test_client.get(/path/to/endpoint)第三种方式是通过TestManager统一管理两个客户端from sanic_testing import TestManager mgr TestManager(app) app.test_client.get(/path/to/endpoint) # or mgr.test_client.get(/path/to/endpoint)2. ASGI 异步客户端SanicASGITestClient进程内执行与每次请求都拉起服务器的SanicTestClient不同SanicASGITestClient不启动真实服务器而是借助httpx将 Sanic 作为 ASGI 应用执行直接钻进应用内部运行路由处理器因此调用必须awaitawait app.test_client.get(/path/to/endpoint)它提供与SanicTestClient完全相同的方法集合与使用方式。需要澄清一个常见误解ASGI 客户端并不要求被测应用必须按 ASGI 方式运行它和同步客户端一样都能测试任意 Sanic 应用。3. 常驻服务客户端ReusableClient手动控制生命周期ReusableClient与SanicTestClient思路相近真实启动应用实例并发出真实 HTTP 请求但应用的生命周期由你控制并非每个请求都重启一个 Web Server而是启动一次、按需停止并可在同一个运行实例上连续发起多次请求。与前两个客户端不同ReusableClient必须手动实例化from sanic_testing.reusable import ReusableClient client ReusableClient(app)并且要配合上下文管理器使用——一旦离开with作用域服务器即关闭from sanic_testing.reusable import ReusableClient def test_multiple_endpoints_on_same_server(app): client ReusableClient(app) with client: _, response client.get(/path/to/1) assert response.status 200 _, response client.get(/path/to/2) assert response.status 200这一模式特别适合同一服务实例上串行验证多个端点的场景避免了SanicTestClient每个请求重启服务的开销。支持的请求方法客户端提供以下请求方法与httpx的调用习惯几乎一致SanicTestClient.getSanicTestClient.postSanicTestClient.putSanicTestClient.patchSanicTestClient.deleteSanicTestClient.optionsSanicTestClient.headSanicTestClient.websocketSanicTestClient.request使用要点一个关键提醒这些方法可以接受任何你平时传给httpx的参数。唯一的例外是——当你使用test_client.request并希望手动指定 HTTP 方法时参数名是http_method而非methodtest_client.request(/path/to/endpoint, http_methodget)与 Sanic 项目自身的测试体系sanic-testing是 Sanic 自测的基石。从本仓库 tests/conftest.py 可以看到测试基座直接从sanic_testing.testing导入PORT常量并开启Sanic.test_mode Truefrom sanic_testing.testing import PORT ... Sanic.test_mode True此外conftest.py中的portfixturetests/conftest.py通过绑定 0 端口让操作系统自动分配可用端口再配合run_startupfixturetests/conftest.py以app.create_server(portPORT)的方式做启动类测试——这些模式都可以直接迁移到你自己的测试工程中。整个 tests 目录如test_app.py、test_blueprints.py、test_middleware.py、test_request.py等几乎都通过app.test_client发起请求是学习 Sanic Testing 各种用法的最佳活教材。官方测试实战指南还可参考 测试最佳实践。小结环境就绪后Python 3.7、Sanic 21.3pip install sanic-testing即可开箱即用同步测试走app.test_client异步测试走await app.asgi_client需pytest-asyncio三种客户端各有所长SanicTestClient每次请求拉起真实服务器、SanicASGITestClient在进程内按 ASGI 执行、ReusableClient常驻服务手动控制生命周期请求方法兼容httpx参数仅在request方法中用手动指定方法时需使用http_method参数想深入了解三种客户端的更多细节可继续阅读 测试客户端详解。【免费下载链接】sanicAccelerate your web app development | Build fast. Run fast.项目地址: https://gitcode.com/gh_mirrors/sa/sanic创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ku波段相控阵天线设计实战:从需求分解到馈电网络的完整路径

ku波段相控阵天线设计实战:从需求分解到馈电网络的完整路径

简介:这是一份聚焦相控阵天线工程设计的PPT教学课件,面向天线工程初学者、通信与雷达专业学生。内容从相控阵通过控制馈电相位实现波束扫描的基本原理切入,系统阐述侧射阵/端射阵的定义区别,以及阵列分析中阵元幅度、相位、间距三…

2026/9/21 2:25:21 阅读更多 →
STM32循迹避障小车完整设计:从传感器选型到PID调参与硬件避坑

STM32循迹避障小车完整设计:从传感器选型到PID调参与硬件避坑

简介:一份完整的STM32智能循迹避障小车课程设计报告,面向嵌入式初学者、电子竞赛参赛者及单片机课程设计学生,解决智能小车循迹、避障、PWM调速等核心设计问题。报告以STM32F103ZE为主控芯片,详细阐述红外对管循迹检测、超声波避障…

2026/9/21 2:24:21 阅读更多 →
CodeFormer 三阶段训练完整指南:从 VQGAN 到可调控人脸复原 Transformer

CodeFormer 三阶段训练完整指南:从 VQGAN 到可调控人脸复原 Transformer

CodeFormer 三阶段训练完整指南:从 VQGAN 到可调控人脸复原 Transformer 【免费下载链接】CodeFormer [NeurIPS 2022] Towards Robust Blind Face Restoration with Codebook Lookup Transformer 项目地址: https://gitcode.com/gh_mirrors/co/CodeFormer Co…

2026/9/21 2:24:21 阅读更多 →

最新新闻

STM32+MPU6050固定翼增稳飞控:从姿态解算到PID调参与救机

STM32+MPU6050固定翼增稳飞控:从姿态解算到PID调参与救机

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

2026/9/21 3:03:40 阅读更多 →
开始使用 VUX 之前:前置知识、工具链与工程化准备

开始使用 VUX 之前:前置知识、工具链与工程化准备

UI组件前端 【免费下载链接】vux Mobile UI Components based on Vue & WeUI 项目地址: https://gitcode.com/gh_mirrors/vu/vux 点击查看 免费下载 在正式使用 VUX(Vue & WeUI 移动端 UI 组件库)之前,你不需要是一位资深…

2026/9/21 3:03:40 阅读更多 →
VitePress 接入 Headless CMS:基于动态路由与数据加载器的完整实践指南

VitePress 接入 Headless CMS:基于动态路由与数据加载器的完整实践指南

前端文档 【免费下载链接】vitepress Vite & Vue powered static site generator. 项目地址: https://gitcode.com/gh_mirrors/vi/vitepress 点击查看 免费下载 导读 本文讲解如何将 VitePress 与各类 Headless CMS(无头 CMS)对接&…

2026/9/21 3:03:40 阅读更多 →
反激变压器设计全流程:12V/1A宽压输入算例详解

反激变压器设计全流程:12V/1A宽压输入算例详解

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

2026/9/21 3:03:40 阅读更多 →
杰理AW33N系列BLE 6.0芯片选型指南:AW332A/AW333A/AW336A/AW338A对比与避坑

杰理AW33N系列BLE 6.0芯片选型指南:AW332A/AW333A/AW336A/AW338A对比与避坑

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

2026/9/21 3:03:40 阅读更多 →
KubeSphere 仓库中的 go-fuzz-headers:用字节驱动的 Go 模糊测试辅助库

KubeSphere 仓库中的 go-fuzz-headers:用字节驱动的 Go 模糊测试辅助库

后端云原生容器编排微服务 【免费下载链接】kubesphere kubesphere/kubesphere: KubeSphere 是一个开源的企业级容器平台,构建于 Kubernetes 之上,提供全栈化容器管理能力,包括服务治理、DevOps、微服务治理、监控告警、日志查询等功能&#…

2026/9/21 3:02:40 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/19 23:35:34 阅读更多 →