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).

Asked By: Lucas Hoepner

||

Answers:

Python 3

Python >= 2.7

Answered By: Cédric Julien

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

Answered By: Ned Batchelder

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.

Answered By: user7610