讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 单元测试的基本设计思路

小强大大_7466

小强大大_7466

发布时间:2026-01-31 17:25:57

|

858人浏览过

|

来源于php中文网

原创

单元测试应验证单个函数或方法在隔离环境下的行为,需mock外部依赖;避免测流程、UI或真实I/O;命名用test_[功能]_[场景]_[预期];优先pytest+原生assert;断言要具体到关键字段。

python 单元测试的基本设计思路

单元测试该测什么,不该测什么

单元测试的核心是验证单个函数或方法在隔离环境下的行为是否符合预期,不是用来测整个流程、外部依赖或 UI 交互的。如果一个函数调用了 requests.get、读了文件、连了数据库,那就先得用 mock 或 patch 把这些依赖掐掉。

常见误操作包括:

  • 在测试里写 assert response.status_code == 200 —— 这属于集成测试范畴,除非你明确在测 HTTP 客户端封装层
  • 测试中创建真实数据库连接并执行 INSERT —— 应该用内存 SQLite 或 unittest.mock 替换 ORM 的 save() 方法
  • 给一个纯计算函数(比如 calculate_tax(amount, rate))写一堆边界 case 却漏掉 amount=0 或负数 —— 数值类函数必须覆盖零值、负值、极大值、None 和类型错误

如何组织 test_*.py 文件和测试方法名

Python 的 unittest 和 pytest 都默认识别以 test_ 开头的文件和方法。命名不是随便加前缀,而是要能一眼看出“被测对象 + 场景 + 期望结果”。

推荐格式:test_[function_name]_[scenario]_[expected_behavior],例如:

立即学习“Python免费学习笔记(深入)”;

test_calculate_tax_with_zero_amount_returns_zero<br>test_parse_json_invalid_input_raises_ValueError<br>test_user_login_success_returns_token

这样在 CI 失败时,光看测试名就能定位问题模块和触发条件,不用点开代码。避免使用 test_case1、test_main 这类无法传达语义的名字。

arcgis-js
arcgis-js

提供 ArcGIS Maps SDK for JavaScript 开发辅助,涵盖 2D/3D 地图视图、图层管理、数据可视化、空间分析等功能模块的参考和示例指导。

下载

setup/teardown 是不是每次都要写

不是。只有当多个测试方法共享相同初始化逻辑(比如创建临时目录、预置测试数据)且成本较高时,才考虑用 setUp() / tearDown()(unittest)或 @pytest.fixture(pytest)。否则,宁可每个测试里单独构造输入数据。

原因很实际:

  • 共享状态容易引发测试间污染 —— 某个测试改了全局变量或缓存,下一个测试就莫名其妙失败
  • 调试困难 —— 错误堆栈里看不出是 setup 还是测试体本身出的问题
  • setUp() 里抛异常会导致整组测试跳过,掩盖真正要测的分支逻辑

简单场景下,直接在测试方法开头写 data = {"name": "test", "age": 25} 更清晰、更可控。

断言该用 assert 还是 self.assertEqual

用 assert 语句就行,但前提是用 pytest。它会自动重写 assert 表达式,提供清晰的失败信息(比如告诉你 a=3 而不是只报 AssertionError)。而 unittest.TestCase 的 self.assertEqual(a, b) 在老项目里仍常见,但它对复杂嵌套结构(如 dict 差异)输出极不友好。

实操建议:

  • 新项目统一用 pytest + 原生 assert,配合 pytest-asyncio 测异步函数
  • 如果必须用 unittest,对字典比较别只写 self.assertEqual(d1, d2),改用 self.assertDictEqual(d1, d2),它会指出具体哪个 key 不同
  • 不要用 assert True == some_func(),直接写 assert some_func();也不要用 assert not result 代替 assert result is False,后者语义更精确

最常被忽略的一点:断言要贴近被测逻辑的粒度。比如函数返回一个对象,别只断言 isinstance(ret, User),而应检查 ret.name、ret.is_active 等关键字段是否按预期赋值。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4925

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

2070

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6407

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2688

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6407

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2688

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2945

2023.06.29

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

100

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn