pytest.raises失败:未通过try / except引发

时间:2019-07-17 16:05:30

标签: python pytest

使用pytest.raises测试由try / except块捕获的错误时,由于未引发该错误而失败。

如果我使用dict查找进行简单测试,并且不进行尝试/例外,则pytest.raises测试通过。但是,如果使用try / except,则测试将失败。

这是有效的方法:

def lookup_value(key):

    lookup = {'A': 1, 'B': 2}

    return lookup[key]


def test_lookup():

    with pytest.raises(KeyError):
        lookup_value('C')

现在添加try / except:

def lookup_value(key):

    lookup = {'A': 1, 'B': 2}

    try:
        return lookup[key]
    except KeyError as err:
        print(err)


def test_lookup():

    with pytest.raises(KeyError):
        lookup_value('C')

第一个代码段,通过测试。 第二个片段,我得到“失败:未提高<class 'KeyError'>”

1 个答案:

答案 0 :(得分:1)

此处的代码吞没了异常(在不传播异常发生的事实的情况下捕获了异常)。

    try:
        return lookup[key]
    except KeyError as err:
        print(err)

您只需要重新引发异常,以便pytest.raises可以看到

    try:
        return lookup[key]
    except KeyError as err:
        print(err)
        raise

此外,在函数的末尾省略return语句(通常会在另一个代码路径中返回内容)通常是一种不好的做法。在Python中有一个隐含的return None,但为什么不通过显式编写来帮助读者一些帮助。