1

我正在研究 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
4

2 回答 2

3

好的,我通过一个“会话”范围的 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 其余的步骤改进的场景,这现在构成了一个非常好的测试步骤结构

于 2012-09-24T22:43:45.943 回答
0

事实上,目前还没有很好的拆解例子。请求对象有一个addfinalizer方法。这是一个示例用法:

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

当范围内的所有测试完成执行时,将调用 finalizer 函数。

于 2012-09-22T06:42:17.490 回答