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

2024-04-20 01:41:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图添加一些单元测试以确保抛出正确的错误(我的函数抛出KeyErrorRuntimeError

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

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


Tags: 方法函数编辑参数param错误assert断言
3条回答

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

with pytest.raises(ExpectedErrorType):
    unit_under_test()

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

我在文档中没有找到任何解释如何期望多种异常类型的示例,但您可以通过检查exception info对象手动执行此操作:

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)

我已经做了类似的事情,我使用了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

您可以使用try except捕获异常,如

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

assert rightExceptionRaised

相关问题 更多 >