You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pytest测试装饰器中使用fixture实现临时目录切换?

解决pytest临时目录切换后恢复原目录的问题

你的问题核心是装饰器执行时机和fixture生命周期不匹配:装饰器在测试函数定义阶段就会被调用,此时test_dir还只是一个fixture函数对象,不是运行时生成的实际临时目录路径,所以os.chdir(dir)根本找不到正确的目录。

最简洁且符合pytest规范的解决方式,是把切换目录的逻辑直接整合到fixture里,无需单独写装饰器:

import os
import tempfile
import pytest

@pytest.fixture
def test_dir():
    # 保存原工作目录
    origin_dir = os.getcwd()
    with tempfile.TemporaryDirectory() as tmp_dir:
        # 切换到临时目录
        os.chdir(tmp_dir)
        # 将临时目录路径传递给测试函数
        yield tmp_dir
        # 测试结束后切回原目录
        os.chdir(origin_dir)

使用时直接在测试函数中依赖这个fixture即可:

def my_test(test_dir):
    # 此时当前工作目录已经是临时目录
    assert os.getcwd() == test_dir
    # 在这里执行你的测试操作

为什么原装饰器方案行不通?

你写的@change_dir(test_dir)在代码加载阶段就会执行,此时test_dir是pytest的fixture函数(不是运行时生成的目录字符串),os.chdir接收的参数类型错误,自然无法正常切换目录。而且装饰器无法直接获取fixture运行时的返回值,这是两者生命周期的本质冲突。

内容的提问来源于stack exchange,提问作者Ni3dzwi3dz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:09:53