【发布时间】:2011-07-11 19:54:38
【问题描述】:
我正在使用 Python 的 unittest 为我的应用程序编写一些测试用例。现在我需要将一个对象列表与另一个对象列表进行比较,以检查第一个列表中的对象是否符合我的预期。
如何编写自定义.assertFoo() 方法?它应该怎么做?它应该在失败时引发异常吗?如果是,哪个例外?以及如何传递错误信息?错误信息应该是 unicode 字符串还是字节字符串?
很遗憾,official documentation 没有解释如何编写自定义断言方法。
如果您需要一个真实的例子,请继续阅读。
我写的代码有点像这样:
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)
这种方法可以非常轻松地以非常紧凑的方式描述每个对象的预期值,而无需实际创建完整的对象。
但是...当一个对象的断言失败时,不会再比较其他对象,这使得调试更加困难。我想编写一个自定义方法,无条件比较所有对象,然后显示所有失败的对象,而不仅仅是第一个。
【问题讨论】:
-
这个answer 问题
Continuing in Python's unittest when an assertion fails应该可以帮助您正确覆盖TestCase.assertEqual()。而另一个问题Comparison of multi-line strings in Python unit test 应该可以帮助您创建自定义myAssertEqual()并将其注册为自动调用。
标签: python unit-testing