开发者社区> 问答> 正文

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

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

将会成功

def test(self):
    output = [2,1]
    desired_output = [1,2]
    self.assertCountEqual(output, desired_output)

将失败

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

谢谢

问题来源:stackoverflow

展开
收起
is大龙 2020-03-23 20:59:05 604 0
1 条回答
写回答
取消 提交回答
  • assertCountEqual(first,second,msg = None)

    测试序列首先包含与第二序列相同的元素,而不管其顺序如何。否则,将生成一条错误消息,列出序列之间的差异。

    重要:

    调用assertCountEqual(first,second,msg = None)等同于调用assertEqual(Counter(list(first)),Counter(list(second)))

    注意:

    计数器是用于计算可哈希对象的dict子类。它是一个集合,其中元素存储为字典键,其计数存储为字典值。为此,键必须是可哈希的,但是不幸的是,字典是不可哈希的,因为它是可变的。

    为了执行期望的任务,您可以使用frozensetFrozenset建立了一个不变的,无序的唯一元素集合。*为了使测试成功,您将必须构建一个字典,其对应于其键的值是不可变的。我们可以使用递归方法来构建包含不可变值的字典。

    尝试(更新):

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

    测试现在将成功。

    回答来源:stackoverflow

    2020-03-23 20:59:11
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
移动互联网测试到质量的转变 立即下载
给ITer的技术实战进阶课-阿里CIO学院独家教材(四) 立即下载
F2etest — 多浏览器兼容性测试整体解决方案 立即下载