当单元测试对多行字符串失败时,PyCharm显示完全差异?

时间:2015-05-08 08:59:11

标签: python unit-testing pycharm

我正在使用" unittest"编写一些Python单元测试。框架并在PyCharm中运行它们。一些测试将长生成的字符串与从文件读取的参考值进行比较。如果这个比较失败,我想看看使用PyCharms diff viewer的两个比较字符串的差异。

所以代码是这样的:

    actual = open("actual.csv").read()
    expected = pkg_resources.resource_string('my_package', 'expected.csv').decode('utf8')
    self.assertMultiLineEqual(actual, expected)

PyCharm很好地将测试识别为失败,并在结果窗口中提供了一个链接,用于单击打开diff查看器。但是,由于unittest如何缩短结果,我在diff viewer中得到了这样的结果:

左侧:

'时间[57 chars] ercent 0; 1; 1; 1; 1; 1; 1; 1 0; 2; 1; 3; 4; 2; 3; 1 0; 3; [110字符] 32 '

右侧:

'时间[57 chars] ercen 0; 1; 1; 1; 1; 1; 1; 1 0; 2; 1; 3; 4; 2; 3; 1 0; 3; 2 [109个字符] 32 '

现在,我想摆脱所有[X chars]部分,只看到整个文件和PyCharm完全可视化的实际差异。

我试图查看unittest代码但找不到配置选项来打印完整的结果。有一些变量,如maxDiff和_diffThreshold,但它们对此打印没有影响。

另外,我试图在py.test中运行它,但是PyCharm中的支持甚至更少(即使是测试失败也没有链接)。

是否有一些技巧使用带有unittest的difflib或者其他Python测试框架的其他技巧来做到这一点?

2 个答案:

答案 0 :(得分:5)

在许多地方给出的TestCase.maxDiff=None答案只能确保unittest输出中显示的diff是全长的。为了在< 点击查看差异>中获得完整差异。链接你必须设置MAX_LENGTH。

import unittest

# Show full diff in unittest
unittest.util._MAX_LENGTH=2000

来源:https://stackoverflow.com/a/23617918/1878199

答案 1 :(得分:4)

好吧,为了我的测试目的,我设法自己解决了这个问题。我没有使用unittest中的assertEqual方法,而是自己编写并在unittest测试用例中使用它。失败时,它会给我全文,PyCharm diff查看器也能正确显示完整的差异。

我的断言语句位于自己的模块(t_assert.py)中,看起来像这样

def equal(expected, actual):
    msg = "'"+actual+"' != '"+expected+"'"
    assert expected == actual, msg

在我的测试中,我将其称为

    def test_example(self):
        actual = open("actual.csv").read()
        expected = pkg_resources.resource_string('my_package', 'expected.csv').decode('utf8')
        t_assert.equal(expected, actual)
        #self.assertEqual(expected, actual)

到目前为止似乎工作..