如何在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
相关产品推荐
相关产品推荐

