如何防止单元测试python中字符串的截断

如何防止单元测试python中字符串的截断,python,string,unit-testing,testing,truncated,Python,String,Unit Testing,Testing,Truncated,我正在用Python为我的程序做一个单元测试,我想做一个assertEquals测试 我的代码如下所示: class UnitTest(unittest.TestCase): def test_parser(self): self.assertEquals(parser,"some long string", "String is not equal") 然而,由于我的字符串太长,我得到了类似于测试[471字符]0!=测试[473个字符]。我想看看两个字符串之间

我正在用Python为我的程序做一个单元测试,我想做一个
assertEquals
测试

我的代码如下所示:

class UnitTest(unittest.TestCase):
      def test_parser(self):
          self.assertEquals(parser,"some long string", "String is not equal")
然而,由于我的字符串太长,我得到了类似于测试[471字符]0!=测试[473个字符]。我想看看两个字符串之间的确切区别,而不是看被截断的字符串


有人知道如何解决这个问题吗?

unittest.TestCase.assertEquals尝试给出字符串中的实际差异,同时使文本适合您的屏幕

要做到这一点,它会截断公共部分,因此,用
[chars]
块替换没有差异的部分,从而截断它们:

>>> case.assertEqual('foo' * 200, 'foo' * 100 + 'bar' + 'foo' * 99)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 821, in assertEqual
    assertion_func(first, second, msg=msg)
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 1194, in assertMultiLineEqual
    self.fail(self._formatMessage(msg, standardMsg))
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 666, in fail
    raise self.failureException(msg)
AssertionError: 'foof[291 chars]oofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo[255 chars]ofoo' != 'foof[291 chars]oofoobarfoofoofoofoofoofoofoofoofoofoofoofoofo[255 chars]ofoo'
Diff is 1819 characters long. Set self.maxDiff to None to see it.
在这里,常见的后缀开始不同了,但是差异的开始仍然是可见的,应该可以帮助您找出文本哪里出错了

如果这仍然不够,您可以增加或消除差异限制。将设置为更高的数字(默认值为8*80,80行文本),或将其设置为
None
以完全消除:

self.maxDiff = None
请注意,除非字符串包含换行符,否则差异可能无法读取:

断言者错误:“foof[231 chars]oofooofooofoo[315 chars]ofoo' != 'foof[231 chars]oofoobbarbarbarba[285] ofoo' - 福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福福fooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofo ?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + fooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofo ?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

在这种情况下,包装输入和输出文本可能更有用:

from textwrap import wrap

self.maxDiff = None
self.assertEquals(wrap(parser), wrap("some long string"), "String is not equal")
只是为了获得更好、更可读的差异输出:

>>> from textwrap import wrap
>>> case.assertEqual(wrap('foo' * 200), wrap('foo' * 80 + 'bar' * 30 + 'foo' * 80))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 821, in assertEqual
    assertion_func(first, second, msg=msg)
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 1019, in assertListEqual
    self.assertSequenceEqual(list1, list2, msg, seq_type=list)
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 1001, in assertSequenceEqual
    self.fail(msg)
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 666, in fail
    raise self.failureException(msg)
AssertionError: Lists differ: ['foo[244 chars]oofoofoofoofoofoofoofoofoofoofoofoofoofoofoof'[336 chars]foo'] != ['foo[244 chars]oofoobarbarbarbarbarbarbarbarbarbarbarbarbarb'[306 chars]foo']

First differing element 3:
'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoof'
'foofoofoofoofoofoofoofoofoofoobarbarbarbarbarbarbarbarbarbarbarbarbarb'

  ['foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoof',
   'oofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo',
   'ofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo',
-  'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoof',
-  'oofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo',
+  'foofoofoofoofoofoofoofoofoofoobarbarbarbarbarbarbarbarbarbarbarbarbarb',
+  'arbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarfoofoofoofoofoofoofo',
   'ofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo',
   'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoof',
   'oofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo',
-  'ofoofoofoofoofoofoofoofoofoofoofoofoofoo']
+  'ofoofoofoo']
>>来自textwrap导入wrap
>>>case.assertEqual(wrap('foo'*200),wrap('foo'*80+'bar'*30+'foo'*80))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
assertEqual中的文件“/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py”,第821行
断言函数(第一,第二,msg=msg)
文件“/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py”,第1019行,在AssertListQual中
self.assertSequenceEqual(列表1、列表2、消息、序列类型=列表)
文件“/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py”,第1001行,在assertSequenceEqual中
self.fail(msg)
文件“/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py”,第666行,失败
引发自我失败异常(msg)
断言错误:列表不同:['foo[244个字符]oofooof'[336个字符]foo']!=[foo[244 chars]oofoobbarbarbarbarbarb'[306 chars]foo']
第一个不同的要素3:
“fooofooofooofooofooofooofooofooofooofooof”
“fooofooofooo芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭芭”
[fooofooofooofooofooofooofooofooof',
“oofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofo,
“OFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOO”,
-“fooofooofooofooofooofooofooofooofooof”,
-“oofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofo,
+“fooofoooboubbarbarbarb”,
+“arbarbarbarbarbarbarbarbarbarbarbarbarbarbarborfooofoo”,
“OFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOFOO”,
“fooofooofooofooofooofooofooofooofooof”,
“oofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofooofo,
-“OFOFOFOFOFOFOFOFOFOO”]
+“Ofoo”]

因此,我提出了这个问题,因为我在使用
assertEqual()
时遇到了一个问题,并且
self.maxDiff=None
不会显示完整的输出。通过跟踪发现,由于这两个对象的类型不同(一个是列表,一个是生成器),因此没有使用使用
self.maxDiff
的代码路径。因此,如果遇到需要完整的diff和
self.maxDiff
不起作用的问题,请确保两个比较对象的类型相同。

用实际字符替换
[…chars]
[截断]…
(无论比较值的长度和类型如何),将此添加到您的
*\u test.py
文件:

如果导入模块中的'unittest.util'('sys')。模块:
#在self.assertEqual中显示完全差异。
__导入系统模块
>>> from textwrap import wrap
>>> case.assertEqual(wrap('foo' * 200), wrap('foo' * 80 + 'bar' * 30 + 'foo' * 80))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 821, in assertEqual
    assertion_func(first, second, msg=msg)
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 1019, in assertListEqual
    self.assertSequenceEqual(list1, list2, msg, seq_type=list)
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 1001, in assertSequenceEqual
    self.fail(msg)
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.6/unittest/case.py", line 666, in fail
    raise self.failureException(msg)
AssertionError: Lists differ: ['foo[244 chars]oofoofoofoofoofoofoofoofoofoofoofoofoofoofoof'[336 chars]foo'] != ['foo[244 chars]oofoobarbarbarbarbarbarbarbarbarbarbarbarbarb'[306 chars]foo']

First differing element 3:
'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoof'
'foofoofoofoofoofoofoofoofoofoobarbarbarbarbarbarbarbarbarbarbarbarbarb'

  ['foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoof',
   'oofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo',
   'ofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo',
-  'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoof',
-  'oofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo',
+  'foofoofoofoofoofoofoofoofoofoobarbarbarbarbarbarbarbarbarbarbarbarbarb',
+  'arbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarfoofoofoofoofoofoofo',
   'ofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo',
   'foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoof',
   'oofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo',
-  'ofoofoofoofoofoofoofoofoofoofoofoofoofoo']
+  'ofoofoofoo']