如何从不同的基类调用函数

时间:2013-07-15 18:15:41

标签: python

基于我有限的Python知识,我生成了以下代码片段:

#import statements skipped
class DTestWrapper(BaseA if inLinux else unittest.TestCase):

    def setUpDTest(self):
        if inLinux:
            super(BaseA , self).setUpTestCase()
        else:
            super(unittest.TestCase, self).setUp()

    def tearDownDTest(self):
        if inLinux:
            super(BaseA ,self).tearDownTestCase()
        else:
            super(unittest.TestCase,self).tearDown()

一些背景:
BaseA是一个自定义类,用于将测试输出美化到表中。它有成员函数setUpTestCasetearDownTestCase和许多其他函数。

我想做什么
我想基于不同的平台为我自己的班级setUp调用不同的tearDownDTestWrapper函数,如上面的代码所示。当它在Linux上运行时,我想使用BaseA setUptearDown函数;否则,我想使用python unittest.TestCase中的函数。我有另一个继承自D的班级DTestWrapper,它会覆盖setUpDTest方法,但目前它只是为了测试目的而空。

问题:
当我运行上面的代码片段时,似乎没有调用setUpsetUpTestCase(测试全部失败,如果它们被正确调用则不应该)。 我的问题是:

如何在setUp中调用不同的DTestWrapper函数?这甚至可以吗?

由于我正在学习,所以非常感谢任何反馈。谢谢。

2 个答案:

答案 0 :(得分:2)

super()需要当前类来寻找父母:

class DTestWrapper(BaseA if inLinux else unittest.TestCase):
    def setUpDTest(self):
        parent_method = 'setUpTestCase' if inLinux else 'setUp'
        getattr(super(DTestWrapper, self), parent_method)()

    def tearDownDTest(self):
        parent_method = 'tearDownTestCase' if inLinux else 'tearDown'
        getattr(super(DTestWrapper, self), parent_method)()

您可能希望将BaseA方法名称与unittest.TestCase方法匹配,并在那里保存额外的if测试。简单的别名会做;例如BaseA.tearDown = BaseA.tearDownTestCase

super()需要当前类来确定正确的方法解析顺序,该顺序完全取决于基类的组合和顺序。如果你从它开始给它一个基类,那么super()将跳过该基类的任何方法,因为它必须假定该基类是父类。

答案 1 :(得分:0)

我会尝试将您的自定义方法重命名为setUptearDown,如果可能的话。

这样,一旦您的类被实例化(根据您的unittest.TestCase变量继承BaseAinLinux),将自动调用正确的方法,而无需重新定义它们。

如果你确实需要扩展它们,那么就简单

class DTestWrapper(BaseA if inLinux else unittest.TestCase):

    def setUp(self):
        super(DTestWrapper, self).setUp()
        # your custom logic

    def tearDown(self):
        super(DTestWrapper, self).tearDown()
        # your custom logic

应该这样做。