Unittest's assertEqual and iterables – only check the contents
Question:
Is there a ‘decent’ way in unittest to check the equality of the contents of two iterable objects?
I am using a lot of tuples, lists and numpy arrays and I usually only want to test for the contents and not for the type. Currently I am simply casting the type:
self.assertEqual (tuple (self.numpy_data), tuple (self.reference_list))
I used this list comprehension a while ago:
[self.assertEqual (*x) for x in zip(self.numpy_data, self.reference_list)]
But this solution seems a bit inferior to the typecast because it only prints single values if it fails and also it does not fail for different lengths of reference and data (due to the zip-function).
Answers:
Python 3
- If you don’t care about the order of the content, you have the assertCountEqual(a,b) method
- If you care about the order of the content, you have the assertSequenceEqual(a,b) method
Python >= 2.7
- If you don’t care about the order of the content, you have the assertItemsEqual(a,b) method
- If you care about the order of the content, you have the assertSequenceEqual(a,b) method
You can always add your own assertion methods to your TestCase class:
def assertSequenceEqual(self, it1, it2):
self.assertEqual(tuple(it1), tuple(it2))
or take a look at how 2.7 defined it: http://hg.python.org/cpython/file/14cafb8d1480/Lib/unittest/case.py#l621
It looks to me you care about the order of items in the sequences. Therefore, assertItemsEqual
/assertCountEqual
is not for you.
In Python 2.7 and in Python 3, what you want is self.assertSequenceEqual
. This is sensitive to the order of the items.
Is there a ‘decent’ way in unittest to check the equality of the contents of two iterable objects?
I am using a lot of tuples, lists and numpy arrays and I usually only want to test for the contents and not for the type. Currently I am simply casting the type:
self.assertEqual (tuple (self.numpy_data), tuple (self.reference_list))
I used this list comprehension a while ago:
[self.assertEqual (*x) for x in zip(self.numpy_data, self.reference_list)]
But this solution seems a bit inferior to the typecast because it only prints single values if it fails and also it does not fail for different lengths of reference and data (due to the zip-function).
Python 3
- If you don’t care about the order of the content, you have the assertCountEqual(a,b) method
- If you care about the order of the content, you have the assertSequenceEqual(a,b) method
Python >= 2.7
- If you don’t care about the order of the content, you have the assertItemsEqual(a,b) method
- If you care about the order of the content, you have the assertSequenceEqual(a,b) method
You can always add your own assertion methods to your TestCase class:
def assertSequenceEqual(self, it1, it2):
self.assertEqual(tuple(it1), tuple(it2))
or take a look at how 2.7 defined it: http://hg.python.org/cpython/file/14cafb8d1480/Lib/unittest/case.py#l621
It looks to me you care about the order of items in the sequences. Therefore, assertItemsEqual
/assertCountEqual
is not for you.
In Python 2.7 and in Python 3, what you want is self.assertSequenceEqual
. This is sensitive to the order of the items.