是否有一种简单的方法可以将附加输出附加到默认断言失败?
我可以使用pytest_assertrepr_compare
完全覆盖输出,但我似乎无法获得默认输出并将自定义消息添加到其中。
以下是我的尝试:
from _pytest.assertion.util import assertrepr_compare
def pytest_assertrepr_compare(config, op, left, right):
# append log output to normal compare
pytest_output = assertrepr_compare(config, op, left, right)
return pytest_output + ['THIS IS MY CUSTOM MESSAGE']
assertrepr_compare
在此示例中不返回任何内容。有关如何实现这一目标的任何想法?
答案 0 :(得分:0)
当pytest_assertrepr_compare()
返回None时,表示没有发生自定义。这意味着,如果您尝试使用可在_pytest.assertion.util.assertrepr_compare
中触发详细说明的内容,则可以使用例如assert 'foo' == 'bar'
。
不幸的是,您无法通过重写模块创建的解释。
然而,内部确实存在某种机制,例如当你写assert 1 == 2, 'custom note'
时,你会得到预期的效果,但它不是全局的。
因此,我认为可以进一步改进自定义报告的范围,而且最近出现了一些用例。你能否在追踪器的新问题中描述这个用例?
答案 1 :(得分:0)
我能够通过将失败信息字符串附加到pytest_assertrepr_compare
的config参数来实现此目的:
def pytest_assertrepr_compare(config, op, left, right):
if hasattr(config, "failure_info") and config.failure_info != None:
print "Appended Failure Info:"
print config.failure_info
# Set to None to avoid the same failure_info for other tests
config.failure_info = None
# return None to trigger the default behavior
return None
回到测试中,我会做类似的事情:
def test_something(request):
request.config.failInfo = 'THIS IS MY CUSTOM MESSAGE'
assert 1 == 2
由于捕获的stdout / stderr始终打印用于测试失败,因此您不必担心您的failure_info未被打印。
希望这有帮助!