贝利信息

pytest 如何写 fixture 自动为每个测试用例创建临时目录

日期:2026-01-23 00:00 / 作者:冷炫風刃
pytest内置tmp_path fixtur

e最简单可靠:每个测试前自动创建独立临时目录,测试后自动清理,返回pathlib.Path对象,无需手动管理。

pytest 中用 tmp_path fixture 最简单可靠

不用自己写 fixture,pytest 内置的 tmp_path 就是专为这个场景设计的:每个测试函数运行前自动创建独立临时目录,测试结束自动清理。它返回的是 pathlib.Path 对象,开箱即用。

def test_something(tmp_path):
    data_file = tmp_path / "input.txt"
    data_file.write_text("hello")
    assert data_file.read_text() == "hello"

需要自定义临时目录结构?用 @pytest.fixture 包装 tmp_path

如果每个测试都需要预置子目录、配置文件或特定权限,可以在 fixture 中基于 tmp_path 构建,而不是从头 mktemp。这样既保留自动生命周期管理,又复用 pytest 的清理逻辑。

@pytest.fixture
def project_layout(tmp_path):
    (tmp_path / "src").mkdir()
    (tmp_path / "tests").mkdir()
    (tmp_path / "pyproject.toml").write_text("[build-system]")
    return tmp_path

def test_build_runs(project_layout):
    assert (project_layout / "src").exists()

为什么不用 tempfile.TemporaryDirectory()

手动用 tempfile.TemporaryDirectory() 容易出错:忘记 __enter__/__exit__、异常时未清理、多线程下路径冲突。pytest 的 tmp_path 在底层其实也用了类似机制,但封装了所有边界情况。

注意 tmp_pathtmp_path_factory 的分工

tmp_path 是函数级临时目录,够大多数场景;只有当你需要在 fixture 中动态生成多个目录、或想控制根路径位置(比如统一放在 SSD 分区),才用 tmp_path_factory

真正容易被忽略的是:临时目录名带随机后缀,但路径本身不加密、不隐藏;如果测试里打印了 tmp_path,CI 日志里会暴露真实路径结构 —— 这在审计敏感环境时可能是个小隐患。