如何使用Python unittest assertRaises测试函数是否未抛出异常?

3 投票
3 回答
3380 浏览
提问于 2025-04-17 09:37

我正在尝试测试某个函数是否没有抛出任何异常,使用的是unittest模块。这样做可以吗?我只知道assertRaises这个方法,但这个方法只是用来测试是否抛出了异常,而传入None作为异常类型的参数是行不通的……

有没有什么想法?

3 个回答

0

我在做单元测试的时候也遇到了同样的问题。mouad和Michael说得对,不过有一种更简洁的方法来处理异常的断言,保持方法的一致性。

class TestCase(unittest.TestCase):
    def assertNoRaise(self, callableObj):
        try:
            callableObj()
        except:
            raise AssertionError('shouldn\'t raise an exception')

    def assertAnyRaise(self, callableObj):
        try:
            callableObj()
        except:
            return
        raise AssertionError('should raise an exception')

或者把上面的类和继承分开,然后用unittest.TestCase进行混合,这两种方式都可以。

还有一个使用案例

class my_test(TestCase):
    def setUp(self):
        pass
    def tearDown(self):
        pass

    def test_assertion(self):
        self.assertAnyRaise(lambda: 1+'a')
        self.assertNoRaise(lambda: 1+1)

请原谅我的英语不好。

2

如果发生了异常,测试就会被标记为失败,所以我不明白为什么你还需要去做任何断言。如果你真的想要这样做,你可以自己手动去做:

try:
   foo()
except:
   raise AssertionError('should not raise exception')
6

所以只要调用这个函数,如果它出现了异常,就会被报告为错误,而不是失败。这意味着你的单元测试运行器会停止(无法继续进行)。如果你想把它报告为失败,可以这样做:

try:
   somefunction()
except:
   self.fail("....")

撰写回答