Docs&OpenApi自动化校验

文章描述了一种通过编写Python脚本实现的自动化工具,用于检测生产环境的文档中心OpenApi与Kong服务配置的一致性问题,该工具显著提高了效率和准确性,减少了人工比对的时间和错误可能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

生产环境的文档中心的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.py
 
import 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_zan
    emoji_result = emoji_right
else:
    compare_result_str = "\n".join(compare_result)
    emoji_result = emoji_X
 
docs_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_str
 
content_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_markdown
 
robot_key_test = "*****"  # 调试群
robot_key_openapi = "******"  # 网关内部群
 
# Jenkins执行的命令参数:Test、OpenApi
robot_key = robot_key_openapi if robot_key == "OpenApi" else robot_key_test
 
robot(robot_key, mesg_markdown)

三、使用方法

  • 本地

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

四、效果

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

五、发送测试结果

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

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

六、分析总结

最终实现的解决方案:

1.效率

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

2.准确性

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

3.手动巡检/定时监控

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

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

<think>好的,用户问的是“openapi学起来难吗”。首先,我需要理解OpenAPI指的是什么。OpenAPI规范(以前称为Swagger)是一种用于描述和定义RESTful API的标准化格式,通常用YAML或JSON编写。用户可能是开发者,想了解学习这个技术的难度。 接下来,我应该考虑用户的背景。可能用户已经有一些API开发的经验,或者完全是新手。如果是前者,学习OpenAPI可能相对容易,因为他们已经了解RESTful API的基本概念。如果是后者,可能需要先学习HTTP方法、状态码、端点设计等基础知识,这会增加学习难度。 然后,需要分解学习OpenAPI的不同方面。比如,编写OpenAPI文档需要了解YAML/JSON语法,结构如info、paths、components等。用户可能需要工具如Swagger Editor或Postman来辅助编写和测试。另外,代码生成工具如Swagger Codegen或OpenAPI Generator也是学习的一部分,这些工具可以根据文档生成客户端或服务器端代码。 用户可能关心的实际应用场景,比如如何用OpenAPI提高团队协作,或者如何自动生成API文档。这些实际应用案例可以帮助用户理解学习的必要性,从而影响他们对难度的感知。 还要考虑常见的学习难点。例如,复杂的嵌套结构、安全方案的定义(OAuth2、API密钥)、参数验证等。用户可能会遇到语法错误或工具配置问题,这时候需要耐心调试和查阅文档。 资源方面,应该推荐官方文档、教程、社区支持等。官方文档是最权威的学习资料,而社区和论坛如Stack Overflow可以帮助解决问题。实践项目也是关键,通过实际编写和测试API文档来巩固知识。 最后,总结学习OpenAPI的难度取决于用户现有的知识和经验。如果有相关背景,系统学习加上实践可以在几周内掌握。对于新手,可能需要更长时间,但通过分步学习和工具辅助也能逐步掌握。重要的是保持耐心,积极实践,并利用可用资源解决问题。</think>学习OpenAPI的难度因人而异,但总体来说,**只要具备基础的编程和API开发经验,通过系统性学习可以较快掌握**。以下是分步分析: --- ### 一、前置知识要求 1. **HTTP基础** - 需了解HTTP方法(GET/POST/PUT/DELETE)、状态码(200/404/500)、请求头/响应头等概念。 2. **RESTful API设计理念** - 理解资源(Resource)、端点(Endpoint)、无状态(Stateless)等原则。 3. **YAML/JSON语法** - OpenAPI规范文件通常用YAML或JSON编写,需熟悉基本语法(缩进、键值对、数组等)。 --- ### 二、OpenAPI核心学习内容 #### 阶段1:规范文档编写 - **基础结构** 掌握OpenAPI文档的组成部分: ```yaml openapi: 3.0.3 info: title: 示例API version: 1.0.0 paths: /users: get: summary: 获取用户列表 responses: '200': description: 成功 ``` - **路径与操作** 定义API端点(`paths`)及其支持的HTTP方法(`get`/`post`等)。 - **参数与请求体** 学习如何描述路径参数、查询参数、请求体(`parameters`和`requestBody`)。 - **响应与模型** 定义响应格式(`responses`)和数据模型(`components/schemas`)。 #### 阶段2:工具链使用 1. **Swagger Editor/VS Code插件** - 用于实时编写和校验OpenAPI文档。 2. **Swagger UI/Redoc** - 将OpenAPI文档自动渲染为可视化API文档页面。 3. **代码生成工具** - 使用`Swagger Codegen`或`OpenAPI Generator`生成客户端/服务端代码。 #### 阶段3:进阶实践 - **安全方案** 配置API密钥、OAuth2等安全策略。 - **验证与测试** 使用工具(如`Prism`)模拟API并测试兼容性。 - **文档版本管理** 结合Git管理不同版本的API规范。 --- ### 三、常见难点与解决方法 1. **复杂嵌套结构** - **问题**:模型(`schemas`)中多层嵌套可能导致文档难以维护。 - **解决**:使用`$ref`拆分复用组件,例如: ```yaml components: schemas: User: type: object properties: id: { type: integer } name: { type: string } ``` 2. **工具链配置问题** - **问题**:代码生成器与环境或框架不兼容。 - **解决**:查阅工具的GitHub Issues或社区讨论,调整生成模板。 --- ### 四、学习资源推荐 1. **官方文档** - [OpenAPI Specification](https://spec.openapis.org/oas/v3.0.3)(必读) 2. **实践教程** - Swagger官方教程:[Swagger Tutorial](https://swagger.io/docs/specification/about/) 3. **社区支持** - Stack Overflow的`openapi`标签、GitHub讨论区。 --- ### 五、时间成本估算 | 基础水平 | 预估时间 | 目标 | |-------------------|----------|----------------------------------| | **零基础** | 1-2个月 | 掌握规范编写及基础工具使用 | | **有API开发经验** | 2-3周 | 熟练编写文档并集成到实际项目中 | --- ### 总结 - **难度评级**:★★★☆☆(中等) - **关键建议**: - 从简单API案例入手,逐步增加复杂度。 - 结合具体项目实践(如为现有API编写OpenAPI文档)。 - 善用工具自动化生成和验证,减少手动错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘凛枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值