Index: Lib/unittest/case.py =================================================================== --- Lib/unittest/case.py (revision 86828) +++ Lib/unittest/case.py (working copy) @@ -1008,25 +1008,28 @@ expected = collections.Counter(iter(expected_seq)) actual = collections.Counter(iter(actual_seq)) except TypeError: - # Unsortable items (example: set(), complex(), ...) + # Unhashable items (example: list(), dict(), etc) expected = list(expected_seq) actual = list(actual_seq) missing, unexpected = unorderable_list_difference(expected, actual) - else: - if expected == actual: - return - missing = list(expected - actual) - unexpected = list(actual - expected) - - errors = [] - if missing: - errors.append('Expected, but missing:\n %s' % - safe_repr(missing)) - if unexpected: - errors.append('Unexpected, but present:\n %s' % - safe_repr(unexpected)) - if errors: - standardMsg = '\n'.join(errors) + errors = [] + if missing: + errors.append('Expected, but missing:\n %s' % + safe_repr(missing)) + if unexpected: + errors.append('Unexpected, but present:\n %s' % + safe_repr(unexpected)) + if errors: + standardMsg = '\n'.join(errors) + self.fail(self._formatMessage(msg, standardMsg)) + return + + if expected != actual: + errors = [] + for k in (expected - actual) + (actual - expected): + errors.append('expected %d, got %d: %s' % + (expected[k], actual[k], safe_repr(k))) + standardMsg = safe_repr('\n'.join(errors)) self.fail(self._formatMessage(msg, standardMsg)) # Old name for assertCountEqual()