17370845950

Python测试系统学习路线第510讲_核心原理与实战案例详解【指导】
Python测试中不存在“第510讲”官方体系;conftest.py是按目录向上查找的fixture注册中心;mock.patch需注意路径和参数顺序;doctest需显式启用并规范格式。

Python 测试系统没有“第510讲”这种官方分级体系,所谓“第510讲”是营销包装用语,实际并不存在对应权威课程编号或知识图谱节点。

pytest 的 conftest.py 作用和生效范围

它不是全局配置文件,而是 pytest 按目录层级向上查找的本地 fixture 注册中心。pytest 会从每个测试文件所在目录开始,逐级向上找最近的 conftest.py,直到项目根目录(但不会跨 pytest.inipyproject.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 正确 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 补丁打到了错误的命名空间——这些点比“学完多少讲”重要得多。