gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:24:52 25 4
gpt4 key购买 nike

有没有一种方法可以在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com