首页 > 解决方案 > pytest.raises 失败:没有使用 try/except 引发

问题描述

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

如果我使用 dict 查找做了一个简单的测试,并且没有在它周围放置 try/except,那么 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'>”

标签: pythonpytest

解决方案


这里的代码正在吞噬异常(捕获它而不传播发生异常的事实)。

    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但为什么不通过显式编写来帮助读者一点。


推荐阅读