Unittest的assertEqual和Iterables-仅检查内容


68

单元测试中是否有“体面”的方法来检查两个可迭代对象的内容是否相等?我使用了很多元组,列表和numpy数组,我通常只想测试内容而不是类型。目前,我只是在强制转换类型:

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

我前一段时间使用此列表理解:

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

但是该解决方案似乎不如类型转换,因为它仅在失败时打印单个值,并且对于不同长度的引用和数据也不会失败(由于zip功能)。

Answers:


99

Python 3

Python> = 2.7


这不会执行OP所要求的,因为它忽略了项目的顺序。
Sven Marnach 2011年

1
@Sven Marnach:对,我添加了assertSequenceEqual不是为了自由
塞德里克朱利安

2
一点澄清:2.7具有所需的功能,所以我认为您的意思是> = 2.7而不是> 2.7。此外,这些功能可通过unittest2软件包在2.4-2.6中使用。
Mu Mind

4
另请注意,assertSequenceEqual无法比较生成器,因为它似乎尝试调用len()结果。
Dan Passaro 2013年

12
我试着用assertSequenceEqual比较两个numpy数组。但是,测试返回一个值错误,表明“具有多个元素的数组的真值是不明确的。” 如果A = numpy.array([0, 1, 2, 3, 4, 5])B = numpy.array([0, 1, 2, 3, 4, 5]),运行self.assertSequenceEqual(A, B)会引发错误。但是,如果我self.assertSequenceEqual(list(A), list(B))按预期使用测试通过的话。我只想知道这是否是运行测试的正确方法?
regeirk

9

您始终可以将自己的断言方法添加到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


链接代码中的定义与您的实现有所不同:它比较元素顺序的不同。
Sven Marnach 2011年

糟糕:assertItemsEqual无序。我更正了它,以指出一个更合适的示例。
Ned Batchelder

assertItemsEqual也使用collections.Counter方法,该方法使用序列中对象的哈希值。如果用户创建的对象序列没有特定的哈希实现,则assertItemsEqual将始终失败(因为哈希基于对象ID),即使对象相等(即==为true)。
托尼·萨福克

0

在我看来,您关心序列中的项目顺序。因此,assertItemsEqual/assertCountEqual不适合您。

在Python 2.7和Python 3中,您需要的是self.assertSequenceEqual。这对项目的顺序很敏感。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.