我正在尝试了解使用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()
答案 0 :(得分:4)
Python的method resolution order会导致这种情况。使用继承结构,它按照您从左到右声明父类的顺序进行解析。
因此,对于MyTest_DoesNotWork
,python将会遇到unittest.TestCase
和setUp
的{{1}}实现,它们不执行任何操作。因为tearDown
没有被编写为合作并且调用其他超类unittest.TestCase.setUp
方法,所以它就会停在那里并且没有任何内容被打印出来。
使用setUp
,python将首先解析为MyTest_DoesWork
。就像MyClassTest1
一样,您还没有编写unittest.TestCase
和setUp
方法来协作调用超类方法。所以它停在那里,从不调用tearDown
方法。所以我猜,即使这实际上并没有像你预期的那样工作。更改您的MyClassTest2
MyClassTest1
和setUp
方法以打印出“MyClassTest1”而不是tearDown
,您将看到它是一直被调用的方法。 <{1}} self.class
和MyClassTest2
永远不会被调用。