【问题标题】:How to test if the right exception is raised and caught using unit testing?如何使用单元测试测试是否引发并捕获了正确的异常?
【发布时间】:2015-11-02 07:38:05
【问题描述】:

我想测试是否使用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()

【问题讨论】:

    标签: python unit-testing exception python-unittest


    【解决方案1】:

    不,您不能从外部测试仅在函数内部产生影响的事物。

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

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

    如果异常只是一个实现细节,您可能根本不应该对其进行测试。

    【讨论】:

    • 你最后一句话是什么意思?
    【解决方案2】:

    您可以捕获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 ===========================
    

    【讨论】:

    • 感谢您的回复。你能看看我的完整代码吗?
    • 用一个小例子编辑了我的答案
    【解决方案3】:

    尝试从您的函数中返回 TrueFalse

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

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 2016-01-21
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2020-11-10
      • 2018-01-16
      • 1970-01-01
      • 2014-05-22
      相关资源
      最近更新 更多