14.3 在å�•å…ƒæµ‹è¯•ä¸æµ‹è¯•异常情况¶
问题¶
ä½ æƒ³å†™ä¸ªæµ‹è¯•ç”¨ä¾‹æ�¥å‡†ç¡®çš„åˆ¤æ–æŸ�个异常是å�¦è¢«æŠ›å‡ºã€‚
解决方案¶
对于异常的测试�使用 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')
讨论¶
assertRaises() 方法为测试异常å˜åœ¨æ€§æ��供了一个简便方法。
一个常�的陷阱是手动去进行异常检测。比如:
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')
ä½†ä½ çš„æµ‹è¯•æ¶‰å�Šåˆ°å¤šä¸ªæ‰§è¡Œæ¥éª¤çš„æ—¶å€™è¿™ç§�方法就很有用了。