代码:
# coding=utf-8
import pytest
def whatever():
return 9/0
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
pytest.fail(exc, pytrace=True)
输出:
================================ test session starts =================================
platform linux2 -- Python 2.7.3 -- py-1.4.20 -- pytest-2.5.2
plugins: django, cov
collected 1 items
pytest_test.py F
====================================== FAILURES ======================================
___________________________________ test_whatever ____________________________________
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
> pytest.fail(exc, pytrace=True)
E Failed: integer division or modulo by zero
pytest_test.py:12: Failed
============================== 1 failed in 1.16 seconds ==============================
如何使pytest打印回溯,所以我将看到在任何函数异常被引发的地方?
Pytest在不断地发展,最近有了一个很好的变化,现在可以同时进行测试了
异常类型(严格测试)
错误消息(使用正则表达式进行严格或松散检查)
文档中的两个例子:
with pytest.raises(ValueError, match='must be 0 or None'):
raise ValueError('value must be 0 or None')
with pytest.raises(ValueError, match=r'must be \d+$'):
raise ValueError('value must be 42')
我已经在许多项目中使用了这种方法,并且非常喜欢它。
注意:
ilya-rusin的这一评论也暗示了上述方法。
在pytest中有两种处理异常的方法:
使用pytest。引发以编写关于引发异常的断言
使用@pytest.mark.xfail
1. 使用pytest.raises
从文档中可以看出:
为了编写关于引发异常的断言,可以使用pytest。作为上下文管理器引发
例子:
只主张一个例外:
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
raise (ZeroDivisionError)表示
在接下来的代码块中应该引发一个ZeroDivisionError异常。如果没有引发异常,则测试失败。如果测试引发不同的异常,则测试失败。
如果你需要访问实际的异常信息:
import pytest
def f():
f()
def test_recursion_depth():
with pytest.raises(RuntimeError) as excinfo:
f()
assert "maximum recursion" in str(excinfo.value)
excinfo是一个ExceptionInfo实例,它是实际引发的异常的包装器。主要的属性是.type, .value和.traceback。
2. 使用@pytest.mark.xfail
也可以为pytest.mark.xfail指定一个raise参数。
import pytest
@pytest.mark.xfail(raises=IndexError)
def test_f():
l = [1, 2, 3]
l[10]
@pytest.mark.xfail(raise =IndexError)表示
在接下来的代码块中应该引发IndexError异常。如果抛出IndexError异常,则测试被标记为xfailed (x).如果没有抛出异常,则测试被标记为xpassed (x).如果抛出不同的异常,则测试失败。
注:
使用pytest。当您在测试自己的代码故意引发的异常时,而使用@pytest.mark时,则可能会更好。带有检查函数的Xfail可能更好地用于记录未修复的错误或依赖关系中的错误。
您可以将匹配关键字参数传递给上下文管理器(pytest.raise),以测试正则表达式是否与异常的字符串表示匹配。(查看更多)
Pytest在不断地发展,最近有了一个很好的变化,现在可以同时进行测试了
异常类型(严格测试)
错误消息(使用正则表达式进行严格或松散检查)
文档中的两个例子:
with pytest.raises(ValueError, match='must be 0 or None'):
raise ValueError('value must be 0 or None')
with pytest.raises(ValueError, match=r'must be \d+$'):
raise ValueError('value must be 42')
我已经在许多项目中使用了这种方法,并且非常喜欢它。
注意:
ilya-rusin的这一评论也暗示了上述方法。