美文网首页python
Python对象深度差异对比库之DeepDiff

Python对象深度差异对比库之DeepDiff

作者: 羋学僧 | 来源:发表于2023-03-04 18:25 被阅读0次

    一、DeepDiff介绍

    DeepDiff库常用来校验两个对象是否一致,并找出其中差异之处。

    DeepDiff库由以下功能模块组成:

    • DeepDiff: 该模块通过递归方式比较两个字典、可迭代对象、字符串和其他对象的深度差异. DeepDiff

    • DeepSearch: 该模支持在对象中搜索对象. DeepSearch

    • DeepHash: 对于2个对象的深度差异基于其内容对任何对象进行哈希,即使它们在Python眼中不可“哈希”. DeepHash

    • Delta: 可应用于其他对象的对象增量。想象一下git提交,但对于结构化数据. Delta

    • Extract: 该模块可以根据值抽取其Key的路径;反过来根据Key路径提取其值 Extract

    • Commandline: 安装DeepDiff,你也可以在终端通过命令行本地的两个文件的异同。支持主流的文件格式如csv、tsv、 json、yaml等 Command Line

    官网地址

    二、DeepDiff常用操作

    首先安装 DeepDiff,本文默认安装其最新版本:6.2.3

    pip3 install deepdiff
    

    高效的对比 JSON

    如果实际请求结果和预期值的json数据都一致,那么会返回{}空字典,否则会返回对比差异的结果,接口测试中我们也可以根据这个特点进行断言。
    导入

    from deepdiff import DeepDiff
    

    如果对比结果不同,将会给出下面对应的返回:

    • 1、type_changes:类型改变的key
    • 2、values_changed:值发生变化的key
    • 3、dictionary_item_added:字典key添加
    • 4、dictionary_item_removed:字段key删除

    对比json

    from deepdiff import  DeepDiff
    
    json1={
        'code': 0,
        "message": "成功",
        "data": {
            "total": 28,
            "id":123
    }
    }
    json2={
        'code':0,
        "message":"成功",
        "data": {
            "total": 29,
        }
    }
    print(DeepDiff(json1,json2))
    

    输出结果,id移除,total值发生改变

    DeepDiff在单元测试中的应用

    import unittest
    import requests
    from deepdiff import DeepDiff
    class MyCase(unittest.TestCase):
        expect = {
            'slideshow': {
                'author': 'Yours Truly Mi',
                'date': 'date of publication',
                'slides': [{
                    'title': 'Wake up to WonderWidgets!',
                    'type': 'all'
                }, {
                    'items': ['Why <em>WonderWidgets</em> are great', 'Who <em>buys</em> WonderWidgets'],
                    'title': 'Overview',
                    'type': 'all'
                }],
                'title': 'Sample Slide Show'
            }
        }
    
        def setUp(self):
            self.response = requests.get('http://www.httpbin.org/json').json()
            print(self.response)
    
        def test_case01(self):
            print(DeepDiff(self.response, self.expect))
    
        def test_case02(self):
            print(DeepDiff(self.response, self.expect, view='tree', ignore_order=True, ignore_string_case=True,exclude_paths={"root['slideshow']['author']"}))
    
    if __name__ == '__main__':
        unittest.main()
    

    测试用例1断言返回author与期望值,值发生变化。
    其实,在实际接口断言中,可能需要校验的字段顺序不一样,又或者有一些字段值不需要,为了解决这类问题,Deepdiff也提供了相信的参数,只需要在比较的时候加入,传入对应参数即可。

    • ignore order(忽略排序)
    • ignore string case(忽略大小写)
    • exclude_paths排除指定的字段

    测试用例2断言返回author不参与比较。

    相关文章

      网友评论

        本文标题:Python对象深度差异对比库之DeepDiff

        本文链接:https://www.haomeiwen.com/subject/rxuyldtx.html