Python测试中不存在“第510讲”官方体系;conftest.py是按目录向上查找的fixture注册中心;mock.patch需注意路径和参数顺序;doctest需显式启用并规范格式。

Python 测试系统没有“第510讲”这种官方分级体系,所谓“第510讲”是营销包装用语,实际并不存在对应权威课程编号或知识图谱节点。
pytest 的 conftest.py 作用和生效范围
它不是全局配置文件,而是 pytest 按目录层级向上查找的本地 fixture 注册中心。pytest 会从每个测试文件所在目录开始,逐级向上找最近的 conftest.py,直到项目根目录(但不会跨 pytest.ini 或 pyproject.toml 中指定的 testpaths 边界)。
- 同一目录下的多个
conftest.py会被忽略(只认一个) - 子目录中的
conftest.py可以覆盖父目录同名@pytest.fixture,但不能覆盖autouse=True的 fixture 调用顺序 - 若在
conftest.py中误写import pytest后又定义了pytest_runtest_makereport钩子,但没加@pytest.hookimpl装饰器,会导致TypeError: object of type 'function' has no len()
mock.patch 的三种常用写法与作用域陷阱
最易出错的是装饰器写法中参数顺序:被 patch 的对象路径必须写全(如 "requests.get"),且位置参数传入顺序严格对应 patch 声明顺序,和函数定义参数名无关。
-
@patch("module.Class.method")→ 测试方法多一个参数,是 mock 实例 -
with patch("module.func") as mock_func:→ 作用域内生效,退出 with 即还原 -
patcher = patch("module.obj"); mock_obj = patcher.start(); patcher.stop()→ 手动控制生命周期,常用于setUp/tearDown - 错误示例:
@patch("json.loads")写成@patch("loads"),会 patch 当前模块里的loads,而非标准库
如何让 pytest 识别 doctest 并统一运行
默认不执行 doctest,需显式启用。关键不是加 --doctest-modules 就完事,还要注意模块导入路径和文档字符串格式。
立即学习“Python免费学习笔记(深入)”;
- 确保目标模块能被 Python 正确 import(即在
PYTHONPATH或当前工作目录下) - doctest 示例末尾不能有多余空格,
>>>后必须紧跟代码,结果行顶格对齐 - 若 doctest 中用了
print(),而输出含换行或对象内存地址(如<__main__.x object at>),需加# doctest: +ELLIPSIS或+NORMALIZE_WHITESPACE - 推荐在
pyproject.toml中固定配置:
[tool.pytest.ini_options] addopts = [ "--doctest-modules", "--doctest-ignore-import-errors", "--doctest-report=udiff", ] python_files = ["test_*.py", "*_test.py", "*.py"]
真实项目里,测试失败往往卡在路径没设对、fixture 作用域理解偏差、或 mock 补丁打到了错误的命名空间——这些点比“学完多少讲”重要得多。










