Skip to content

Commit e116e73

Browse files
author
Michael Foord
committed
Removed the new max_diff argument to assertSequenceEqual. All unittest.TestCase assert methods that use difflib to produce failure messages now truncate overly long messages. New class attribute unittest.TestCase.maxDiff to configure this if necessary. Issue 8351.
1 parent a43808c commit e116e73

2 files changed

Lines changed: 35 additions & 13 deletions

File tree

Lib/unittest/case.py

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

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

1817
class SkipTest(Exception):
1918
"""
@@ -157,6 +156,11 @@ class TestCase(object):
157156

158157
longMessage = False
159158

159+
# This attribute sets the maximum length of a diff in failure messsages
160+
# by assert methods using difflib. It is looked up as an instance attribute
161+
# so can be configured by individual tests if required.
162+
maxDiff = 80*8
163+
160164
# Attribute used by TestSuite for classSetUp
161165

162166
_classSetupFailed = False
@@ -589,8 +593,7 @@ def deprecated_func(*args, **kwargs):
589593
failUnlessRaises = _deprecate(assertRaises)
590594
failIf = _deprecate(assertFalse)
591595

592-
def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None,
593-
max_diff=80*8):
596+
def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
594597
"""An equality assertion for ordered sequences (like lists and tuples).
595598
596599
For the purposes of this function, a valid ordered sequence type is one
@@ -603,7 +606,6 @@ def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None,
603606
datatype should be enforced.
604607
msg: Optional message to use on failure instead of a list of
605608
differences.
606-
max_diff: Maximum size off the diff, larger diffs are not shown
607609
"""
608610
if seq_type is not None:
609611
seq_type_name = seq_type.__name__
@@ -690,14 +692,15 @@ def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None,
690692
diffMsg = '\n' + '\n'.join(
691693
difflib.ndiff(pprint.pformat(seq1).splitlines(),
692694
pprint.pformat(seq2).splitlines()))
693-
standardMsg = self._truncateMessage(standardMsg, diffMsg, max_diff)
695+
standardMsg = self._truncateMessage(standardMsg, diffMsg)
694696
msg = self._formatMessage(msg, standardMsg)
695697
self.fail(msg)
696698

697-
def _truncateMessage(self, message, diff, max_diff):
699+
def _truncateMessage(self, message, diff):
700+
max_diff = self.maxDiff
698701
if max_diff is None or len(diff) <= max_diff:
699702
return message + diff
700-
return message + diff[:max_diff] + TRUNCATED_DIFF
703+
return message
701704

702705
def assertListEqual(self, list1, list2, msg=None):
703706
"""A list-specific equality assertion.
@@ -797,9 +800,10 @@ def assertDictEqual(self, d1, d2, msg=None):
797800
self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary')
798801

799802
if d1 != d2:
800-
standardMsg = ('\n' + '\n'.join(difflib.ndiff(
803+
diff = ('\n' + '\n'.join(difflib.ndiff(
801804
pprint.pformat(d1).splitlines(),
802805
pprint.pformat(d2).splitlines())))
806+
standardMsg = self._truncateMessage('', diff)
803807
self.fail(self._formatMessage(msg, standardMsg))
804808

805809
def assertDictContainsSubset(self, expected, actual, msg=None):
@@ -882,8 +886,9 @@ def assertMultiLineEqual(self, first, second, msg=None):
882886
'Second argument is not a string'))
883887

884888
if first != second:
885-
standardMsg = '\n' + ''.join(difflib.ndiff(first.splitlines(True),
889+
diff = '\n' + ''.join(difflib.ndiff(first.splitlines(True),
886890
second.splitlines(True)))
891+
standardMsg = self._truncateMessage('', diff)
887892
self.fail(self._formatMessage(msg, standardMsg))
888893

889894
def assertLess(self, a, b, msg=None):

Lib/unittest/test/test_case.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -591,20 +591,37 @@ def testEquality(self):
591591
self.assertRaises(self.failureException, self.assertDictEqual, 1, 1)
592592

593593
def testAssertSequenceEqualMaxDiff(self):
594+
self.assertEqual(self.maxDiff, 80*8)
594595
seq1 = 'a' + 'x' * 80**2
595596
seq2 = 'b' + 'x' * 80**2
596597
diff = '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
597598
pprint.pformat(seq2).splitlines()))
599+
600+
self.maxDiff = len(diff)//2
598601
try:
599-
self.assertSequenceEqual(seq1, seq2, max_diff=len(diff)/2)
600-
except AssertionError as e:
602+
self.assertSequenceEqual(seq1, seq2)
603+
except self.failureException as e:
601604
msg = e.args[0]
605+
else:
606+
self.fail('assertSequenceEqual did not fail.')
602607
self.assertTrue(len(msg) < len(diff))
603608

609+
self.maxDiff = len(diff) * 2
610+
try:
611+
self.assertSequenceEqual(seq1, seq2)
612+
except self.failureException as e:
613+
msg = e.args[0]
614+
else:
615+
self.fail('assertSequenceEqual did not fail.')
616+
self.assertTrue(len(msg) > len(diff))
617+
618+
self.maxDiff = None
604619
try:
605-
self.assertSequenceEqual(seq1, seq2, max_diff=len(diff)*2)
606-
except AssertionError as e:
620+
self.assertSequenceEqual(seq1, seq2)
621+
except self.failureException as e:
607622
msg = e.args[0]
623+
else:
624+
self.fail('assertSequenceEqual did not fail.')
608625
self.assertTrue(len(msg) > len(diff))
609626

610627
def testAssertItemsEqual(self):

0 commit comments

Comments
 (0)