2017-05-08 128 views
1

我正在爲我的程序在python中進行單元測試,我想做一個assertEquals測試。如何防止在單元測試中截斷字符串python

我的代碼看起來是這樣的:

class UnitTest(unittest.TestCase): 
     def test_parser(self): 
      self.assertEquals(parser,"some long string", "String is not equal") 

然而,正如我的字符串太長,我有類似測試[471個字符] 0 =測試[473個字符]!我想看看兩個字符串之間有什麼區別,而不是看到截斷的字符串。

任何人有一個想法如何對付這個問題?

+0

你的意思是,'assertEquals'輸出不顯示完整的輸出? –

+0

是的,它並沒有顯示出完整的輸出。相反,我分別看到[471個字符]和[473個字符]。 – decemberrobot

+0

您是否嘗試過將self.maxDiff設置爲較高值或設置爲None?斷言信息告訴你這一點。 –

回答

0

unittest.TestCase.assertEquals試圖給你在字符串中的實際差異,同時使文本適合你的屏幕

要做到這一點,截斷共同部分,使具有沒有差異被替換它們與[<count> 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. 

在上面的例子中,這兩個字符串有着漫長的前綴,通過在兩個前綴中用[291 chars]替換291個字符已經縮短了這一點。他們還分享了一個很長的後綴,通過用[255 chars]取代文本再次縮短了這兩個位置。

實際區別仍在顯示,正確的中間。

當然,當你作出這樣的區別過長,那麼即使是差被截斷:

>>> case.assertEqual('foo' * 200, '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 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[231 chars]oofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo[315 chars]ofoo' != 'foof[231 chars]oofoobarbarbarbarbarbarbarbarbarbarbarbarbarba[285 chars]ofoo' 
Diff is 1873 characters long. Set self.maxDiff to None to see it. 

在這裏,公共後綴也開始有所不同,但差異的開始仍然是可見的,應該可以幫助你找出文本出錯的地方。

如果這還不夠,您可以增加或消除差異限制。設置TestCase.maxDiff attribute到一個更高的數字(默認爲8 * 80,80行文字),或者將其設置爲None完全消除:

self.maxDiff = None 

請注意,除非你的字符串包含換行符的差異是可能是不可讀:

AssertionError: 'foof[231 chars]oofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo[315 chars]ofoo' != 'foof[231 chars]oofoobarbarbarbarbarbarbarbarbarbarbarbarbarba[285 chars]ofoo' - foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo ?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoobarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarfoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo ?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

在這種情況下,它可能是包裝您的輸入和輸出的文本更加有用:

from textwrap import wrap 

self.maxDiff = None 
self.assertEquals(wrap(parser), wrap("some long string"), "String is not equal") 

只是讓你得到更好的,更具可讀性diff的輸出:

>>> 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']