Python多重继承单元测试 -

时间:2013-09-19 14:04:16

标签: python unit-testing inheritance

我正在尝试了解使用unittest.TestCase类进行多重继承时会发生什么。

MyTest_DoesWork输出我的预期,这是setUp()tearDown()被触发。 MyTest_DoesNotWork没有发生这种情况。为什么会这样?任何线索?

import unittest

class MyClassTest1(object):
    def setUp(self):
        print 'Setting up', self.__class__
    def test_a1(self):
        print "Running test_a1 for class", self.__class__
    def test_a2(self):
        print "Running test_a2 for class", self.__class__
    def tearDown(self):
        print 'Tearing down', self.__class__

class MyClassTest2(object):
    def setUp(self):
        print 'Setting up', self.__class__
    def test_b1(self):
        print "Running test_b1 for class", self.__class__
    def test_b2(self):
        print "Running test_b2 for class", self.__class__
    def tearDown(self):
        print 'Tearing down', self.__class__

class MyTest_DoesNotWork(unittest.TestCase, MyClassTest1, MyClassTest2):
    """
    Output:
    Running test_a1 for class <class '__main__.MyTest_DoesNotWork'>
    .Running test_a2 for class <class '__main__.MyTest_DoesNotWork'>
    .Running test_b1 for class <class '__main__.MyTest_DoesNotWork'>
    .Running test_b2 for class <class '__main__.MyTest_DoesNotWork'>
    """
    pass

class MyTest_DoesWork(MyClassTest1, MyClassTest2, unittest.TestCase):
    """
    Output:
    Setting up <class '__main__.MyTest_DoesWork'>
    Running test_a1 for class <class '__main__.MyTest_DoesWork'>
    Tearing down <class '__main__.MyTest_DoesWork'>
    .Setting up <class '__main__.MyTest_DoesWork'>
    Running test_a2 for class <class '__main__.MyTest_DoesWork'>
    Tearing down <class '__main__.MyTest_DoesWork'>
    .Setting up <class '__main__.MyTest_DoesWork'>
    Running test_b1 for class <class '__main__.MyTest_DoesWork'>
    Tearing down <class '__main__.MyTest_DoesWork'>
    .Setting up <class '__main__.MyTest_DoesWork'>
    Running test_b2 for class <class '__main__.MyTest_DoesWork'>
    Tearing down <class '__main__.MyTest_DoesWork'>
    """
    pass

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

1 个答案:

答案 0 :(得分:4)

Python的method resolution order会导致这种情况。使用继承结构,它按照您从左到右声明父类的顺序进行解析。

因此,对于MyTest_DoesNotWork,python将会遇到unittest.TestCasesetUp的{​​{1}}实现,它们不执行任何操作。因为tearDown没有被编写为合作并且调用其他超类unittest.TestCase.setUp方法,所以它就会停在那里并且没有任何内容被打印出来。

使用setUp,python将首先解析为MyTest_DoesWork。就像MyClassTest1一样,您还没有编写unittest.TestCasesetUp方法来协作调用超类方法。所以它停在那里,从不调用tearDown方法。所以我猜,即使这实际上并没有像你预期的那样工作。更改您的MyClassTest2 MyClassTest1setUp方法以打印出“MyClassTest1”而不是tearDown,您将看到它是一直被调用的方法。 <{1}} self.classMyClassTest2永远不会被调用。