tmp_path比tempfile.mkdtemp()更可靠,因其自动绑定测试生命周期、无需手动teardown、天然隔离并发且不污染项目目录;它由pytest内置管理,失败时也自动清理,返回pathlib.path避免路径拼接错误,并强制要求所有i/o显式使用该路径。

因为tmp_path自动绑定测试生命周期,不用写teardown、不会残留、不污染项目目录,且天然隔离并发测试。
tmp_path 为什么比 tempfile.mkdtemp() 更可靠
手动调用 tempfile.mkdtemp() 后必须配对 shutil.rmtree(),漏掉一次就留垃圾;CI 环境里还可能因权限或并发导致 PermissionError 或文件名冲突。而 tmp_path 是 pytest 内置 fixture,测试函数退出(无论 pass 还是 fail)后自动调用 shutil.rmtree() 清理整棵树。
- 它不依赖 try/finally,也不需要 yield fixture —— 只要在参数里声明
tmp_path,清理就发生 - 返回的是
pathlib.Path实例,不是字符串,避免 Windows 下反斜杠拼接错误 - 路径位于系统临时目录(如
/tmp/pytest-of-user/),完全不碰你的项目根目录或./tmp
常见误用:文件没进 tmp_path 就等于没测
如果你在测试里写 open("output.log", "w"),那文件根本没落在 tmp_path 下,测试结束时不会被清理,内容也无法验证 —— 这是调试时最常卡住的地方。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 所有 I/O 必须显式使用
tmp_path / "subdir" / "file.txt"拼接路径 - 别用
os.chdir()切工作目录,pytest 不保证测试间cwd一致 - 读取时也得从
tmp_path下读,比如(tmp_path / "result.json").read_text(),而不是open("result.json") - 如果被测代码硬编码了路径(如
"./export/data.csv"),得用monkeypatch.setattr()劫持,光靠tmp_path没用
tmp_path vs tmp_path_factory:别错用 scope
tmp_path 是函数级 fixture,每个测试独享一份;tmp_path_factory 是会话级,适合预生成大文件并跨测试复用。但滥用后者会引入竞态风险。
- 95% 的场景只用
tmp_path:简单、隔离、无脑安全 - 只有当你需要“一次生成、多次读取”(比如一个 100MB 测试数据集),才考虑
tmp_path_factory.mktemp("data") - 误把
tmp_path_factory当tmp_path直接用,会报AttributeError: 'TempPathFactory' object has no attribute 'joinpath' - 共享目录意味着多个测试可能同时读写同一路径,得自己加锁或确保只读
真正难的不是创建临时目录,而是让所有路径都严格走 tmp_path 链路 —— 包括被测代码内部的路径构造逻辑。这点一旦漏掉,自动清理和隔离就全失效了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










