Python 如何根据运行的测试结果在模块范围内具有拆卸功能

Python 如何根据运行的测试结果在模块范围内具有拆卸功能,python,python-3.x,testing,pytest,fixtures,Python,Python 3.x,Testing,Pytest,Fixtures,我想在所有测试通过后清理一些文件。如果它们失败,请保留它们进行调试。我阅读,因此在我的conftest.py中有以下内容: @pytest.hookimpl(tryfirst=True,hookwrapper=True) def pytest_runtest_makereport(项目,调用): #执行所有其他挂钩以获取报表对象 结果=产量 rep=结果。获取_结果() #为调用的每个阶段设置一个报告属性,该属性可以 #是“设置”、“呼叫”、“拆卸” setattr(项目“代表”+代表时间、代表

我想在所有测试通过后清理一些文件。如果它们失败,请保留它们进行调试。我阅读,因此在我的
conftest.py
中有以下内容:

@pytest.hookimpl(tryfirst=True,hookwrapper=True)
def pytest_runtest_makereport(项目,调用):
#执行所有其他挂钩以获取报表对象
结果=产量
rep=结果。获取_结果()
#为调用的每个阶段设置一个报告属性,该属性可以
#是“设置”、“呼叫”、“拆卸”
setattr(项目“代表”+代表时间、代表)
@pytest.fixture(scope=“module”,autouse=True)
def拆卸(请求):
产量
#request.node是一个“项”,因为我们使用默认值
#“功能”范围
如果request.node.rep_setup.failed:
打印(“设置测试失败!”,request.node.nodeid)
elif request.node.rep_setup.passed:
#清理我的文件
但是,我得到了一个错误:

AttributeError: 'Module' object has no attribute 'rep_setup'
与doc示例的唯一区别是,我的拆卸具有“
scope=module”
。但我必须这样做,因为我想在所有测试通过后清理文件,一些文件被所有测试使用。如果我使用默认范围,即“函数”级别,它将在每个测试用例之后清理,而不是在整个模块之后清理。我怎样才能解决这个问题


更新:在我有“hook”之前,我仍然有
teardown
,这是“模块”级别,它工作得很好,这意味着它在所有测试运行后为我清理了所有文件,唯一的问题是,无论测试通过还是失败,它都会为我清理

如果您在模块范围内,
request.node
表示模块,而不是单个测试。如果只想检查失败的测试,可以检查会话:

@pytest.fixture(scope=“module”,autouse=True)
def拆卸(请求):
产量
如果request.session.testsfailed>0:
打印(f“{}测试失败!”,request.session.testsfailed)
其他:
#清理我的文件
如果您只对这些信息感兴趣,我不确定此时请求中是否有任何关于安装失败的信息。
在这种情况下,您可以实现一个文件范围的装置,该装置在安装失败时设置一个标志,并使用该标志,例如:

SETUP\u失败=错误
@pytest.fixture(autouse=True)
def拆卸测试(请求):
产量
如果request.node.rep_setup.failed:
全局设置失败
安装程序\u失败=真
@pytest.fixture(scope=“module”,autouse=True)
def拆卸_模块():
全局设置失败
安装程序\u失败=错误
产量
如果安装失败:
打印(“至少一个测试设置失败!”)
其他:
#清理我的文件
这并不好,也许有人知道一个更好的解决方案,但它会起作用。 如果需要,还可以收集有关安装失败的测试的信息