assertRaises: KeyError exception is not raised while doing unit test of a method
我正在使用断言引发测试异常,即使引发异常,也不会由断言引发检测到异常。
测试方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def process_data(data): """ process output data :return: dict object """ component = dict() try: properties = dict() properties['state'] = data['state'] properties['status'] = data['status'] component['properties'] = properties except KeyError as e: print"Missing key '{0}' in the response data".format(str(e)) return component sample_data = {} process_data(sample_data) |
测试代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import unittest import test_exception class TestExceptions(unittest.TestCase): """ test class """ def test_process_data(self): """ test :return: """ sample = {} self.assertRaises(KeyError, test_exception.process_data, sample) if __name__ == '__main__': unittest.main() |
但它没有按预期工作,出现以下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | unittest -p test_test_exception.py Missing key ''state'' in the response data Missing key ''state'' in the response data Failure Traceback (most recent call last): File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 331, in run testMethod() File"/unittest/test_test_exception.py", line 16, in test_process_data self.assertRaises(KeyError, test_exception.process_data, sample) File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 475, in assertRaises callableObj(*args, **kwargs) File"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 116, in __exit__ "{0} not raised".format(exc_name)) AssertionError: KeyError not raised Ran 1 test in 0.001s FAILED (failures=1) Process finished with exit code 1 |
单元测试用例有什么问题?
感谢您用适当的上下文和代码发布一个清晰的问题。问题是:
1 2 | except KeyError as e: print"Missing key '{0}' in the response data".format(str(e)) |
这应该是:
1 2 3 | except KeyError as e: print"Missing key '{0}' in the response data".format(str(e)) raise |
单元测试正在检查是否引发异常(代码完全短路)。查找异常类型并打印消息与使用