DocsOpenApi自动化校验

一、背景

生产环境的文档中心的OpenApi和Kong服务配置的OpenApi可能存在不一致的情况,比如生产环境的文档中心有某个OpenApi,但是Kong服务没有配置到,那客户使用就会有问题。所以,前段时间(M09版本)花了4个人力(2个开发+2个测试)人工排查比对了2个0.5天,比较费时费力。

为了大概了解下存在不一致的原因,梳理了下OpenApi 接口上线流程:

  1. 公司其他业务线同事开发底层接口,如果需要开放给客户、租户使用,需要申请上线工单;
  2. 工单申请通过之后,需要上线的接口会通过Excel表格式给到网关开发同事;
  3. 网关开发同事配置需要上线的接口的路由 - OpenApiPath、Methods;
  4. 跑自动化连通性脚本,测试是否通过;
  5. 测试通过,部署到文档中心;
  6. 把新增到生产的接口添加到自动化连通性脚本里面。

个人觉得可能性比较大的原因有2个:沟通中消息不对称、持续迭代的过程中出现错漏。

二、方案构思

相对于人工巡查比对的方法:文档中心界面的OpenApi  →  Kong Conf   ,总结了一些规律,写了一个自动化巡检工具。

工具代码目录如下:

代码目录分析:

  • data-campare-result:工具执行结果存放;
  • data-source:存放数据源,其中,docs文件是文档中心的代码文件,kong-configuration是kong服务的 openapi 配置代码文件;
  • basic.py:提供公用方法被调用,如,读取docs文件/kong-configuration文件的openapi所在文件路径;
  • doc_openapi.py:文档中心代码里面配置的openapi是一个json文件,需要将false,true,null 转化成Python语法的False,True,None,再把 json 里面的openapi和method提取出来,转成规范的统一的格式,组装、返回结果;
  • kong_openapi.py:kong服务配置的openapi是一个数组里面存放多个字典,通过读取service-route.js文件的每一行数据,提取openapi和method,转成规范的统一的格式,组装、返回结果;
  • main.py:代码执行入口,调用basic.py、doc_openapi.py、kong_openapi.py,对结果进行分析,并把分析结果写入到data-compare-result目录下的compare_result.txt文件存放。

