【问题标题】:Unittest's assertEqual and iterables - only check the contentsUnittest 的 assertEqual 和 iterables - 只检查内容
【发布时间】:2011-11-20 08:17:50
【问题描述】:

在 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 功能)它也不会失败。

【问题讨论】:

    标签: python unit-testing assert iterable


    【解决方案1】:

    Python 3

    Python >= 2.7

    【讨论】:

    • 这不会按照 OP 的要求执行,因为它忽略了项目的顺序。
    • @Sven Marnach :对,我添加了非无序的 assertSequenceEqual
    • 稍微澄清一下:2.7 具有所需的功能,所以我认为您的意思是 >=2.7 而不是 >2.7。此外,这些功能可通过 unittest2 包在 2.4-2.6 中使用。
    • 另请注意assertSequenceEqual 无法比较生成器,因为它似乎尝试在结果上调用len()
    • 我尝试使用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)),测试会按预期通过。我只是想知道这是否是运行测试的正确方法?
    【解决方案2】:

    您始终可以将自己的断言方法添加到您的 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 是无序的。我已将其修复为指向更合适的示例。
    • assertItemsEqual 也使用 collections.Counter 方法,该方法使用序列中对象的哈希值。如果用户创建的对象序列没有特定的哈希实现,assertItemsEqual 将始终失败(因为哈希基于对象 ID),即使对象相等(即 == 为真)。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 2012-04-05
      • 2014-05-07
      相关资源
      最近更新 更多