Unittest в assertEqual и iterables-только проверить содержимое


есть ли "приличный" способ в unittest проверить равенство содержимого двух итерационных объектов? Я использую много кортежей, списков и массивов numpy, и обычно я хочу проверить только содержимое, а не тип. В настоящее время я просто бросаю тип:

self.assertEqual (tuple (self.numpy_data), tuple (self.reference_list))

я использовал этот список понимания некоторое время назад:

[self.assertEqual (*x) for x in zip(self.numpy_data, self.reference_list)]

но это решение кажется немного уступает typecast, потому что он печатает только отдельные значения, если он терпит неудачу, а также не делает сбой для разных длин ссылок и данных (из-за функции zip).

3 54

3 ответа:

Python 3

  • Если вы не важно о порядке содержания, у вас есть assertCountEqual (a,b) метод
  • Если вы уход о порядке содержания, у вас есть assertSequenceEqual (a,b) метод

Python > = 2.7

  • Если вы не важно о порядке содержания, у вас есть assertItemsEqual (a,b) метод
  • Если вы уход о порядке содержания, у вас есть assertSequenceEqual (a,b) метод

вы всегда можете добавить свои собственные методы утверждения в свой класс TestCase:

def assertSequenceEqual(self, it1, it2):
    self.assertEqual(tuple(it1), tuple(it2))

или взгляните на то, как 2.7 определил его:http://hg.python.org/cpython/file/14cafb8d1480/Lib/unittest/case.py#l621

мне кажется, что вы заботитесь о порядке элементов в последовательностях. Таким образом, assertItemsEqual/assertCountEqual Не для вас.

в Python 2.7 и в Python 3, что вы хотите self.assertSequenceEqual. Это чувствительно к порядку элементов.