如何测试断言两个字典列表(其中字典项包含列表)是否相同

Mic*_*rce 6 python unit-testing python-3.x python-unittest

我正在创建我的第一个测试脚本(耶!)我有一个字典列表,其中一个键是列表。如果列表(在字典中)按任何顺序排列,我希望测试能够通过。我知道您可以用来assertCountEqual检查列表相等性,无论顺序如何,但是您可以对包含列表字典的列表执行此操作吗?参见下面的例子

将会成功

def test(self):
    output = [2,1]
    desired_output = [1,2]
    self.assertCountEqual(output, desired_output)
Run Code Online (Sandbox Code Playgroud)

将失败

def test(self):
    desired_output = [{'count': 2, 'columns': ['col2', 'col5']}]
    output = [{'count': 2, 'columns': ['col5', 'col2']}]
    self.assertCountEqual(output, desired_output)
Run Code Online (Sandbox Code Playgroud)

谢谢

Shu*_*rma 5

assertCountEqual(first, second, msg=None)

\n\n
\n

测试第一个序列包含与第二个序列相同的元素,\n 无论它们的顺序如何。当它们不这样做时,将生成一条错误消息,列出序列之间的差异。

\n
\n\n

重要的:

\n\n

调用assertCountEqual(first, second, msg=None)相当于调用assertEqual(Counter(list(first)), Counter(list(second)))

\n\n

笔记:

\n\n

Counter 是一个 dict 子类,用于计算可哈希对象的数量。它是一个集合,其中元素存储为字典键,其计数存储为字典值。\n要使其工作,密钥必须是,hashable但不幸的dictunhashable因为它是可变的。

\n\n
\n\n

为了执行所需的任务,您可以使用frozenset.\n构建frozenset一个不可变的无序唯一元素集合。为了使测试成功,您必须构建一个字典,其键对应的值是不可变的。我们可以使用递归方法来构建包含不可变值的字典。

\n\n

试试这个(更新):

\n\n
def getHashableDict(dictionary):\n    hashable_dict = {}\n    for key, value in dictionary.items():\n        if isinstance(value, list):\n            hashable_dict[key] = frozenset(value)\n        elif isinstance(value, dict):\n            hashable_dict[key] = getHashableDict(value)\n        else:\n            hashable_dict[key] = value\n\n    return frozenset(hashable_dict.items())\n\ndef test(self):\n    desired_output = [{'count': 2, 'columns': ['col2', 'col5']}]\n    output = [{'count': 2, 'columns': ['col5', 'col2']}]\n\n    output = [getHashableDict(item) for item in output] #--> create list of hashable types\n    desired_output = [getHashableDict(item) for item in desired_output]\n\n    self.assertCountEqual(output, desired_output)\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在测试将成功。

\n