“ 如果你是一个接口测试工程师,你一定遇到过这样的问题:如何快速地对接口返回的复杂的JSON数据进行校验和断言?有没有一种方法可以一次性比较两个JSON对象的所有差异,而不用逐个字段去写校验规则?有没有一种方法可以自动发现接口返回值中新增或删除的字段,而不用手动去检查?”
如何用一个神奇的工具轻松校验接口返回值的所有字段
今天勇哥要给你介绍一个神奇的工具,它叫做DeepDiff。DeepDiff是一个Python模块,它可以用来比较两个对象(包括JSON、XML、图片等)是否一致,并找出其中差异之处。它提供了三个类,分别是DeepDiff,DeepSearch和DeepHash。它们的功能和用法如下:
-
DeepDiff:比较两个对象,对象可以是字典、字符串等可迭代的对象,针对对象的深层差异,递归查找所有更改。
-
DeepSearch:在对象中搜索其他对象
-
DeepHash:根据对象的内容进行哈希处理
DeepDiff的官网地址是:deepdiff.readthedocs.io/en/latest/
安装DeepDiff
使用DeepDiff之前,需要先安装它。在命令行中运行以下安装命令:
pip install deepdiff
检查安装是否成功以及安装的版本,命令行命令如下:
pip show deepdiff
执行上述命令,能够输出版本信息,那就说明安装成功啦。
比较两个JSON
利用DeepDiff比较两个JSON对象的差异:
import pytest
import requests
import pprint
from deepdiff import DeepDiff
class TestDemo(object):
def test_case_01(self):
a = {
"Object": {
"code": "0",
"message": "success"
},
"code": "0",
"message": "success"
}
b = {
"Object": {
"code": "0",
"message": "failure"
},
"message": "success",
"timestamp": "1614301293"
}
pprint.pprint(DeepDiff(a, b))
输出:
{
'dictionary_item_added': [root['timestamp']],
'dictionary_item_removed': [root['code']],
'values_changed': {
"root['Object']['message']": {
'new_value': 'failure',
'old_value': 'success'
}
}
}
结果包含以下四种情况:
-
type_changes:类型改变的key
-
values_changed:值发生变化的key
-
dictionary_item_added:字典key添加
-
dictionary_item_removed:字段key删除
比较接口响应
有了案例一的基础,进一步,我们将本地定义写死的变量值改成采取调用接口的方式(更符合实际接口测试),通过发起请求,获取响应、并结合Deepdiff来断言使用。
核心思路:先定义预期的响应结构体(意味着,你得事先知道你期望的结果是什么),再根据实际返回的结构体两者通过Deepdiff进行自动比较。
import pytest
import requests
import pprint
from deepdiff import DeepDiff
class TestDemo(object):
def setup_class(self):
self.response = requests.get('http://www.httpbin.org/json').json()
def test_case_02(self):
expected_reps = {"code":"0","msg":"success","data":[{"id":"1","name":"西双版纳傣族自治州"},{"id":"2","name":"郑州中原区西流湖"}]}
pprint.pprint(DeepDiff(expected_reps, self.response))
实际和预期数据一样,输出:{},即没有差异。
如果我们把expected_reps预期中的id由1修改为3,再执行一次,输出:
{
'values_changed': {
"root['data'][0]['id']": {
'new_value': '3',
'old_value': '1'
}
}
}
可以看出,DeepDiff能够准确地找出两个JSON对象之间的差异,并给出具体的位置和值。
小结
通过上面的介绍,我们可以看出,DeepDiff是一个非常强大和方便的工具,它可以帮助我们快速地校验接口返回值的所有字段,而不用担心漏掉任何一个问题。它还可以用来比较其他类型的对象,如XML、图片等。它还提供了一些高级功能,如黑名单、白名单、正则匹配等,可以让我们更灵活地控制比较的过程和结果。
如果你对DeepDiff感兴趣,可以去官网查看更多的文档和示例。也欢迎你关注我的公众号,后续我会分享更多关于接口测试和自动化测试的知识和技巧。
题外话,勇哥打算把新建的技术交流群,打造成一个活跃的高质量技术群。工作中遇到的技术问题,都可以在里面咨询大家,还有工作内推的机会。
有兴趣的小伙伴,欢迎加我(请备注是培训学习还是入群)
勇哥,10年落魄测试老司机,技术栈偏python,目前在一家超大型房产公司担任自动化测试主管,日常工作比较繁杂,主要负责自动化测试,性能测试、软件质量管理及人员管理。工作之余专注于为粉丝进行简历修改、面试辅导、模拟面试、资料分享、一对一自动化测试教学辅导等副业发展。目前已服务十多位小伙伴,取得高薪offer。
往期精选文章👇:
| python-Threading多线程之线程锁 |
| Pytest 快速入门 |
| pytest 前后置操作详谈 |
| 接口自动化之测试数据动态生成并替换 |
| requests模块该如何封装? |
| 最通俗易懂python操作数据库 |
| python正则一篇搞掂 |
| 接口自动化如何封装mysql操作 |
| 性能测试之必备知识 |
| Python + ChatGPT来实现一个智能对话的钉钉机器人 |
| 一文看懂python如何执行cmd命令 |