代码:

# 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打印回溯,所以我将看到在任何函数异常被引发的地方?


当前回答

你的意思是这样的吗?

def test_raises():
    with pytest.raises(Exception) as exc_info:   
        raise Exception('some info')
    # these asserts are identical; you can use either one   
    assert exc_info.value.args[0] == 'some info'
    assert str(exc_info.value) == 'some info'

其他回答

我只是写了一个钩子,每个测试都会得到

诱惑:

@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打印回溯的问题

@显然我有一些其他的代码

你的意思是这样的吗?

def test_raises():
    with pytest.raises(Exception) as exc_info:   
        raise Exception('some info')
    # these asserts are identical; you can use either one   
    assert exc_info.value.args[0] == 'some info'
    assert str(exc_info.value) == 'some info'

在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),以测试正则表达式是否与异常的字符串表示匹配。(查看更多)

你可以试试

def test_exception():
    with pytest.raises(Exception) as excinfo:   
        function_that_raises_exception()   
    assert str(excinfo.value) == 'some info' 

在pytest中有两种方法来处理这类情况:

使用pytest。提出了功能 使用pytest.mark.xfail装饰器

如文档所述:

使用pytest。当您在测试自己的代码故意引发的异常时,而使用@pytest.mark时,则可能会更好。带有检查函数的Xfail可能更适合于记录未修复的错误(其中测试描述了“应该”发生什么)或依赖关系中的错误。

pytest.raise的用法:

def whatever():
    return 9/0
def test_whatever():
    with pytest.raises(ZeroDivisionError):
        whatever()

使用pytest.mark.xfail:

@pytest.mark.xfail(raises=ZeroDivisionError)
def test_whatever():
    whatever()

pytest.raise的输出:

============================= test session starts ============================
platform linux2 -- Python 2.7.10, pytest-3.2.3, py-1.4.34, pluggy-0.4.0 -- 
/usr/local/python_2.7_10/bin/python
cachedir: .cache
rootdir: /home/user, inifile:
collected 1 item

test_fun.py::test_whatever PASSED


======================== 1 passed in 0.01 seconds =============================

pytest的输出。xfail标记:

============================= test session starts ============================
platform linux2 -- Python 2.7.10, pytest-3.2.3, py-1.4.34, pluggy-0.4.0 -- 
/usr/local/python_2.7_10/bin/python
cachedir: .cache
rootdir: /home/user, inifile:
collected 1 item

test_fun.py::test_whatever xfail

======================== 1 xfailed in 0.03 seconds=============================