Python:比较unittest中的嵌套数据结构

有没有办法在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调用检测到.这样做的唯一原因是,如果x或y有一个类,无论出于何种原因,它都比较等于偶数ad-hoc类,如MissingValueSentinel,但是assertEqual在该类的两个不同对象之间仍然有意义.这似乎是一个非常奇怪的边缘情况,你可以安全地忽略它.

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

点赞