pytest 2.3在类中添加拆解


问题内容

我正在研究pytest(2.3)的新版本,并对您在其中的新功能感到非常兴奋

“只要执行了一些需要撤消的操作,就可以通过注册一个或多个拆解功能来精确地控制拆解,从而不需要单独的“拆解”装饰器。”

这里

何时将其用作函数非常清楚,但是如何在类中使用它呢?

class Test(object):

    @pytest.setup(scope='class')
    def stp(self):
        self.propty = "something"

    def test_something(self):
    ... # some code
    # need to add something to the teardown

    def test_something_else(self):
    ... # some code
    # need to add even more to the teardown

问题答案:

好的,我通过在整个“会话”范围内使用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

感谢@ hpk42答复电子邮件并帮助我获得最终版本。

注意:与xfailing其余步骤改进的方案一起,这现在构成了一个很好的
Test-Step结构