如何在setUpClass中使Python单元测试失败?

48 投票
3 回答
49380 浏览
提问于 2025-04-17 15:13

我正在用Python做一些单元测试,并在setUpClass里进行一些预检查。我想知道如何在setUpClass中抛出一个unitest-fail,就像下面这个简单的例子:

class MyTests(unittest.TestCase):

    @classmethod
    def setUpClass(cls):    
        unittest.TestCase.fail("Test")

    def test1(self):
        pass

if __name__ == '__main__':
    unittest.main()

这个例子会报错TypeError: unbound method fail() must be called with TestCase instance as first argument (got str instance instead)

我明白我遇到的错误,因为fail是一个实例方法,而我还没有MyClass的实例。像这样临时使用实例:

unittest.TestCase().fail("Test")

也不行,因为unittest.TestCase本身没有测试。有没有什么办法可以在setUpClass中,当某个条件不满足时,让MyClass中的所有测试都失败呢?

后续问题:有没有办法查看setUpClass中的测试?

3 个回答

3

我不是Python方面的专家,但我遇到过同样的问题,我通过添加一个叫做cls的参数解决了这个问题:

...
    @classmethod
    def setUpClass(cls):
        cls.fail(cls, "Test") 
...

我觉得这样做有点奇怪,但更清楚了。

当你传入cls这个参数时,会出现一个警告(期望的类型是'TestCase',但得到了'Type[MyTests]'),而且MyTests是从TestCase继承的,所以可以忽略添加这个注释:# noinspection PyTypeChecker

50

使用一个简单的断言应该可以解决问题

assert False, "I mean for this to fail"
71

在你的 setUp 实例方法里放入 self.fail("test") 会导致所有测试都失败。

我觉得在类级别上,最简单的方法是创建一个类变量,可以这样做:

@classmethod
def setUpClass(cls):
   cls.flag = False

def setUp(self):
   if self.flag:
       self.fail("conditions not met")

希望这正是你想要的。

撰写回答