代码:

# 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。但我在这里的评论中找到了另一种有趣的方法,我想把它留给未来的读者:

try:
    thing_that_rasises_typeerror()
    assert False
except TypeError:
    assert True

其他回答

更好的做法是使用继承unittest的类。TestCase和运行self.assertRaises。

例如:

import unittest


def whatever():
    return 9/0


class TestWhatEver(unittest.TestCase):

    def test_whatever():
        with self.assertRaises(ZeroDivisionError):
            whatever()

然后运行以下命令执行:

pytest -vs test_path

你的意思是这样的吗?

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'

这个解决方案是我们正在使用的:

def test_date_invalidformat():
    """
    Test if input incorrect data will raises ValueError exception
    """
    date = "06/21/2018 00:00:00"
    with pytest.raises(ValueError):
        app.func(date) #my function to be tested

请参考pytest, https://docs.pytest.org/en/latest/reference.html#pytest-raises

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

诱惑:

@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_exception():
    with pytest.raises(Exception) as excinfo:   
        function_that_raises_exception()   
    assert str(excinfo.value) == 'some info'