前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >04 测试框架之接口diff原理及高阶玩法

04 测试框架之接口diff原理及高阶玩法

作者头像
测试开发囤货
发布2021-08-11 15:19:45
1.2K0
发布2021-08-11 15:19:45
举报
文章被收录于专栏:测试开发囤货

前言

前三篇文章简要说明了接口diff的来龙去脉,如下

今天我们介绍一下接口diff的核心diff模块代码实现原理和「进阶玩法」

代码解析

  • 校验模块
代码语言:javascript
复制
def contrast_swagger(result, expected):
    """

    :param result:
    :param expected:
    :return:
    """
    # ignore_order 忽略重复的 列出不同的地方
    # ignore_string_case 忽略大小写
    cmp_dict = DeepDiff(result, expected, ignore_order=True).to_dict()
    if expected is None:
        log.error("传入的json为空,请检查!")
        return None, False
    else:
        if cmp_dict.get("dictionary_item_added") or cmp_dict.get("dictionary_item_removed") or cmp_dict.get(
                "values_changed"):
            log.info(cmp_dict)
            log.info("接口结构有变换!")
            return cmp_dict, False
        else:
            return cmp_dict, True
  • 合并模块
代码语言:javascript
复制
def merge_swagger(add_str, new_json):
    """
    合并更新生成新的json
    :param add_str:
    :param new_json:
    :return:
    """

    global key
    add_str = add_str.replace('root', '')
    add_str = add_str.replace('[', '')
    add_str = add_str.replace("'", '')
    keys = add_str.split(']')[:-1]
    data = {}
    for key in reversed(keys):
        if not data:
            data[key] = None
        else:
            data = {key: data}
    value = None
    v_ref = data
    for item, key in enumerate(keys, 1):
        if not value:
            value = new_json.get(key)
        else:
            value = value.get(key)
        if item < len(keys):
            v_ref = v_ref.get(key)
    v_ref[key] = value
    return data

  • 格式化模块V1
代码语言:javascript
复制
def format_swagger_v1(diff_result, latest_swagger):
    """

    :param latest_swagger: 最新的 swagger json
    :param diff_result:对比结果
    :return:格式化合并完成的 swagger json
    """
    added_dict = []
    try:
        add_result = diff_result['dictionary_item_added']

    except KeyError:
        log.error('diff结果中无新增项!')
        return None
    for added_str in add_result:
        added_dict.append(merge_swagger(add_str=added_str, new_json=latest_swagger))

    new_list = []

    for i in added_dict:
        try:
            new_list.append(str(i['paths']).lstrip('{').replace('}}}}}', '}}}}'))
        except KeyError:
            pass
    latest_swagger['paths'] = {str(new_list).replace('["', '').replace('"]', '').replace('"', '')}
    merge_swagger_json = json.loads(
        str(latest_swagger).replace('"', '').replace("'", '"').replace('False', 'false').replace('True', 'true'))
    return merge_swagger_json

  • 格式化模块V2
代码语言:javascript
复制
def format_swagger_v2(diff_result, latest_swagger):
    """

    :param latest_swagger: 最新的 swagger json
    :param diff_result:对比结果
    :return:格式化合并完成的 swagger json
    """
    added_dict = []
    try:
        add_result = diff_result['dictionary_item_added']

    except KeyError:
        log.error('diff结果中无新增项!')
        return None
    for added_str in add_result:
        added_dict.append(merge_swagger(add_str=added_str, new_json=latest_swagger))

    new_list = []

    for i in added_dict:
        try:
            new_list.append(str(i['paths']).lstrip('{').replace('}}}}}', '}}}}'))
        except KeyError:
            pass
    latest_swagger['paths'] = {
        str(new_list).replace('["', '').replace('"]', '').replace('"', '').replace('}}},', '}},').replace('}}}}',
                                                                                                          '}}}').replace(
            'False', 'false').replace('True', 'true')}
    merge_swagger_json = json.loads(str(latest_swagger).replace('{"', '{').replace('}}}"}', '}}}').replace("'", '"'))
    return merge_swagger_json

swaggerjmx-diff Demo

  • 安装依赖
代码语言:javascript
复制
pip install -U swaggerjmx-diff
  • Demo
代码语言:javascript
复制
# -*- coding: utf-8 -*-

from swaggerjmx_diff.diff import *

with open('open-api-v1.json', 'r', encoding='utf8')as fp:
    json_data_v1 = json.load(fp)

with open('open-api-v2.json', 'r', encoding='utf8')as fp:
    json_data_v2 = json.load(fp)

contrast_result, result = contrast_swagger(json_data_v1, json_data_v2)

format_swagger_v2(diff_result=contrast_result, latest_swagger=json_data_v2)

进阶

代码语言:javascript
复制
pip install -U swaggerjmx
  • 现在我们介绍了「swaggerjmx-diff」模块
代码语言:javascript
复制
pip install -U swaggerjmx-diff

玩法举例

「将接口监控&接口diff&接口生成工具与CICD相结合」

开发提测->触发接口监控->触发接口diff->触发接口生成工具->生成新增接口

总结

将我们的各种测试工具「模块化」,并进行自由搭配,可能会产生新的灵感哦!

关注「测试开发囤货」公众号回复「AI」,送你一套 Python机器学习 电子书。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发囤货 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 代码解析
  • swaggerjmx-diff Demo
  • 进阶
    • 玩法举例
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档