Issue 10242: unittest.assertItemsEqual makes too many assumptions.
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
index dbf7aa2..f59c068 100644
--- a/Lib/unittest/case.py
+++ b/Lib/unittest/case.py
@@ -6,6 +6,7 @@
 import pprint
 import re
 import warnings
+import collections
 
 from . import result
 from .util import (strclass, safe_repr, sorted_list_difference,
@@ -990,15 +991,13 @@
             self.fail(self._formatMessage(msg, standardMsg))
 
 
-    def assertItemsEqual(self, expected_seq, actual_seq, msg=None):
-        """An unordered sequence / set specific comparison. It asserts that
-        expected_seq and actual_seq contain the same elements. It is
-        the equivalent of::
+    def assertCountEqual(self, expected_seq, actual_seq, msg=None):
+        """An unordered sequence specific comparison. It asserts that
+        expected_seq and actual_seq have the same element counts.
+        Equivalent to::
 
-            self.assertEqual(sorted(expected_seq), sorted(actual_seq))
-
-        Raises with an error message listing which elements of expected_seq
-        are missing from actual_seq and vice versa if any.
+            self.assertEqual(Counter(iter(expected_seq)),
+                             Counter(iter(actual_seq)))
 
         Asserts that each element has the same count in both sequences.
         Example:
@@ -1006,15 +1005,18 @@
             - [0, 0, 1] and [0, 1] compare unequal.
         """
         try:
-            expected = sorted(expected_seq)
-            actual = sorted(actual_seq)
+            expected = collections.Counter(iter(expected_seq))
+            actual = collections.Counter(iter(actual_seq))
         except TypeError:
             # Unsortable items (example: set(), complex(), ...)
             expected = list(expected_seq)
             actual = list(actual_seq)
             missing, unexpected = unorderable_list_difference(expected, actual)
         else:
-            return self.assertSequenceEqual(expected, actual, msg=msg)
+            if expected == actual:
+                return
+            missing = list(expected - actual)
+            unexpected = list(actual - expected)
 
         errors = []
         if missing:
@@ -1027,6 +1029,9 @@
             standardMsg = '\n'.join(errors)
             self.fail(self._formatMessage(msg, standardMsg))
 
+    # Old name for assertCountEqual()
+    assertItemsEqual = assertCountEqual
+
     def assertMultiLineEqual(self, first, second, msg=None):
         """Assert that two multi-line strings are equal."""
         self.assertIsInstance(first, str, 'First argument is not a string')