main.py的代码如下: 

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# author  : 枫叶测试
# datetime: 9/30/21 5:30 PM
# filename: main.pyimport sys, emoji
from src.doc_openapi import *
from src.kong_openapi import *
from src.basic import *
from src.QyWxApi import *# kong配置openapi的目录路径
kong_file_dir = "./data-source/kong-configuration/test"
# 定义列表存储kong配置的openapi
compare_kong_openapi = []
# 文档中心配置openapi的目录路径
doc_file_dir = "./data-source/docs/static/swagger-json-build/new/zh-cn"
# 定义列表存储文档中心配置的openapi
compare_doc_openapi = []
# 定义列表手动配置不需要比对的openapi的服务名,比如doc已经下线或废弃的openapi
no_compare_openapi = ['cross-organization-authorization', 'blockchain']# 获取文档中心配置openapi的所有文件路径名称
doc_file_json = get_file(doc_file_dir, doc_file_json)
# 获取文档中心所有配置文件的openapi,除了all文件外
for i in doc_file_json:if 'all' not in i:# print(i)doc_openapi_dic = process_doc_openapi(i)paths = jsonpath(doc_openapi_dic, '$..paths')doc_openapi_list = search_doc_openapi(paths)compare_doc_openapi.extend(doc_openapi_list)
print("doc_file_openapi: " + "\n", compare_doc_openapi, "\n" + "doc_file_openapi_total:", len(compare_doc_openapi))# 获取kong服务配置openapi的所有文件路径名称
kong_file_js = get_file(kong_file_dir, kong_file_js)
print(kong_file_js)
# 获取kong服务所有配置文件的openapi
for i in kong_file_js:compare_kong_openapi = kong_openapi(i, compare_kong_openapi)
print("kong_file_openapi: " + "\n", compare_kong_openapi, "\n" + "kong_file_openapi_total:", len(compare_kong_openapi))compare_result = []
for i in compare_doc_openapi:# 文档中心的openapi对比kong服务的openapi,如果前者不在后者里面,即输出为所需结果if i not in compare_kong_openapi:if no_compare_openapi[0] not in i and no_compare_openapi[1] not in i:compare_result.append(i)with open("./data-compare-result/comapre_result.txt", "a+") as f:f.write(i + '\n')
print("文档中心已经配置但kong服务没配置的openapi数量:",len(compare_result),"\n"+"详情:",compare_result)"""
微信机器人发送测试结果的配置
"""
emoji_zan = emoji.emojize(':100:', use_aliases=True)
emoji_wang = emoji.emojize(':globe_with_meridians:', use_aliases=True)
emoji_wen = emoji.emojize(":book:", use_aliases=True)
emoji_fadajing = emoji.emojize(":mag_right:", use_aliases=True)
emoji_paperclip = emoji.emojize(":paperclip:", use_aliases=True)
emoji_X = emoji.emojize(":x:", use_aliases=True)
emoji_right = emoji.emojize(":white_check_mark:", use_aliases=True)if len(compare_result) == 0:compare_result_str = "<font color=\"info\">Perfect%s文档中心配置的openapi完全匹配kong-configure配置</font>" % emoji_zanemoji_result = emoji_right
else:compare_result_str = "\n".join(compare_result)emoji_result = emoji_Xdocs_branch = sys.argv[1] if len(sys.argv) >= 2 else "NoExit"
kong_config_branch = sys.argv[2] if len(sys.argv) >= 3 else "NoExit"
robot_key = sys.argv[3] if len(sys.argv) >= 4 else "Test"content = "openapi自动化巡检测试报告" \"\n" + "【文档中心】" + \"\n" + "代码分支:" + str(docs_branch) + \"\n" + "已配置的openapi总数:" + str(len(compare_doc_openapi)) + \"\n" + "【kong-configure】" + \"\n" + "代码分支:" + str(kong_config_branch) + \"\n" + "已配置的openapi总数:" + str(len(compare_kong_openapi)) + \"\n" + "【文档中心已配置但kong服务未配置的openapi】" + \"\n" + "总数:" + str(len(compare_result)) + \"\n" + "详情:" + \"\n" + compare_result_strcontent_markdown = {"content": f"""`**openApi自动化巡检测试报告**`>{emoji_wen}**文档中心**>代码分支:<font color=\"comment\">{docs_branch}</font>>已配置的openapi总数: <font color=\"info\">{len(compare_doc_openapi)}</font>>>{emoji_wang}**kong-configure**>代码分支:<font color=\"comment\">{kong_config_branch}</font>>已配置的openapi总数: <font color=\"info\">{len(compare_kong_openapi)}</font>>>{emoji_fadajing}**文档中心已配置但kong服务未配置的openapi**>测试结果:{emoji_result}      总数:<font color=\"warning\">{len(compare_result)}</font>   >详情:{compare_result_str}>>{emoji_paperclip}**supplement**>Developer:枫叶测试>Tips:Regular inspection tests every Friday at 10 a.m"""
}mesg["text"]["content"] = content
mesg_markdown["markdown"] = content_markdownrobot_key_test = "*****"  # 调试群
robot_key_openapi = "******"  # 网关内部群# Jenkins执行的命令参数:Test、OpenApi
robot_key = robot_key_openapi if robot_key == "OpenApi" else robot_key_testrobot(robot_key, mesg_markdown)

三、使用方法

  • 本地

把下载的代码文件放到data-source文件目录下,文件名指定为:docs、kong_configuration,然后,执行main.py文件

  • Jenkins构建(可跳转)

四、效果

 自动化巡检执行的结果和人工排查比对的结果做比较,完全一致,都发现了9个缺失的URL

五、发送测试结果

  • 巡检测试结果异常报告(测试数据是M09的旧分支,人工排查和自动化结果一致)

  • 巡检测试结果正常报告(bug修复后,测试数据是最新master分支)

六、分析总结

最终实现的解决方案:

1.效率

