使用pytest断言表达式引发异常的正确方法是什么?

时间:2020-06-24 22:20:59

标签: python pytest

我正在尝试添加一些单元测试,以确保抛出了正确的错误(我的函数抛出KeyErrorRuntimeError)。

我已经尝试过assert func(bad_param) == KeyErrorassert isinstance(func(bad_param), KeyError),但都不正确,我应该如何为此编写单元测试/当传递错误时断言该函数的正确方法是什么?参数,将引发正确的Exception?

编辑:我不使用unittest库,我只是在问Python std lib(https://docs.python.org/3/reference/simple_stmts.html)附带的assert函数

4 个答案:

答案 0 :(得分:3)

您可以使用pytest.raises上下文管理器:

with pytest.raises(ExpectedErrorType):
    unit_under_test()

有关更多详细信息,请参见pytest docs

我在文档中没有找到可以说明如何期望多种异常类型的示例,但是您可以通过检查异常信息对象来手动完成此操作:

with pytest.raises(Exception) as exc_info:
    unit_under_test()

assert issubclass(exc_info.type, (KeyError, RuntimeError))

# alternative more strict assertion
assert exc_info.type in (KeyError, RuntimeError)

答案 1 :(得分:1)

我已经做过类似的事情,并且我使用了try ... except语句:

try:
    # Code to test
except KeyError:
    assert True
assert False

这是一个最小的工作示例(用于类似 pytest 的单一测试):

def fun():
    raise KeyError

def test():
    try:
        fun()
    except KeyError:
        assert True
        return
    assert False

答案 2 :(得分:0)

您可以使用try except来捕获类似

的异常
def foo():
    raise ValueError
    
rightExceptionRaised = False
try:
    foo()
except ValueError:
    rightExceptionRaised = True
except:
    pass

assert rightExceptionRaised

答案 3 :(得分:0)

编辑:请参阅@plamut撰写的帖子

我找到了一个答案,该答案可能与pytest打算进行检查的方式更加一致!

def foo():
    raise KeyError

def test_foo_error():
    with pytest.raise(KeyError)
        foo()