学会老板给你加人工!如何断言接口返回值的所有字段?

347 阅读4分钟

如果你是一个接口测试工程师,你一定遇到过这样的问题:如何快速地对接口返回的复杂的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'
        }
    }
}

结果包含以下四种情况:

  1. type_changes:类型改变的key

  2. values_changed:值发生变化的key

  3. dictionary_item_added:字典key添加

  4. 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命令