现在自动化巡检一次的程序执行时间在7s左右,对比人力的效率,已经不是一个量级可以比较了。

2.准确性

测试数据使用有问题的旧分支,人工排查发现不匹配接口9个,巡检自动化结果和人工排查结果数量、内容一致。

3.手动巡检/定时监控

可以手动选择不同的环境的不同分支进行构建巡检,如:生产环境用的是release分支,qa环境用的是master分支。

每个sprint版本都会更新OpenApi,但有些紧急的,更新频率是周,所以,设置定时任务每周五早上10点巡检监控,是否有异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MS7256C:L1 频段卫星导航射频前端低噪声放大器芯片

1、描述 MS7256C 是一款具有高增益、低噪声系数的低噪声放 大器&#xff08;LNA&#xff09;芯片&#xff0c;支持 L1 频段多模式全球卫星定位&#xff0c;可 以应用于 GPS、北斗二代、伽利略、Glonass 等 GNSS 导航 接收机中。芯片采用先进工艺制造&#xff0c;封装采用 1…

HDD的烦恼:HAMR会让SMR黯然失色吗?

HDD相关阅读参考&#xff1a; HDD回暖于2024&#xff0c;与SSD决战于2028 HDD最后的冲刺&#xff1a;大容量硬盘的奋力一搏 叠瓦式磁记录技术&#xff08;SMR&#xff09;自20世纪90年代起开始研究&#xff0c;于2010年后逐渐商业化应用于高密度硬盘。该技术的核心理念在于通…

从一个简单的Ping案例来分析二层,三层的数据包封装过程

1. 应用程序生成数据DATA&#xff0c;加上传输层报文头(TCP/UDP Head),调用网络层服务&#xff08;IP包头中的源地址由主机网卡直接得到&#xff0c;目的IP则由我们在使用应用程序时输入得到&#xff0c;如果是基于域名&#xff0c;调用一个通信过程DNS来获得目的IP&#xff0…

便捷接口调测:API 开发工具大比拼 | 开源专题 No.62

hoppscotch/hoppscotch Stars: 56.1k License: MIT Hoppscotch 是一个开源的 API 开发生态系统&#xff0c;主要功能包括发送请求和获取实时响应。该项目具有以下核心优势&#xff1a; 轻量级&#xff1a;采用简约的 UI 设计。快速&#xff1a;实时发送请求并获得响应。支持多…

独立站怎么建设对seo好?

现如今市面上就有不少开源的建站程序可供挑选&#xff0c;哪怕你不懂技术&#xff0c;不懂代码&#xff0c;也能建自己的独立站&#xff0c;效果比不少所谓的用自己技术开发的站都要好&#xff0c;本身做一个网站不难&#xff0c;但你做网站的目的是什么&#xff1f;是为了在搜…

【开源】基于JAVA语言的人事管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员功能模块2.2 普通员工功能模块2.3 答辩文案 三、系统展示四、核心代码4.1 查询职称4.2 新增留言回复4.3 工资申请4.4 工资审核4.5 员工请假 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的人…

Spring 声明式事务 @Transactional(详解)【面试重点,小林出品】

关于 Transactional 注解的基本使用&#xff0c;推荐看Spring 声明式事务 Transactional&#xff08;基本使用&#xff09; 概述 本篇博客主要学习 Transactional 注解当中的三个常⻅属性: 1. rollbackFor:异常回滚属性.指定能够触发事务回滚的异常类型.可以指定多个异常类型 …

AIGC是什么?GPT-4.0、DALL·E以及Midjourney等多种智能服务

AIGC&#xff08;人工智能生成内容&#xff0c;Artificial Intelligence Generated Content&#xff09;是指利用人工智能技术自动生成的文本、图像、音频和视频等内容。随着技术的进步&#xff0c;AIGC已经成为创意产业和内容创作领域的一股新兴力量。MidTool作为一款集成了多…

qml与C++的交互

qml端使用C对象类型、qml端调用C函数/c端调用qml端函数、qml端发信号-连接C端槽函数、C端发信号-连接qml端函数等。 代码资源下载&#xff1a; https://download.csdn.net/download/TianYanRen111/88779433 若无法下载&#xff0c;直接拷贝以下代码测试即可。 main.cpp #incl…

