有没有一种方法可以比较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:在unittest中比较嵌套的数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36092399/

10-16 03:12