Python 使用pytest描述导入函数中失败的断言语句
Pytest很好地打印失败的assert语句中的变量值(例如,示例) 但是,这不适用于导入函数中的断言失败 示例.pyPython 使用pytest描述导入函数中失败的断言语句,python,pytest,Python,Pytest,Pytest很好地打印失败的assert语句中的变量值(例如,示例) 但是,这不适用于导入函数中的断言失败 示例.py def func(): b = 1 assert b == 0 from example import func def test_func(): func() 测试函数py def func(): b = 1 assert b == 0 from example import func def test_func():
def func():
b = 1
assert b == 0
from example import func
def test_func():
func()
测试函数py
def func():
b = 1
assert b == 0
from example import func
def test_func():
func()
运行pytest\u 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 repo中打开Github问题吗
注意:如果我将函数定义放在相同的test\u example.py中,我确实得到了预期的结果
def func():
b = 1
> assert b == 0
E assert 1 == 0
test_example.py:3: AssertionError
但在许多用例中,一个人无法做到这一点(例如,在某些包中断言失败),因此我的问题是 基本上,您需要请求详细的输出:
py.test-vvv
此外,您还可以指定详细程度:
logging.WARN, # -v
logging.INFO, # -vv
logging.DEBUG, # -vvv
logging.TRACE, # -vvvv
logging.GARBAGE # -vvvvv
要获得更多自定义日志记录,您可以选中此功能,以便为您的模块启用此功能
在从模块导入函数之前,必须调用register\u assert\u rewrite,以便将其放置在conftest.py中
conftest.py
def func():
b = 1
assert b == 0
from example import func
def test_func():
func()
导入pytest
pytest.register\u assert\u rewrite(“示例”)
链接到原始解决方案:感谢您的回复。只是尝试了一下(使用Python3.6.4、pytest-3.3.2、Linux),它并没有改变这样一个事实:我只得到了一个AssertionError
,没有其他细节。它应该可以工作,只是在本地测试它,并报告它失败的原因并显示b
值。如果您还检查了文档是否正常工作:&谢谢您的检查。您将注意到,在这两个示例中,函数都是在同一个测试文件中定义的,并且不是从其他地方导入的。那很好。我更新了上面的问题。但在许多用例中,您无法做到这一点(例如,在某些包中断言失败),因此我的问题是……啊哈,我明白了,您是对的。example.py是否在PTYHONPATH目录中?您添加的内容断言b==0,“b不等于0”等等。它在当前文件夹中,所以是的。是的,这会起作用,但pytest的全部要点是应该为您生成异常消息。。。