pytest 2.3 adding teardowns within the class

夙愿已清 提交于 2019-12-01 12:08:22
Alex Okrushko

Ok, I got it working by having a 'session'-wide funcarg finalizer:

@pytest.fixture(scope = "session")
def finalizer():
    return Finalizer()

class Finalizer(object):

    def __init__(self):
        self.fin_funcs = []

    def add_fin_func(self, func):
        self.fin_funcs.append(func)

    def remove_fin_func(self, func):
        try:
            self.fin_funcs.remove(func)
        except:
            pass

    def execute(self):
        for func in reversed(self.fin_funcs): 
            func()
        self.fin_funcs = []     

class TestSomething(object):

    @classmethod
    @pytest.fixture(scope = "class", autouse = True)
    def setup(self, request, finalizer):

        self.finalizer = finalizer
        request.addfinalizer(self.finalizer.execute)
        self.finalizer.add_fin_func(lambda: some_teardown())

    def test_with_teardown(self):

        #some test
        self.finalizer.add_fin_func(self.additional_teardown)

    def additional_teardown(self):
        #additional teardown

Thanks @hpk42 for answering e-mails and helping me get the final version.

NOTE: together with xfailing the rest of the steps and improved scenarios this now makes a pretty good Test-Step structure

Indeed, there are no good examples for teardown yet. The request object has a addfinalizer method. Here is an example usage:

@pytest.setup(scope=...)
def mysetup(request):
     ...
     request.addfinalizer(finalizerfunction)
     ...

The finalizerfunction will be called when all tests withing the scope finished execution.

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