如何在setUp之后使每个TestCase调用一个钩子?

时间:2017-04-28 07:04:19

标签: python python-3.x unit-testing testing python-unittest

在我的项目中,我有一个TestCase的子类(称之为BaseTest),它做了一些准备然后重置测试环境的东西,以及大量的实际测试用例子类(大约80个),每个子类都有自己独特的setUp方法

我希望每个单独的测试用例子类在其setUp方法的末尾调用特定的钩子。我想这样做而不改变这些方法中的每一种。

基本上,情况看起来大概就像这个示例文件:

import unittest


class BaseTest(unittest.TestCase):
    def setUp(self):
        super().setUp()
        print('prepping env')

    def tearDown(self):
        super().tearDown()
        print('resetting env')

    def post_setup_hook(self):
        print('in post_setup_hook')


class TestFeatureA(BaseTest):
    def setUp(self):
        super().setUp()
        print('prepping a')

    def tearDown(self):
        super().tearDown()

    def test_0(self):
        print('testing a0')

    def test_1(self):
        print('testing a1')


class TestFeatureB(BaseTest):
    def setUp(self):
        super().setUp()
        print('prepping b')

    def tearDown(self):
        super().tearDown()

    def test_0(self):
        print('testing b0')

    def test_1(self):
        print('testing b1')


if __name__ == '__main__':
    unittest.main()

我希望在每次打印'prepping a'或'prepping b'之后运行python -m unittest example在post setup hook'中打印'的结果,但不修改TestFeatureA或TestFeatureB。可以这样做吗?

请注意,我正在使用python 3.6。我认为这不会在python 2.x中运行。

2 个答案:

答案 0 :(得分:1)

您可以覆盖BaseTest(TestCase) post_setup_hook方法,以致电run run

只需将BaseTest方法复制粘贴到post_setup_hook,然后在setUp运行后添加withUnsafeBufferPointer来电。

答案 1 :(得分:0)

在这里使用装饰器怎么样?

def post_setup(f):
    def wrapper(*args):
        print('in post_setup_hook')
        f(*args)  # execute BaseTest setUp
        print(args[0].FOO)  # Access BasteTest class attribute
        print(args[0].foo)  # Access BasteTest object foo attribute
        print('out post_setup_hook')
    return wrapper


class BaseTest(unittest.TestCase):
    FOO = 'BAR'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.foo = 'bar'

    @post_setup
    def setUp(self):
        super().setUp()
        print('BaseTest - prepping env')

    def tearDown(self):
        super().tearDown()
        print('BaseTest - resetting env')


class TestFeatureA(BaseTest):
    def test_0(self):
        print('TestFeatureA - testing a0')


if __name__ == '__main__':
    unittest.main()

输出:

in post_setup_hook
BaseTest - prepping env
BAR
bar
out post_setup_hook
TestFeatureA - testing a0
BaseTest - resetting env