如何让PyCharm显示来自pytest的整个错误差异?

W.P*_*ill 22 python pytest pycharm difference

我正在使用Pycharm来运行我的pytest单元测试.我正在测试REST API,所以我经常需要验证JSON块.当测试失败时,我会看到这样的事情:

FAILED
test_document_api.py:0 (test_create_documents)
{'items': [{'i...ages': 1, ...} != {'items': [{'...ages': 1, ...}

Expected :{'items': [{'...ages': 1, ...}
Actual   :{'items': [{'i...ages': 1, ...}
 <Click to see difference>
Run Code Online (Sandbox Code Playgroud)

当我点击"点击查看差异"链接时,大部分差异将转换为省略点,就像这样

Pycharm比较差异省略

这没用,因为它没有告诉我什么是不同的.对于大于单个字符串或数字的任何差异,我会得到此行为.

我假设Pycharm和/或pytest试图消除大输出差异的无信息部分.然而,它在这里过于咄咄逼人并且一切都在消失.

我如何让Pycharm和/或pytest向我展示完整的区别?

我已经尝试添加-vvv到pytest的附加参数,但这没有任何效果.


从原始帖子开始,我验证了当我从命令行运行单元测试时,我看到了相同的行为.所以这是pytest而不是Pycharm的问题.

看了我到目前为止得到的答案,我猜我真正问的是"在pytest中是否可以在maxDiff=None不改变测试源代码的情况下进行设置?" 我从阅读有关pytest的印象是,-vv开关是控制此设置的,但似乎并非如此.

hoe*_*ing 17

如果仔细观察PyCharm源代码,从整个pytest输出中,PyCharm使用单行来解析数据以便在Click to see difference对话框中显示.这是AssertionError: <message>一行:

def test_spam():
>       assert v1 == v2
E       AssertionError: assert {'foo': 'bar'} == {'foo': 'baz'}
E         Differing items:
E         {'foo': 'bar'} != {'foo': 'baz'}
E         Use -v to get the full diff
Run Code Online (Sandbox Code Playgroud)

如果要在不截断的情况下查看完整的diff行,则需要在输出中自定义此行.对于单个测试,可以通过向assert语句添加自定义消息来完成此操作:

def test_eggs():
    assert a == b, '{0} != {1}'.format(a, b)
Run Code Online (Sandbox Code Playgroud)

如果要将此行为应用于所有测试,请定义自定义pytest_assertrepr_compare挂钩.在conftest.py文件中:

# conftest.py
def pytest_assertrepr_compare(config, op, left, right):
    if op in ('==', '!='):
        return ['{0} {1} {2}'.format(left, op, right)]
Run Code Online (Sandbox Code Playgroud)

现在,这些价值观的相等比较现在仍然会被剥夺; 为了显示完整的行,你仍然需要用-vv旗帜来增加冗长度.

现在,AssertionError不会剥离线条中值的相等比较,并在Click to see difference对话框中显示完整的差异,突出显示差异部分:

在此输入图像描述