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

Python 如何让PyCharm显示pytest的整个错误差异?,python,pycharm,pytest,difference,Python,Pycharm,Pytest,Difference,我正在使用运行我的单元测试。我正在测试一个RESTAPI,所以我经常需要验证JSON块。当测试失败时,我会看到如下情况: FAILED test_document_api.py:0 (test_create_documents) {'items': [{'i...ages': 1, ...} != {'items': [{'...ages': 1, ...} Expected :{'items': [{'...ages': 1, ...} Actual :{'items': [{'i...

我正在使用运行我的单元测试。我正在测试一个RESTAPI,所以我经常需要验证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>
失败
测试文档api.py:0(测试文档创建文档)
{'items':[{'i…ages':1,…}!={'items':[{'i…ages':1,…}
应为:{'items':[{'ages':1,…}
实际:{'items':[{'i…ages':1,…}
当我点击“点击查看差异”链接时,大部分差异被转换为椭圆点,如下图所示

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

我假设Pycharm和/或pytest试图为大型输出消除差异中不具信息性的部分。但是,它在这里太激进了,并且忽略了所有内容

如何让Pycharm和/或pytest向我展示整个差异

我尝试将
-vvv
添加到pytest的附加参数中,但没有效果


从最初的帖子开始,我验证了当我从命令行运行单元测试时,我看到了相同的行为


在看了到目前为止我得到的答案后,我想我真正要问的是“在pytest中,是否可以设置
maxDiff=None
,而不更改测试的源代码?”阅读pytest给我的印象是,控制此设置的是
-vv
开关,但情况似乎并非如此。

由于pytest与unittest集成,作为一种解决方法,您可以将其设置为unittest,然后设置
Test.maxDiff=None
或每个特定的测试
self.maxDiff=None

可以开箱即用地运行unittest(包括试用版)和nose test套件

这些可能也有帮助

从整个
pytest
输出中,PyCharm使用一行解析数据,以显示在
点击查看差异对话框中。这是
断言错误:
行:

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
如果要将此行为应用于所有测试,请定义自定义挂钩。在
conftest.py
文件中:

# conftest.py
def pytest_assertrepr_compare(config, op, left, right):
    if op in ('==', '!='):
        return ['{0} {1} {2}'.format(left, op, right)]
值的相等比较现在仍然会在过长时被剥离;要显示完整的行,仍然需要使用
-vv
标志增加详细程度

现在,
AssertionError
行中的值的相等比较将不会被剥离,完整差异将显示在
单击查看差异
对话框中,突出显示差异部分:


查看了pytest代码库,也许您可以尝试其中一些:

1) 在测试执行中设置详细级别:

./app_main --pytest --verbose test-suite/
2) 为“CI”或“BUILD_NUMBER”添加环境变量。在链接到 在truncate文件中,您可以看到这些env变量用于 确定是否运行截断块

import os

os.environ["BUILD_NUMBER"] = '1'
os.environ["CI"] = 'CI_BUILD'
3) 尝试在truncate模块上设置默认\u MAX\u行和默认\u MAX\u字符(不建议这样做,因为它使用私有模块)):

根据代码,-vv选项应该可以工作,所以奇怪的是它不适合您:

当前的默认行为是截断断言解释 ~8条终端线路,除非在“-vv”模式下运行或在CI上运行

Pytest截断文件,这是我的答案的基础:


希望这里的东西能对您有所帮助!

我遇到了类似的问题,并创建了一个函数,该函数返回一个字符串,其中包含两个
dict

assert expected == actual, build_diff_string(expected, actual)
unittest
风格中

self.assertEqual(expected, actual, build_diff_string(expected, actual)

缺点是您必须修改所有存在此问题的测试,但这是一个简单而愚蠢的解决方案。

在pycharm中,您只需在run configuration Additional Arguments(运行配置附加参数)字段中添加-vv,这应该可以解决此问题


或者至少,它在我的机器上工作了…

我在断言中有一些getattr,它在断言错误之后从不显示任何内容


我在
附加参数
字段中添加了
-lv
,以显示局部变量。

感谢您的回答,我继续并提出了一个请求:@Ilya您是否跟进jetbrain评论并将PR转发给teamcity消息?@AdrienH是的,它被合并了:--应该在最新版本中修复
assert expected == actual, build_diff_string(expected, actual)
self.assertEqual(expected, actual, build_diff_string(expected, actual)