仅对一个子类的Python unittest跳过测试

时间:2018-09-24 21:07:47

标签: python python-unittest python-decorators

假设我的单元测试设置如下:

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,以防万一

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您不能在此处使用@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”,然后将其添加到基类。