📜  Python|单元测试中的异常条件测试

📅  最后修改于: 2022-05-13 01:54:47.432000             🧑  作者: Mango

Python|单元测试中的异常条件测试

本文旨在编写一个单元测试,干净地测试是否引发异常。为了测试异常,使用了assertRaises()方法。

代码 #1:测试函数是否引发了 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')

代码 #2:需要使用不同的方法测试异常的值

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')

assertRaises()方法提供了一种方便的方法来测试是否存在异常。一个常见的陷阱是编写测试,手动尝试自己做有异常的事情。

代码 #3:示例

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

这种方法的问题是很容易忘记极端情况,例如根本没有引发异常的情况。为此,需要添加针对该情况的额外检查,如下面的代码所示。

代码#4:

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()方法,它允许测试异常并同时针对异常的字符串表示执行正则表达式匹配。

代码#5:

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

关于assertRaises()assertRaisesRegex()的一个鲜为人知的事实是它们也可以用作上下文管理器。

代码#6:

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

如果测试除了简单地执行一个可调用对象之外还涉及多个步骤(例如设置),则此表单可能很有用。