开发者社区> 问答> 正文

在单元测试中测试异常情况

你想写个测试用例来准确的判断某个异常是否被抛出。

展开
收起
哦哦喔 2020-04-17 17:32:15 1101 0
2 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!

    ssertRaises() 方法为测试异常存在性提供了一个简便方法。 一个常见的陷阱是手动去进行异常检测。比如:

    class TestConversion(unittest.TestCase): def test_bad_int(self): try: r = parse_int('N/A') except ValueError as e: self.assertEqual(type(e), ValueError)

    这种方法的问题在于它很容易遗漏其他情况,比如没有任何异常抛出的时候。 那么你还得需要增加另外的检测过程,如下面这样:

    class TestConversion(unittest.TestCase): def test_bad_int(self): try: r = parse_int('N/A') except ValueError as e: self.assertEqual(type(e), ValueError) else: self.fail('ValueError not raised')

    assertRaises() 方法会处理所有细节,因此你应该使用它。

    assertRaises() 的一个缺点是它测不了异常具体的值是多少。 为了测试异常值,可以使用 assertRaisesRegex() 方法, 它可同时测试异常的存在以及通过正则式匹配异常的字符串表示。例如:

    class TestConversion(unittest.TestCase): def test_bad_int(self): self.assertRaisesRegex(ValueError, 'invalid literal .*', parse_int, 'N/A')

    assertRaises() 和 assertRaisesRegex() 还有一个容易忽略的地方就是它们还能被当做上下文管理器使用:

    class TestConversion(unittest.TestCase): def test_bad_int(self): with self.assertRaisesRegex(ValueError, 'invalid literal .*'): r = parse_int('N/A')

    2020-04-17 18:04:04
    赞同 展开评论 打赏
  • 对于异常的测试可使用 assertRaises() 方法。 例如,如果你想测试某个函数抛出了 ValueError 异常,像下面这样写:
    
    import unittest
    
    # A simple function to illustrate
    def parse_int(s):
        return int(s)
    
    class TestConversion(unittest.TestCase):
        def test_bad_int(self):
            self.assertRaises(ValueError, parse_int, 'N/A')
    如果你想测试异常的具体值,需要用到另外一种方法:
    
    import errno
    
    class TestIO(unittest.TestCase):
        def test_file_not_found(self):
            try:
                f = open('/file/not/found')
            except IOError as e:
                self.assertEqual(e.errno, errno.ENOENT)
    
            else:
                self.fail('IOError not raised')
    
    2020-04-17 17:32:24
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
用AI 高效测试移动应用 立即下载
移动互联网测试到质量的转变 立即下载
给ITer的技术实战进阶课-阿里CIO学院独家教材(四) 立即下载