datadir和shared_datadir均返回pathlib.path对象,但作用域不同:前者匹配当前测试模块同名目录(如test_x.py→test_x/),后者固定指向项目根目录下data/;两者均自动复制文件至临时目录,确保原始数据不被修改。

直接用 datadir fixture 就能拿到当前测试模块对应的数据目录,原始文件不会被修改,不用手动 copy 或写路径拼接逻辑。
datadir 和 shared_datadir 的区别在哪
两者都返回 pathlib.Path 对象,但作用域不同:
-
datadir:查找与当前测试文件同名的子目录(比如test_parser.py→test_parser/),只在该模块内可用 -
shared_datadir:固定指向项目根目录下的data/目录,所有测试共享,适合放通用配置、schema 文件等 - 两者都会把原始文件复制到临时目录再返回路径,所以测试中任意读写都不会污染源数据
测试文件目录结构怎么组织才不踩坑
pytest-datadir 默认按约定找目录,结构错一点就报 FileNotFoundError:
- 必须和测试文件同级建目录,名字要严格匹配(不含
.py后缀);例如test_load_csv.py对应test_load_csv/ - 目录里放
input.json、expected.yaml等,直接用datadir / "input.json"访问 - 别把数据文件丢进
tests/根目录——datadir不会去那里找 - 如果要用
shared_datadir,确保项目根下真有data/目录,且 pytest 运行时工作目录是项目根(不是tests/子目录)
为什么读取后文件内容没变,但 assert 却失败
常见于测试中修改了文件内容,误以为改的是原始文件:
- pytest-datadir 复制的是只读副本,但
Path.write_text()之类操作实际写入的是临时副本,不影响下次测试 - 如果你在测试里做了
datadir / "config.ini"的修改,然后期望另一个测试读到这个修改——不可能,每个测试拿到的都是全新副本 - 需要跨测试共享状态?别依赖文件,改用 fixture 返回内存对象,或显式用
tmp_path+shutil.copy控制生命周期 - 调试时可以用
print(datadir)确认路径是否指向/tmp/pytest-of-xxx/...,避免误判
最易忽略的其实是路径权限和符号链接——datadir 复制时会跳过 symlink,如果原始数据目录里用了软链指向外部文件,那些文件不会被复制进去,直接访问会报错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











