Python TestCase和mixin类的setUp()/tearDown()方法的继承顺序

Python TestCase和mixin类的setUp()/tearDown()方法的继承顺序,python,unit-testing,multiple-inheritance,Python,Unit Testing,Multiple Inheritance,我想知道,unittest在为具有多重继承的类运行setUp()/tearDown()方法时做了什么特殊的事情 以以下为例: 导入单元测试 Foo类: 定义初始化(self,foo): self.\u foo=foo @财产 def foo(self): 回归自我 类TestsBase(unittest.TestCase): def设置(自): super().setUp() self.base_值=1 类TestsMixin: def设置(自): super().setUp() self.ex

我想知道,
unittest
在为具有多重继承的类运行
setUp()
/
tearDown()
方法时做了什么特殊的事情

以以下为例:

导入单元测试
Foo类:
定义初始化(self,foo):
self.\u foo=foo
@财产
def foo(self):
回归自我
类TestsBase(unittest.TestCase):
def设置(自):
super().setUp()
self.base_值=1
类TestsMixin:
def设置(自):
super().setUp()
self.expected_值=1
类TestCase1(TestsMixin,TestsBase):
def测试基本值等于预期值(自身):
foo=foo(自基值)
self.assertEqual(foo.foo,self.expected\u值)
类TestCase2(TestsBase,TestsMixin):
def测试基本值等于预期值(自身):
foo=foo(自基值)
self.assertEqual(foo.foo,self.expected\u值)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
unittest.main()
运行此代码时,
TestCase1
类测试将成功,而
TestCase2
测试将失败,原因是
AttributeError:“TestCase2”对象没有属性“预期值”

现在,我明白了MRO是如何工作的,我也明白了为什么会出现这个错误,但让我困惑的是,为什么
TestCase1
没有同样的问题?毕竟,难道不会使用
TestsMixin
中的
setUp()
方法,而跳过
TestsBase
中的
setUp()

我的结论是,
unittest
模块必须要做些什么才能让它工作。有人知道怎么做吗


提前谢谢。

我已经找到了我自己问题的答案。最后,一切都归结于MRO

例如,MRO如下所示:

对于TestCase1:

 - TestCase1
 - TestsMixin
 - TestsBase
 - unittest.TestCase
 - object
对于TestCase2:

 - TestCase2
 - TestsBase
 - unittest.TestCase
 - TestsMixin
 - object
问题是,
unittest.TestCase
在自己的
setUp()
调用中不调用
super().setUp()

原因很简单,
object
没有
setUp()

unittest.TestCase()
中,通过在其
setUp()
例程中添加以下代码,可以很容易地避免这种情况:

def setUp(self):
    parent = super()
    if hasattr(parent, 'setUp'):
        parent.setUp()
它是有效的。但这表明了另一个问题。现在,我的
TestsMixin
出于完全相同的原因停止工作。我必须在每个mixin中添加这个保护代码,这并不理想

因此,更好的解决方案是保持原样,并确保在你的基础之前列出你的混音