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)
谢谢
assertCountEqual(first, second, msg=None):\n\n\n测试第一个序列包含与第二个序列相同的元素,\n 无论它们的顺序如何。当它们不这样做时,将生成一条错误消息,列出序列之间的差异。
\n
调用assertCountEqual(first, second, msg=None)相当于调用assertEqual(Counter(list(first)), Counter(list(second)))。
Counter 是一个 dict 子类,用于计算可哈希对象的数量。它是一个集合,其中元素存储为字典键,其计数存储为字典值。\n要使其工作,密钥必须是,hashable但不幸的dict是unhashable因为它是可变的。
为了执行所需的任务,您可以使用frozenset.\n构建frozenset一个不可变的无序唯一元素集合。为了使测试成功,您必须构建一个字典,其键对应的值是不可变的。我们可以使用递归方法来构建包含不可变值的字典。
试试这个(更新):
\n\ndef 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)\nRun Code Online (Sandbox Code Playgroud)\n\n现在测试将成功。
\n| 归档时间: |
|
| 查看次数: |
3489 次 |
| 最近记录: |