我正在尝试理解使用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()发布于 2015-03-04 03:46:13
Python的method resolution order导致了这种情况。对于继承结构,它是按照从左到右声明父类的顺序进行解析的。
因此,对于MyTest_DoesNotWork,python将冲击setUp和tearDown的unittest.TestCase实现,这两个实现什么也不做。因为unittest.TestCase.setUp没有被写成是协作式的,也没有调用其他超类setUp方法,所以它就到此为止了,不会打印任何东西。
对于MyTest_DoesWork,python将首先解析为MyClassTest1。就像unittest.TestCase一样,您还没有编写setUp和tearDown方法来协同调用超类方法。所以它就到此为止了,永远不会调用MyClassTest2方法。所以我猜即使是这样实际上也不会像你预期的那样工作。将您的MyClassTest1 setUp和tearDown方法更改为输出"MyClassTest1“而不是self.class,您将看到它是一直被调用的那个方法。永远不会调用MyClassTest2、setUp和tearDown。
https://stackoverflow.com/questions/18896877
复制相似问题