仅针对一个子类的 Python unittest 跳过测试
Posted
技术标签:
【中文标题】仅针对一个子类的 Python unittest 跳过测试【英文标题】:Python unittest skip test for only one subclass 【发布时间】:2019-02-28 10:34:57 【问题描述】:假设我的单元测试设置如下:
import unittest
class BaseTest(object):
def setup(self):
self.foo = None
def test_something(self):
self.assertTrue(self.foo.something())
def test_another(self):
self.assertTrue(self.foo.another())
def test_a_third_thing(self):
self.assertTrue(self.foo.a_third_thing())
class TestA(BaseTest, unittest.TestCase):
def setup(self):
self.foo = FooA()
class TestB(BaseTest, unittest.TestCase):
def setup(self):
self.foo = FooB()
class TestC(BaseTest, unittest.TestCase):
def setup(self):
self.foo = FooC()
现在假设FooC
还没有实现a_third_thing
,我只想跳过test_a_third_thing
的TestC
类。有什么方法可以使用 @unittest.skipif
装饰器来做到这一点?或者其他一些方便的方法来跳过这个只针对这个类的测试?
Python 2.7,以防万一
【问题讨论】:
BaseTest 应该继承 TestCase 您可以覆盖TestC
中的测试,例如def test_a_third_thing(self): pass
@pylang 这就是我最终要做的,想要添加它作为答案吗?
完成。如果您确实找到了跳过测试的方法,我很想知道您发现了什么。
【参考方案1】:
您可能不需要“跳过”测试。一种简单的方法是使用虚拟对象覆盖基本测试。
class TestC(BaseTest, unittest.TestCase):
def setup(self):
self.foo = FooC()
def test_a_third_thing(self):
"""Override the assertions of the base test."""
pass
【讨论】:
【参考方案2】:您不能在此处使用@unittest.skipif
,因为它是在模块期间评估的,并且需要在运行时运行检查。
要达到预期的效果,您在基类中的test_a_third_thing
应该如下所示:
class BaseTest(unittest.TestCase):
def test_a_third_thing(self):
if not getattr(self.foo, "a_third_thing", None):
self.skipTest(self.foo.__class__.__name__ + ' has no a_third_thing, skip')
else:
self.assertTrue(self.foo.a_third_thing())
还将您的示例中的拼写错误 setup
修复为 setUp
。从测试类的继承列表中删除“unittest.TestCase”并添加到基类中。
【讨论】:
谢谢。我的示例中没有拼写错误,BaseTest 故意不从 TestCase 继承,因为我不想为 BaseTest 运行测试(它没有有效的 foo 属性)。看到这个问题:***.com/questions/1323455/… @C_Z_ 如果这回答了你的问题,你能接受这个答案吗? 这并没有具体回答我的问题,例如,假设我确实为 FooC 定义了一个foo
方法,但它没有完全实现,而是返回“False”。正如 pylang 建议的那样,可能在 TestC 中覆盖测试是要走的路。以上是关于仅针对一个子类的 Python unittest 跳过测试的主要内容,如果未能解决你的问题,请参考以下文章
Python接口测试实战3(下)- unittest测试框架