当前位置: 首页 > article >正文

打造高效接口自动化测试:精准对比与可视化展示,轻松发现数据差异!

      前言

        在进行接口自动化测试时,一个不可或缺的步骤是验证接口返回的数据是否符合我们的预期。要准确完成这一任务,一种高效的方法是编写专门的函数或方法,其核心职责在于仔细比较接口实际的响应数据与预先定义的期望结果之间的一致性。这不仅涉及到数据的内容,还包括数据结构和状态码等方面的校验。

        此外,仅仅完成比对任务本身并不够,为了提升测试结果的可理解性和后续分析的便捷性,将这些比对结果转化为一份结构化并且可视化的表格是非常必要的。这种表格能够直观地展示出哪些接口符合预期,哪些不符合,包括具体的差异点,如缺失的字段、不匹配的值等信息,从而为开发人员定位问题、理解接口行为提供直接而有效的帮助。

        实现这一过程,不仅需要对接口测试的标准流程有清晰的认识,还需要具备一定的编程能力,以便设计和实现功能齐全、逻辑清晰的测试脚本。使用如Python等编程语言中的单元测试框架,或者是专门的接口自动化测试工具如Postman、JMeter等,都能够有效地支撑这一需求。

Python实现接口实际结果与预期结果对比

代码实现

下面使用Python实现这一功能,代码如下:

def compare_results(actual, expected, *exclude_keys):
    """
    比较接口返回的实际结果与预期结果,支持多层嵌套结构,排除不需要校验的参数。

    :param actual: 接口返回的实际数据(通常是一个字典或列表)
    :param expected: 预期数据(通常是一个字典或列表)
    :param exclude_keys: 需要排除校验的参数键名,可以使用"parent.child"的形式排除多层嵌套的字段
    :return: 一个字典,表示不匹配的字段和对应的实际与预期值
    """
    mismatches = {}

    def _compare(act, exp, parent_key=""):
        # 如果是字典,递归遍历其内部
        if isinstance(act, dict) and isinstance(exp, dict):
            for key in act:
                # 构建完整的键名
                full_key = f"{parent_key}.{key}" if parent_key else key

                # 如果该键在排除校验的列表中,则跳过
                if full_key in exclude_keys:
                    continue

                # 如果预期结果中没有这个键,或者嵌套对比子项
                if key in exp:
                    _compare(act[key], exp[key], full_key)
                else:
                    mismatches[full_key] = {"actual": act[key], "expected": "Key not present in expected"}

            # 如果预期结果有的key在实际结果中不存在
            for key in exp:
                full_key = f"{parent_key}.{key}" if parent_key else key
                if key not in act and full_key not in exclude_keys:
                    mismatches[full_key] = {"actual": "Key not present in actual", "expected": exp[key]}

        # 如果是列表,递归遍历其每一个元素
        elif isinstance(act, list) and isinstance(exp, list):
            for i in range(min(len(act), len(exp))):
                full_key = f"{parent_key}[{i}]"
                _compare(act[i], exp[i], full_key)
            # 列表长度不相等的情况
            if len(act) != len(exp):
                for i in range(len(exp), len(act)):
                    mismatches[f"{parent_key}[{i}]"] = {"actual": act[i], "expected": "No corresponding item"}
                for i in range(len(act), len(exp)):
                    mismatches[f"{parent_key}[{i}]"] = {"actual": "No corresponding item", "expected": exp[i]}

        # 对于基础数据类型,直接比较
        else:
            if act != exp:
                mismatches[parent_key] = {"actual": act, "expected": exp}

    # 调用内部函数开始比较
    _compare(actual, expected)

    return mismatches

# 示例使用
actual_response = {
    "id": 123,
    "name": "John",
    "email": "john@example.com",
    "address": {
        "street": "123 Street",
        "city": "New York",
        "zip_code": "10001"
    },
    "orders": [
        {"id": 1, "total": 100.0},
        {"id": 2, "total": 200.0}
    ]
}

expected_response = {
    "id": 123,
    "name": "John Doe",
    "email": "john@example.com",
    "address": {
        "street": &#

http://www.kler.cn/a/290353.html

相关文章:

  • 华为大咖说 | 浅谈智能运维技术
  • 云防护单节点2T抗攻击能力意味着什么?
  • nvm 安装指定node版本时--list 显示为空
  • 超详细:三大范式和反范式设计详解
  • 【算法一周目】双指针(1)
  • JVM 内存划分的奥秘:为何要这样划分内存?
  • 工作加速器:五种思维导图策略优化你的日常
  • 如何使用Git进行C/C++项目的版本控制与协作
  • 视频结构化从入门到精通——GPU主要硬件平台介绍
  • 【云原生-Docker】docker、docker-compose离线安装【包括dokcer、docker-compose资源下载】
  • Qt-信号与槽
  • tomcat架构设计分析,核心组件详解
  • SprinBoot+Vue阅读交流微信小程序的设计与实现
  • ElasticSearch--倒排索引
  • linux~~目录结构远程登录教程(xshell+xftp)
  • [数据集][目标检测]机油泄漏检测数据集VOC+YOLO格式43张1类别
  • Java并发线程 共享模型之管程 5
  • C#中的连接池以及sqlCommand.ExecuteNonQuery()
  • 【Redis】Redis 典型应⽤ - 缓存 (cache)
  • el-table利用折叠面板 type=“expand“ 嵌套el-table,并实现 明细数据多选,选中明细数据后返回原数据得嵌套格式
  • 经验笔记:持续集成/持续部署(CI/CD)流程
  • 基本滤波器响应(低通+高通+带通+带阻)+滤波器的响应特性(阻尼系数+截止频率下降率)
  • k8s集群的调度
  • kubeadm方式安装k8s
  • iomuxc、pinctrl子系统、gpio子系统(学习总结)
  • 使用命令行编译cces工程(Blackfin 或 SHARC)