PyTest skip module_teardown()

匆匆过客 提交于 2019-12-10 10:22:04

问题


I have following code in my tests module

def teardown_module():
    clean_database()
def test1(): pass
def test2(): assert 0

and I want teardown_module() (some cleanup code) to be called only if some test failed. Otherwise (if all passed) this code shouldn't have to be called. Can I do such a trick with PyTest?


回答1:


You can. But it is a little bit of a hack. As written here: http://pytest.org/latest/example/simple.html#making-test-result-information-available-in-fixtures you do the following, to set up an attribute for saving the status of each phase of the testcall:

# content of conftest.py
import pytest
@pytest.mark.tryfirst
def pytest_runtest_makereport(item, call, __multicall__):
    rep = __multicall__.execute()
    setattr(item, "rep_" + rep.when, rep)
    return rep

and in the fixture you just examine the condition on those attributes like this:

import pytest
@pytest.yield_fixture(scope="module", autouse=True)
def myfixture(request):
    print "SETUP"
    yield
    # probably should not use "_collected" to iterate over test functions
    if any(call.rep_call.outcome != "passed" for call in request.node._collected):
        print "TEARDOWN"

This way if any of the tests associated with that module fixture is not "passed" (so "failed" or "skipped") then the condition holds.



来源:https://stackoverflow.com/questions/31432013/pytest-skip-module-teardown

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!