Python pytest.raises失败:未使用try/except进行提升
使用pytest.raises测试try/except块捕获的错误时,由于未引发该错误,该错误将失败 如果我使用dict查找进行一个简单的测试,并且没有在其周围放置try/except,那么pytest.jsp将引发测试通过。但是如果使用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
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