【问题标题】:Python unittest skip test for only one subclass仅针对一个子类的 Python unittest 跳过测试
【发布时间】: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_thingTestC 类。有什么方法可以使用 @unittest.skipif 装饰器来做到这一点?或者其他一些方便的方法来跳过这个只针对这个类的测试?

Python 2.7,以防万一

【问题讨论】:

  • BaseTest 应该继承 TestCase
  • 您可以覆盖TestC 中的测试,例如def test_a_third_thing(self): pass
  • @pylang 这就是我最终要做的,想要添加它作为答案吗?
  • 完成。如果您确实找到了跳过测试的方法,我很想知道您发现了什么。

标签: python python-unittest python-decorators


【解决方案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 属性)。看到这个问题:stackoverflow.com/questions/1323455/…
    • @C_Z_ 如果这回答了你的问题,你能接受这个答案吗?
    • 这并没有具体回答我的问题,例如,假设我确实为 FooC 定义了一个 foo 方法,但它没有完全实现,而是返回“False”。正如 pylang 建议的那样,可能在 TestC 中覆盖测试是要走的路。
    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多