我正在使用" 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测试框架的其他技巧来做到这一点?
答案 0 :(得分:5)
在许多地方给出的TestCase.maxDiff=None
答案只能确保unittest输出中显示的diff是全长的。为了在< 点击查看差异>中获得完整差异。链接你必须设置MAX_LENGTH。
import unittest
# Show full diff in unittest
unittest.util._MAX_LENGTH=2000
答案 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)
到目前为止似乎工作..