一、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不参与比较。
网友评论