如何测试是否使用单元测试引发和捕获了正确的异常?

时间:2015-08-10 11:47:22

标签: python unit-testing exception python-unittest

我想测试是否使用unittest引发并捕获了一个正确的异常。

以下是我的示例代码:

def foo():
    try:
        raise Exception(ValueError)
    except ValueError:
        print "raised"

以下是我想做的事情:

self.assertRaises(ValueError, foo)

由于我发现异常,我无法assertRaise异常。 我错过了什么或有其他方式吗?

我的完整代码:

#!/usr/bin/python
import unittest
def foo():
    try:
        raise ValueError
    except ValueError, e:
        print "caught"
class tester(unittest.TestCase):
    def test1(self):
        with self.assertRaises(ValueError):
            foo()
    def test2(self):
        self.assertRaises(ValueError, foo)
if __name__ == '__main__':
    unittest.main()

3 个答案:

答案 0 :(得分:2)

不,你不能测试只在函数内部产生影响的东西。

您可以做的是将引发异常的代码拆分为自己的函数,然后对其进行测试以检查是否引发了异常(使用assertRaises)。原始函数可以调用那个函数,如果你对该函数进行正常测试,那么显然它会捕获异常。

然而,这是否是一个好主意取决于你的功能。为什么重要该函数在某个时刻引发异常然后捕获它?也许有一天你会转而采用其他方式做同样的事情,结果相同。你的测试不能继续工作吗?

如果异常只是一个实现细节,你可能根本不应该测试它。

答案 1 :(得分:1)

您可以捕获stdout并测试字符串匹配。 Pytest为此提供fixture

#!/usr/bin/python
import unittest

def foo():
    try:
        raise ValueError
    except ValueError, e:
        print "caught"

def test_foo(capfd):
    foo()
    out, err = capfd.readouterr()
    assert out == "caught\n"

py.test test.py

============================= test session starts ==============================
platform linux2 -- Python 2.7.9 -- py-1.4.28 -- pytest-2.7.1
rootdir: /tmp, inifile: 
collected 1 items 

test.py .

=========================== 1 passed in 0.01 seconds ===========================

答案 2 :(得分:0)

尝试从您的函数返回TrueFalse

def foo():
    try:
        #work flow
        return True
    except ValueError:
        #error handle
        return False

self.assertFalse(foo())