关于python:assertRaises:在对方法进行单元测试时不会引发KeyError异常

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

单元测试正在检查是否引发异常(代码完全短路)。查找异常类型并打印消息与使用raise关键字引发错误不同。