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')
如果测试除了简单地执行一个可调用对象之外还涉及多个步骤(例如设置),则此表单可能很有用。
在评论中写代码?请使用 ide.geeksforgeeks.org,生成链接并在此处分享链接。