用pytest描述导入函数中的失败断言语句

时间:2018-02-28 16:05:57

标签: python pytest

Pytest很好地在失败的断言语句中打印变量的值(例如示例here)。

但是,这不适用于导入函数中的断言失败,

example.py

def func():
    b = 1
    assert b == 0

test_func.py

from example import func

def test_func():
    func()

运行pytest test_example.py将产生,

    def test_func():
>       func()

test_example.py:4: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    def func():
        b = 1
>       assert b == 0
E       AssertionError

example.py:4: AssertionError

换句话说,它不会打印有关该断言失败原因的调试信息(即b的值为1)。

有解决方法吗?我应该在Pytest回购中打开Github问题吗?

注意:如果我将函数定义放在同一个test_example.py中,我会得到预期的结果,

    def func():
        b = 1
>       assert b == 0
E       assert 1 == 0

test_example.py:3: AssertionError

但在许多用例中,一个人不能这样做(例如断言在某些包中失败),因此我的问题......

2 个答案:

答案 0 :(得分:1)

您可以使用pytest.register_assert_rewrite功能为您的模块启用此功能。

从模块导入函数之前,必须先调用register_assert_rewrite,以便可以将其放入conftest.py。

conftest.py

import pytest
pytest.register_assert_rewrite("example")

链接到原始解决方案:https://github.com/pytest-dev/pytest/issues/4671

答案 1 :(得分:0)

以基本方式,您需要询问详细输出:

py.test -vvvv

此外,您可以指定详细程度:

logging.WARN,    # -v
logging.INFO,    # -vv
logging.DEBUG,   # -vvv
logging.TRACE,   # -vvvv
logging.GARBAGE  # -vvvvv

如需更多自定义日志记录,您可以查看pytest docs