首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python多继承单元测试-

Python多继承单元测试-
EN

Stack Overflow用户
提问于 2013-09-19 22:04:16
回答 1查看 2.9K关注 0票数 9

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

MyTest_DoesWork输出了我所期望的,这是setUp()tearDown()都被触发了。这种情况不会发生在MyTest_DoesNotWork上。为什么会发生这种情况?有什么线索吗?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2015-03-04 03:46:13

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

因此,对于MyTest_DoesNotWork,python将冲击setUptearDownunittest.TestCase实现,这两个实现什么也不做。因为unittest.TestCase.setUp没有被写成是协作式的,也没有调用其他超类setUp方法,所以它就到此为止了,不会打印任何东西。

对于MyTest_DoesWork,python将首先解析为MyClassTest1。就像unittest.TestCase一样,您还没有编写setUptearDown方法来协同调用超类方法。所以它就到此为止了,永远不会调用MyClassTest2方法。所以我猜即使是这样实际上也不会像你预期的那样工作。将您的MyClassTest1 setUptearDown方法更改为输出"MyClassTest1“而不是self.class,您将看到它是一直被调用的那个方法。永远不会调用MyClassTest2setUptearDown

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18896877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档