Python:比较单元测试中的嵌套数据结构

标签 python

有没有一种方法可以在 unittest 中比较嵌套数据结构,但忽略对象的具体类型,如 assertSequenceEqual 但递归,例如:

#!/usr/bin/env python

import unittest

class DeepCompareTestCase(unittest.TestCase):

    def test_compare(self):
        # this test fails
        self.assertSequenceEqual(
            [['abc', 'def']],
            (('abc', 'def'),)
        )

unittest.main()

(类似于 Perl 中的 Test::Deep)

最佳答案

这样的东西行得通吗?

import unittest
from itertools import zip_longest

class RecursiveTestCase(unittest.TestCase):
    def assertSequenceDeepEqual(self, x, y):
        MissingValue = MissingValueSentinel()
        for x, y, in zip_longest(x, y, fillvalue=MissingValue):
            try:
                self.assertSequenceDeepEqual(self, x, y)
            except TypeError:
                self.assertEqual(x, y)

                self.assertIsNot(x, MissingValue)
                self.assertIsNot(y, MissingValue)

class MissingValueSentinel(object):
    pass

zip_longest 如果其中一项或多项不是迭代器,则引发 TypeError,表明您处于递归的底部。

如果其中一个迭代器比另一个短,我让它返回一个自定义的 MissingValueSentinel 对象,该对象由函数末尾的 assertIsNot 调用检测到.这样做的唯一原因是,如果 xy 有一个类,无论出于何种原因,它甚至与 MissingValueSentinel 这样的临时类相比,但是 assertEqual 在该类的两个不同对象之间仍然有意义。这似乎是一个非常奇怪的边缘案例,您可以安全地忽略它。

使用 zip_longest 而不是 zip 可以防止 [1, 2, 3] 错误匹配 [1, 2].

关于Python:比较单元测试中的嵌套数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36092399/

相关文章:

Python 记录器在未捕获异常后停止记录

python - 使用 urllib2 HTTPBasicAuthHandler 时,用户名包含空格会出现问题

python - Django 中的自定义默认文件存储

python - 在数据框的列上应用 map 功能

Python 类 - 实例被覆盖?

python - 无法在带有python http服务器的浏览器中查看文件

python - Pandas dataframe read_excel 不会将左上角的空白单元格视为列?

python - 为什么相等在 Python 中似乎不是对称关系?

python - 如何 append 到AWS S3上的json文件

python - Pandas 蟒 : Writing output to specific cells in the CSV