Я пишу несколько тестовых примеров для своего приложения, используя Python unittest
. Теперь мне нужно сравнить список объектов со списком других объектов, чтобы проверить, являются ли объекты из первого списка ожидаемыми.
Как написать собственный .assertFoo()
метод? Что делать? Должен ли он вызывать исключение при неудаче? Если да, то какое исключение? И как передать сообщение об ошибке? Должно ли сообщение об ошибке быть строкой unicode или байтом?
К сожалению, официальная документация не объясняет, как писать настраиваемые методы утверждения.
Если вам нужен реальный пример для этого, продолжайте чтение.
Код, который я пишу, примерно такой:
def assert_object_list(self, objs, expected):
for index, (item, values) in enumerate(zip(objs, expected)):
self.assertEqual(
item.foo, values[0],
'Item {0}: {1} != {2}'.format(index, item.foo, values[0])
)
self.assertEqual(
item.bar, values[1],
'Item {0}: {1} != {2}'.format(index, item.bar, values[1])
)
def test_foobar(self):
objs = [...] # Some processing here
expected = [
# Expected values for ".foo" and ".bar" for each object
(1, 'something'),
(2, 'nothing'),
]
self.assert_object_list(objs, expected)
Этот подход позволяет очень легко описать ожидаемые значения каждого объекта очень компактным образом и без фактического создания полных объектов.
Однако... Когда один объект выходит из строя, никакие другие объекты не сравниваются, и это затрудняет отладку. Я хотел бы написать собственный метод, который бы безоговорочно сравнивал все объекты, а затем отобразил бы все объекты, которые не удались, а не только первый.