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

Pytest session作用域teardown fixture执行后tmp文件夹未删除如何解决

是的,你的fixture存在两处常见使用问题,分别是调用逻辑和路径配置问题:

  • 第一,你定义的teardown fixture没有被任何测试用例触发:pytest不会自动执行未被引用的fixture,你虽然把fixture定义在test_teardown.py里,但只要没有测试用例显式将teardown作为参数传入,或者没有给fixture设置autouse=True属性,fixture的生命周期逻辑就不会运行,yield后的删除代码自然不会执行。
  • 第二,删除路径使用了相对路径存在风险:代码里写的shutil.rmtree('tmp')是相对于你执行pytest命令时的工作目录,而非test_teardown.py所在的目录,如果执行命令的目录和tmp文件夹所在目录不匹配,就会找不到目标文件夹导致删除失败,甚至会误删其他位置的同名文件夹。

修复方案

方案1:设置fixture自动生效(推荐适配全局清理需求)

修改test_teardown.py代码如下,增加autouse参数和路径兼容逻辑:

import shutil
import os
import pytest


@pytest.fixture(scope="session", autouse=True)
def teardown():
    # 可根据你的tmp文件夹实际位置调整路径拼接逻辑
    # 示例为获取当前test_teardown.py所在的tests目录,再拼接tmp路径
    tests_dir = os.path.dirname(os.path.abspath(__file__))
    tmp_path = os.path.join(tests_dir, "tmp")
    yield
    if os.path.exists(tmp_path):
        shutil.rmtree(tmp_path, ignore_errors=True)

加了autouse=True之后,这个会话级fixture会在测试会话启动时自动触发,会话结束后自动执行yield后的清理代码,不需要任何测试用例显式引用。

方案2:手动指定需要使用该fixture的测试用例

如果不需要全局自动清理,只需要特定测试用例执行完后清理,就保留原有fixture定义,然后在对应的测试用例里传入fixture参数即可,比如在test_moretests.py里:

def test_your_case(teardown):
    # 测试逻辑
    pass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 03:06:05