在Python3中,如何在单元测试中测试异常处理?

时间:2019-06-21 22:54:56

标签: python python-3.x

我正在针对api进行多个单元测试。测试使用@patch模拟api调用。我希望创建的某些测试应触发异常。如何在单元测试中处理?

这是我到目前为止所拥有的。 Pylint抱怨assertTrue()语句。我确信有更好的方法来处理异常。

@patch('myapi.myapi.requests.request')
def test_auth_failure(self, mock_request):
    # Configure the request mock to return an auth failure
    # Auth/login (/session) failures return status 200, but without a token!
    mock_request.return_value.status_code = 200
    mock_request.return_value.content = json.dumps(self.mock_auth_failure)
    try:
        # Call auth()
        self.api.auth()
        # Exception should have been raised
        self.assertTrue(False)
    except exceptions.HTTPUnauthorized:
        # Exception caught
        self.assertTrue(True)

其他信息:这是从unittest.TestCase扩展的类。示例:

 class MyApiTests(unittest.TestCase):

2 个答案:

答案 0 :(得分:1)

如果您的类(定义了 test_auth_failure 方法)扩展了unittest.TestCase,则应使用[Python 3.Docs]: unittest - assertRaises(exception, callable, *args, **kwds)

将您的 try / except 子句替换为:

with self.assertRaises(exceptions.HTTPUnauthorized):
    self.api.auth()

self.assertRaises(exceptions.HTTPUnauthorized, self.api.auth)

答案 1 :(得分:0)

如果您正在使用pytest,则可以使用该功能...

import pytest


def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0

https://docs.pytest.org/en/latest/assert.html#assertions-about-expected-exceptions