Python unittest 只跳过一个子类的测试

Python unittest skip test for only one subclass

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

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 class。有什么方法可以使用 @unittest.skipif 装饰器来做到这一点吗?或者其他一些方便的方法来跳过这个测试,只针对这个 class?

Python 2.7,以防万一

你不能在这里使用@unittest.skipif,因为它是在模块期间评估的,需要的检查应该是运行在运行期间。

为了达到预期的效果,您的 test_a_third_thing 在基础 class 中应该如下所示:

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。从测试 classes 的继承列表中删除 'unittest.TestCase' 并添加到基础 class.

您可能不需要 "skip" 测试。一种简单的方法是用虚拟对象覆盖基础测试。

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