Unitsert's assertEqual и iterables - только проверить содержимое - PullRequest
63 голосов
/ 19 сентября 2011

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

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

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

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

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

Ответы [ 3 ]

91 голосов
/ 19 сентября 2011

Python 3

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

Python> = 2,7

9 голосов
/ 19 сентября 2011

Вы всегда можете добавить свои собственные методы утверждения в ваш класс 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

0 голосов
/ 15 октября 2017

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

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

...