mmpose 2d姿态预测值转json文件

目录 效果图: 参考 模板文件下载地址: python预测代码: 效果图: <

51单片机ESP8266

一、MQTT透传AT固件 安信可提供的烧录WiFi固件工具&#xff1a; 链接: https://docs.ai-thinker.com/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B72 安信可提供的固件库链接: https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BB 经过测试&#xff0c;选择这个不可以…

Zephyr 源码调试

背景 调试环境对于学习源码非常重要&#xff0c;但嵌入式系统的调试环境搭建稍微有点复杂&#xff0c;需要的条件略多。本文章介绍如何在 Zephyr 提供的 qemu 上调试 Zephyr 源码&#xff0c;为后续分析 Zephyr OS 相关原理做铺垫。 环境 我的开发环境为 wsl ubuntu&#xf…

Redis 击穿、穿透、雪崩产生原因解决思路

大家都知道&#xff0c;计算机的瓶颈之一就是IO&#xff0c;为了解决内存与磁盘速度不匹配的问题&#xff0c;产生了缓存&#xff0c;将一些热点数据放在内存中&#xff0c;随用随取&#xff0c;降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是&#xff0c;无论是击穿…

逻辑回归中的损失函数梯度下降

一、引言 逻辑回归中的损失函数通常采用的是交叉熵损失函数&#xff08;cross-entropy loss function&#xff09;。在逻辑回归中&#xff0c;我们通常使用sigmoid函数将线性模型的输出转换为概率值&#xff0c;然后将这些概率值与实际标签进行比较&#xff0c;从而计算损失。 …

模型选择实战

我们现在可以通过多项式拟合来探索这些概念。 import math import numpy as np import torch from torch import nn from d2l import torch as d2l生成数据集 给定x&#xff0c;我们将使用以下三阶多项式来生成训练和测试数据的标签&#xff1a; max_degree 20 # 多项式的最…

前端面试题-(浏览器内核,CSS选择器优先级,盒子模型,CSS硬件加速,CSS扩展)

前端面试题-(浏览器内核&#xff0c;CSS选择器优先级&#xff0c;盒子模型&#xff0c;CSS硬件加速&#xff0c;CSS扩展&#xff09; 常见的浏览器内核CSS选择器优先级盒子模型CSS硬件加速CSS扩展 常见的浏览器内核 内核描述Trident(IE内核)主要用在window系统中的IE浏览器中&…

分布式锁实现(mysql,以及redis)以及分布式的概念(续)redsync包使用

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物 这张尽量结合上一章进行使用&#xff1a;上一章 这章主要是讲如何通过redis实现分布式锁的 redis实现 这里我用redis去实现&#xff1a; 技术&#xff1a;golang&#xff0c;redis&#xff0c;数据结构 …

使用Python的pygame库实现自动追踪目标的Snake游戏

和上一期不同的目标追踪入门不同的是&#xff0c;这期是自动追踪科学游戏&#xff0c;话不多说&#xff0c;321上链接 一、项目背景 Snake游戏是一款经典的游戏&#xff0c;玩家需要控制一条蛇在屏幕上移动&#xff0c;吃掉食物并避免撞到自己的身体或墙壁。传统的Snake游戏通常…

校园跑腿小程序源码系统+代取快递+食堂超市代买+跑腿 带完整的安装代码包以及搭建教程

随着移动互联网的普及&#xff0c;人们越来越依赖于手机应用来解决日常生活中的各种问题。特别是在校园内&#xff0c;由于快递点距离宿舍较远、食堂排队人数过多等情况&#xff0c;学生对于便捷、高效的服务需求愈发强烈。在此背景下&#xff0c;校园跑腿小程序源码系统应运而…

蓝桥杯备赛 week 3 —— 高精度(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 高精度的概念 &#x1f4c1; 高精度加法和其模板 &#x1f4c1; 高精度减法和其模板 &#x1f4c1; 高精度乘法和其模板 &#x1f4c1; 高精度除法和其模板 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文…