Pytest session作用域teardown fixture执行后tmp文件夹未删除如何解决
是的,你的fixture存在两处常见使用问题,分别是调用逻辑和路径配置问题:
- 第一,你定义的
teardownfixture没有被任何测试用例触发: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
相关产品推荐
相关产品推荐

