Python单元测试中assertRaises未捕获异常

47 投票
1 回答
49773 浏览
提问于 2025-04-18 15:25

有人能告诉我为什么下面这个单元测试在测试bad的时候会出现ValueError错误,而不是用assertRaises来捕捉到这个错误并成功吗?我觉得我使用的步骤和语法都是正确的,但这个ValueError没有被捕捉到。

我在一台运行Linux的机器上使用Python 2.7.5。

这是代码……

import unittest

class IsOne(object):
    def __init__(self):
        pass
    def is_one(self, i):
        if (i != 1):
            raise ValueError

class IsOne_test(unittest.TestCase):

    def setUp(self):
        self.isone = IsOne()

    def test_good(self):
        self.isone.is_one(1)
        self.assertTrue(True)

    def test_bad(self):
        self.assertRaises(ValueError, self.isone.is_one(2))

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

这是单元测试的输出:

======================================================================
ERROR: test_bad (__main__.IsOne_test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test/raises.py", line 20, in test_bad
    self.assertRaises(ValueError, self.isone.is_one(2))
  File "test/raises.py", line 8, in is_one
    raise ValueError
ValueError

----------------------------------------------------------------------
Ran 2 tests in 0.008s

FAILED (errors=1)

1 个回答

93

Unittest中的assertRaises方法需要一个可调用的对象和一些参数,所以在你的例子中,你可以这样使用它:

self.assertRaises(ValueError, self.isone.is_one, 2)

如果你愿意,从Python2.7开始,你也可以把它当作上下文管理器来使用,像这样:

with self.assertRaises(ValueError):
    self.isone.is_one(2)

撰写回答