在每个单元测试用例的tearDown之后或之前调用函数

时间:2013-04-25 22:16:14

标签: python unit-testing

我有一个函数removeElements(),需要在每个测试用例的拆解中调用它。有什么办法可以在拆卸时自动调用此函数,而不是在每个测试用例中复制函数调用吗?

2 个答案:

答案 0 :(得分:2)

您似乎已经了解了testCase方法,并且您已经知道如何继承实现,而您唯一缺少的是如何继承实现但仍允许自定义。

最简单的方法是创建一个实现tearDown挂钩的中间类或mixin类。例如,让我们说你正在编写这样的测试用例:

class MyTestCase(unittest.TestCase):
    def tearDown(self):
        print('Tearing down {}'.format(self))

...但您希望他们都致电removeElements

定义此中间类:

class ElementRemovingTestCase(unittest.TestCase):
    def tearDown(self):
        self.removeElements()

现在用这种方式写你的案例:

class MyTestCase(ElementRemovingTestCase):
    def tearDown(self):
        super(MyTestCase, self).tearDown()
        print('Tearing down {}'.format(self))

如果您不想在方法解析链中传递tearDown,那么您可以在每个测试用例中保存一行代码,您只需定义一个新的挂钩协议:

class ElementRemovingTestCase(unittest.TestCase):
    def tearDown(self):
        self.removeElements()
        self.additionalTearDown()

class MyTestCase(ElementRemovingTestCase):
    def additionalTearDown(self):
        print('Tearing down {}'.format(self))

在Python中任何其他常用的OO选项都可以在这里使用,无论你想要多么疯狂:

for name, case in inspect.getmembers(sys.modules[__name__], 
                                     lambda cls: issubclass(cls, unittest.TestCase)):
    real_tearDown = case.tearDown
    def tearDown(self):
        self.removeElements()
        real_tearDown(self)
    case.tearDown = real_tearDown

答案 1 :(得分:1)

Python unittest有一个tearDown()方法可以使用:

import unittest

class ElementTestCase(unittest.TestCase):
    def setUp(self):
        addElements()

    def tearDown(self):
        removeElements()

    #define test cases...