14.3 在单元测试中测试异常情况
对于异常的测试可使用 方法。例如,如果你想测试某个函数抛出了 ValueError
异常,像下面这样写:
如果你想测试异常的具体值,需要用到另外一种方法:
- import errno
- class TestIO(unittest.TestCase):
- def test_file_not_found(self):
- try:
- except IOError as e:
- self.assertEqual(e.errno, errno.ENOENT)
- else:
- self.fail('IOError not raised')
这种方法的问题在于它很容易遗漏其他情况,比如没有任何异常抛出的时候。那么你还得需要增加另外的检测过程,如下面这样:
- class TestConversion(unittest.TestCase):
- def test_bad_int(self):
- try:
- except ValueError as e:
- self.assertEqual(type(e), ValueError)
- else:
- self.fail('ValueError not raised')
assertRaises()
方法会处理所有细节,因此你应该使用它。
和 assertRaisesRegex()
还有一个容易忽略的地方就是它们还能被当做上下文管理器使用:
- class TestConversion(unittest.TestCase):
- def test_bad_int(self):
- with self.assertRaisesRegex(ValueError, 'invalid literal .*'):
- r = parse_int('N/A')
但你的测试涉及到多个执行步骤的时候这种方法就很有用了。