1

基于我有限的 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还有很多其他的。

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

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

我怎么能调用不同setUp的函数DTestWrapper?这甚至可能吗?

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

4

2 回答 2

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()将跳过该基类上的任何方法,因为它必须假设该基类是父类。

于 2013-07-15T18:17:53.800 回答
1

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

这样,一旦你的类被实例化(子类化unittest.TestCase或者BaseA取决于你的inLinux变量),正确的方法将自动被调用,而不需要重新定义它们。

如果您确实需要扩展它们,那么一个简单的

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

应该做。

于 2013-07-15T18:25:20.300 回答