Der Python 2.7 docs Zustand, dass assertItemsEqual
"entspricht assertEqual(sorted(expected), sorted(actual))
". Im folgenden Beispiel sind alle Tests mit Ausnahme von test4 bestanden. Warum schlägt assertItemsEqual
in diesem Fall fehl?Warum bedeutet ein erfolgreiches assertEqual nicht immer ein erfolgreiches assertItemsEqual?
Nach dem Prinzip der geringsten Verwunderung, gegeben zwei Iterables, würde ich erwarten, dass eine erfolgreiche assertEqual
eine erfolgreiche assertItemsEqual
impliziert. Hier
import unittest
class foo(object):
def __init__(self, a):
self.a = a
def __eq__(self, other):
return self.a == other.a
class test(unittest.TestCase):
def setUp(self):
self.list1 = [foo(1), foo(2)]
self.list2 = [foo(1), foo(2)]
def test1(self):
self.assertTrue(self.list1 == self.list2)
def test2(self):
self.assertEqual(self.list1, self.list2)
def test3(self):
self.assertEqual(sorted(self.list1), sorted(self.list2))
def test4(self):
self.assertItemsEqual(self.list1, self.list2)
if __name__=='__main__':
unittest.main()
ist die Ausgabe auf meinem Rechner:
FAIL: test4 (__main__.test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "assert_test.py", line 25, in test4
self.assertItemsEqual(self.list1, self.list2)
AssertionError: Element counts were not equal:
First has 1, Second has 0: <__main__.foo object at 0x7f67b3ce2590>
First has 1, Second has 0: <__main__.foo object at 0x7f67b3ce25d0>
First has 0, Second has 1: <__main__.foo object at 0x7f67b3ce2610>
First has 0, Second has 1: <__main__.foo object at 0x7f67b3ce2650>
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (failures=1)
Weil Sie keine Reihenfolge für 'foo' Objekte definiert haben? – wim
Danke. Zu deinem Punkt übergibt test4, wenn ich eine __hash__ Methode auf 'foo' definiere. Die Dokumente geben jedoch an, dass assertItemsEqual für nicht hashbare Objekte funktioniert. Missverstehe ich den Doktor? –
Ich kenne Python nicht sehr gut, aber die Fehlermeldung sagt Ihnen klar, dass es die Listen vergleicht, indem Sie eindeutige Objekte in beiden zählen und dann die Zählungen Schlüssel für Schlüssel vergleichen. Die Vergleiche sind nach Objektadresse. Da Sie in jeder Liste verschiedene Objektinstanzen haben, vergleichen sich die Listen als ungleich. Wenn du gesagt hast: a = foo (1); b = foo (2); self.list1 = [a, b] self.list2 = [b, a] ', ich wette, der letzte Test würde bestehen. – Gene