0

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

4

2 回答 2

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
于 2013-04-26T17:51:06.017 回答
1

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

import unittest

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

    def tearDown(self):
        removeElements()

    #define test cases...
于 2013-04-25T22:32:05.493 回答