Skip to content

Commit fef03ed

Browse files
author
Michael Foord
committed
Issue 8351. Suppress large diffs in unittest.TestCase.assertSequenceEqual.
1 parent 7207d6d commit fef03ed

2 files changed

Lines changed: 29 additions & 3 deletions

File tree

Lib/unittest/case.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
)
1414

1515
__unittest = True
16-
16+
TRUNCATED_DIFF = '\n[diff truncated...]'
1717

1818
class SkipTest(Exception):
1919
"""
@@ -589,7 +589,8 @@ def deprecated_func(*args, **kwargs):
589589
failUnlessRaises = _deprecate(assertRaises)
590590
failIf = _deprecate(assertFalse)
591591

592-
def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
592+
def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None,
593+
max_diff=80*8):
593594
"""An equality assertion for ordered sequences (like lists and tuples).
594595
595596
For the purposes of this function, a valid ordered sequence type is one
@@ -602,6 +603,7 @@ def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
602603
datatype should be enforced.
603604
msg: Optional message to use on failure instead of a list of
604605
differences.
606+
max_diff: Maximum size off the diff, larger diffs are not shown
605607
"""
606608
if seq_type is not None:
607609
seq_type_name = seq_type.__name__
@@ -684,9 +686,14 @@ def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
684686
except (TypeError, IndexError, NotImplementedError):
685687
differing += ('Unable to index element %d '
686688
'of second %s\n' % (len1, seq_type_name))
687-
standardMsg = differing + '\n' + '\n'.join(
689+
standardMsg = differing
690+
diffMsg = '\n' + '\n'.join(
688691
difflib.ndiff(pprint.pformat(seq1).splitlines(),
689692
pprint.pformat(seq2).splitlines()))
693+
if max_diff is None or len(diffMsg) <= max_diff:
694+
standardMsg += diffMsg
695+
else:
696+
standardMsg += diffMsg[:max_diff] + TRUNCATED_DIFF
690697
msg = self._formatMessage(msg, standardMsg)
691698
self.fail(msg)
692699

Lib/unittest/test/test_case.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import difflib
2+
import pprint
13
import re
24
import sys
35

@@ -588,6 +590,23 @@ def testEquality(self):
588590
self.assertRaises(self.failureException, self.assertDictEqual, [], d)
589591
self.assertRaises(self.failureException, self.assertDictEqual, 1, 1)
590592

593+
def testAssertSequenceEqualMaxDiff(self):
594+
seq1 = 'a' + 'x' * 80**2
595+
seq2 = 'b' + 'x' * 80**2
596+
diff = '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
597+
pprint.pformat(seq2).splitlines()))
598+
try:
599+
self.assertSequenceEqual(seq1, seq2, max_diff=len(diff)/2)
600+
except AssertionError as e:
601+
msg = e.args[0]
602+
self.assertTrue(len(msg) < len(diff))
603+
604+
try:
605+
self.assertSequenceEqual(seq1, seq2, max_diff=len(diff)*2)
606+
except AssertionError as e:
607+
msg = e.args[0]
608+
self.assertTrue(len(msg) > len(diff))
609+
591610
def testAssertItemsEqual(self):
592611
a = object()
593612
self.assertItemsEqual([1, 2, 3], [3, 2, 1])

0 commit comments

Comments
 (0)