代码:
# 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。hookimpl (tryfirst = True, hookwrapper = True)
def pytest_runtest_makereport(item: item, call: CallInfo):
outcome = yield # The result after the test is completed
result = outcome.get_result()
if result.when == "call":
if result.failed == True:
else:
我有一个函数,更新一个文档与测试结果,并通过使用:result.longrepr.reprcrash.message添加跟踪
我不知道这是否是最好的方法,但它确实回答了如何仅使用pytest打印回溯的问题
@显然我有一些其他的代码
我只是写了一个钩子,每个测试都会得到
诱惑:
@pytest。hookimpl (tryfirst = True, hookwrapper = True)
def pytest_runtest_makereport(item: item, call: CallInfo):
outcome = yield # The result after the test is completed
result = outcome.get_result()
if result.when == "call":
if result.failed == True:
else:
我有一个函数,更新一个文档与测试结果,并通过使用:result.longrepr.reprcrash.message添加跟踪
我不知道这是否是最好的方法,但它确实回答了如何仅使用pytest打印回溯的问题
@显然我有一些其他的代码
pytest.raise (Exception)是你所需要的。
Code
import pytest
def test_passes():
with pytest.raises(Exception) as e_info:
x = 1 / 0
def test_passes_without_info():
with pytest.raises(Exception):
x = 1 / 0
def test_fails():
with pytest.raises(Exception) as e_info:
x = 1 / 1
def test_fails_without_info():
with pytest.raises(Exception):
x = 1 / 1
# Don't do this. Assertions are caught as exceptions.
def test_passes_but_should_not():
try:
x = 1 / 1
assert False
except Exception:
assert True
# Even if the appropriate exception is caught, it is bad style,
# because the test result is less informative
# than it would be with pytest.raises(e)
# (it just says pass or fail.)
def test_passes_but_bad_style():
try:
x = 1 / 0
assert False
except ZeroDivisionError:
assert True
def test_fails_but_bad_style():
try:
x = 1 / 1
assert False
except ZeroDivisionError:
assert True
输出
============================================================================================= test session starts ==============================================================================================
platform linux2 -- Python 2.7.6 -- py-1.4.26 -- pytest-2.6.4
collected 7 items
test.py ..FF..F
=================================================================================================== FAILURES ===================================================================================================
__________________________________________________________________________________________________ test_fails __________________________________________________________________________________________________
def test_fails():
with pytest.raises(Exception) as e_info:
> x = 1 / 1
E Failed: DID NOT RAISE
test.py:13: Failed
___________________________________________________________________________________________ test_fails_without_info ____________________________________________________________________________________________
def test_fails_without_info():
with pytest.raises(Exception):
> x = 1 / 1
E Failed: DID NOT RAISE
test.py:17: Failed
___________________________________________________________________________________________ test_fails_but_bad_style ___________________________________________________________________________________________
def test_fails_but_bad_style():
try:
x = 1 / 1
> assert False
E assert False
test.py:43: AssertionError
====================================================================================== 3 failed, 4 passed in 0.02 seconds ======================================================================================
请注意,e_info保存了异常对象,因此您可以从中提取详细信息。例如,如果您想检查异常调用堆栈或内部的另一个嵌套异常。
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的这一评论也暗示了上述方法。