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