基于我有限的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
是一个自定义类,用于将测试输出美化到表中。它有成员函数setUpTestCase
,tearDownTestCase
和许多其他函数。
我想做什么:
我想基于不同的平台为我自己的班级setUp
调用不同的tearDown
和DTestWrapper
函数,如上面的代码所示。当它在Linux上运行时,我想使用BaseA
setUp
和tearDown
函数;否则,我想使用python unittest.TestCase
中的函数。我有另一个继承自D
的班级DTestWrapper
,它会覆盖setUpDTest
方法,但目前它只是为了测试目的而空。
问题:
当我运行上面的代码片段时,似乎没有调用setUp
或setUpTestCase
(测试全部失败,如果它们被正确调用则不应该)。
我的问题是:
如何在setUp
中调用不同的DTestWrapper
函数?这甚至可以吗?
由于我正在学习,所以非常感谢任何反馈。谢谢。
答案 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)
我会尝试将您的自定义方法重命名为setUp
和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
应该这样做。