美文网首页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