Python pytest.raises失败:未使用try/except进行提升

Python pytest.raises失败:未使用try/except进行提升,python,pytest,Python,Pytest,使用pytest.raises测试try/except块捕获的错误时,由于未引发该错误,该错误将失败 如果我使用dict查找进行一个简单的测试,并且没有在其周围放置try/except,那么pytest.jsp将引发测试通过。但是如果使用try/except,测试将失败 这就是工作原理: def lookup_value(key): lookup = {'A': 1, 'B': 2} return lookup[key] def test_lookup(): w

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

如果我使用dict查找进行一个简单的测试,并且没有在其周围放置try/except,那么pytest.jsp将引发测试通过。但是如果使用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')
第一段,测试通过。
第二个代码段,我得到“Failed:NOT RAISE

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

您只需要重新激活异常,以便
pytest.raises
将看到它

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

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

这正是应该发生的事情-
pytest。如果没有引发预期的异常,raises
将使测试失败。Uh-huh-huh(Beavis)。很抱歉我想我最好重新思考一下,如果考试做得好,考试是如何成功通过的,而不是失败的。好的,谢谢-我从来都不知道我必须在每一个除块之外的块中重新提高。你认为在除块之外的块中重新提高是标准做法吗?我想我发现这一点是因为我真的想强迫自己做TDD。不,我认为这很少见。我不记得该模式被称为什么,但是错误通常只应该在处理它们有意义的地方处理一次。在您的示例中,您将处理两次错误—一次在函数中(使用print调用),然后在调用方中处理一次(通过重新调用异常)。您可以考虑额外的打印调用是否添加了任何值,或者只是让调用函数处理错误如何适应。或调用方的调用函数,或调用方的调用方的调用等。。。
    try:
        return lookup[key]
    except KeyError as err:
        print(err)
        raise