在python unittest中双重继承TestCase类时如何避免属性错误?

时间:2013-02-08 08:57:09

标签: python unit-testing inheritance

我有以下构造,其中我从unittest.TestCase派生了一个类,其中调用了一个在实际测试类MyTests中定义的方法。

import unittest

class TestCase1(unittest.TestCase):

    @classmethod
    def setUpClass(cls):  
        print cls.extra()

class TestCase2(TestCase1):

    @classmethod
    def setUpClass(cls):
        TestCase1.setUpClass()

class MyTests(TestCase1):

    @classmethod
    def extra(cls):
        return 42

    def test1(self):
        pass

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

上面的代码,按预期工作。当我执行测试时,setUpClass运行TestCase1,执行extra()中定义的MyTests

当我想使用TestCase2代替TestCase1时,即当我在下一行中将'1'更改为'2'时,问题就会发挥作用:

class MyTests(TestCase2): # using TestCase2 instead

我们的想法是setUpClass TestCase2被调用,它本身从基本类调用setUpClass,即TestCase1,它执行方法extra }。但是,我收到属性错误:

AttributeError: type object 'TestCase1' has no attribute 'extra'

我似乎在这里误解了一些概念。我希望我的代码在两种情况下都可以工作(可能存在一些错误),或者在两种情况下都失败。任何想法可能是错的或我如何解决问题都非常感谢。

2 个答案:

答案 0 :(得分:2)

原因是,当它从TestCase2继承时,调用cls的{​​{1}}属于TestCase1.setUpClass()类型,而TestCase1没有extra() }} 方法。从MyTests调用时,clsMyTests的一个实例,它有一个额外的方法。

supercls参数从MyTests.setUpClass(cls)传递到TestCase1.setUpClass(cls)。因此,当它达到TestCase1时,cls会有extra()方法。

答案 1 :(得分:1)

我强烈建议您使用super代替TestCase1.setUpClass()