有没有一种方法可以在 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
有一个类,无论出于何种原因,它甚至与 MissingValueSentinel
这样的临时类相比,但是 assertEqual
在该类的两个不同对象之间仍然有意义。这似乎是一个非常奇怪的边缘案例,您可以安全地忽略它。
使用 zip_longest
而不是 zip
可以防止 [1, 2, 3]
错误匹配 [1, 2]
.
关于Python:比较单元测试中的嵌套数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36092399/