0

0

Python 测试驱动开发的实践

舞夢輝影

舞夢輝影

发布时间:2026-02-17 14:45:11

|

217人浏览过

|

来源于php中文网

原创

pytest测试应与业务代码解耦:测试文件独立置于tests/目录,显式导入src模块,用pytest.raises校验异常,patch按被测代码内import路径进行,避免慢速fixture污染全局状态。

python 测试驱动开发的实践

pytest 里怎么组织测试用例才不会和业务代码耦合

测试代码和业务逻辑混在一起,改个函数名就满屏红,不是测试写得少,是结构没划清边界。

核心原则:测试文件路径、模块命名、导入方式,全部独立于 srcapp 目录。推荐项目结构:

myproject/
├── src/
│   └── mypkg/
│       └── core.py
├── tests/
│   └── test_core.py
  • 测试文件必须放在单独的 tests/ 根目录下,不嵌套进 src
  • test_core.py 里用 from src.mypkg.core import do_something 显式导入,别用相对导入或修改 sys.path
  • 运行时用 pytest tests/,而非 cd src && pytest ../tests —— 后者容易让 Python 把 src 当成包,引发重复导入或 ImportError
  • 如果用了 pyproject.toml,加一行 pythonpath = ["src"],比手动改 PYTHONPATH 更稳定

assert 和 pytest.raises 怎么选才不掩盖真实错误

assert 检查异常信息,看似省事,实则把 AttributeErrorKeyError 全吞成 AssertionError,调试时根本看不出哪行崩了。

  • 验证是否抛出异常,只用 pytest.raises(ExpectedError) 上下文管理器,别写 assert "not found" in str(e)
  • 要检查异常属性(比如 e.code == 404),在 with pytest.raises(HttpError) as excinfo: 之后取 excinfo.value.code
  • 避免 try/except + assert False 这种写法 —— 它会让 pytest 误判为“测试通过”,实际是跳过了异常校验
  • 如果函数本不该抛异常,但你写了 pytest.raises(Exception),等于主动屏蔽所有问题,不如直接调用后让测试自然 fail

mock.patch 为什么总 patch 不到,明明路径写对了

patch 的路径必须是「被测试对象内部 import 的位置」,不是定义位置,也不是你 import 的位置 —— 这点错一点全盘失效。

MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版
MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版

MediPro乡镇政府门户网站系统,适合乡镇政府机构创建地方门户网站,用以宣传本地资源,实现政务公开,促进乡镇基层信息化建设。本系统基于PHP+MYSQL开发,预设了乡镇风采、党政机构、政务公开、投资指南、服务导航、文件下载、公众互动、领导信箱等乡镇政府门户网站常用的栏目和测试数据,采用适合乡镇政府门户网站的专用模版,增强了系统的针对性和易用性。除了文章系统、图文系统、下载系统、社区交流、反馈表单

下载

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

  • 假设 src.mypkg.api.call_external() 里写了 import requests,那你得在测试里 @patch("src.mypkg.api.requests"),而不是 @patch("requests")@patch("src.mypkg.api.call_external.requests")
  • autospec=True 能提前暴露 mock 方法签名不匹配的问题,比如原函数接收 3 个参数,你调用时只传 2 个,它会立刻报错,而不是静默失败
  • 别在 setup_method 里 patch 然后忘掉 stop() —— 多个测试间会互相污染,优先用装饰器或上下文管理器
  • 如果被 patch 对象是类方法,确认你 patch 的是类本身("src.mypkg.service.MyClient"),不是实例方法名

测试慢、CI 卡住,哪些 fixture 实际上在拖后腿

数据库连接、HTTP 请求、随机 sleep —— 这些不该出现在单元测试里,但很多人把 @pytest.fixture(scope="session") 当成“只跑一次”的免检通行证。

  • scope="session" 的 fixture 会在整个 pytest 进程中存活,一旦里面开了 DB 连接又没 close,后续测试可能因连接数超限失败
  • 真正需要共享状态的(如测试用 SQLite 文件),用 tmp_path_factory 创建临时路径,测试结束自动清理,别复用真实环境路径
  • 带网络请求的 fixture(比如预热缓存)必须加 pytest.mark.network 标签,并在 CI 中默认跳过,本地可选执行
  • 如果某个 fixture 返回的是全局单例(如 logging.getLogger()),记得在每个测试后重置其状态,否则日志断言会串扰

最难的不是写测试,是判断哪段逻辑该测、哪段该绕开、哪段必须隔离 —— 很多“测试难维护”其实是边界没划清楚,而不是工具不会用。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

326

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

772

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

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

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

373

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2093

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

355

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号