数据工厂系列(23)项目同步-中篇

大家好~我是小方,欢迎大家关注笋货测试笔记 体完记得俾个like呀

回顾

在上篇中,我们已经前面2个步骤的设计,整个同步逻辑还有最后3个步骤需要设计,今天继续把它完成

解析apidoc数据

执行apidoc命令后,doc目录会生成api_data.json文件,整个数据结构如图

其中有几个字段我们提取的,如:标题title、函数名name、description描述信息、group业务线名、permission负责人、filename文件名、parameter入参、success返参...

其实可以发现,上面的几乎是接口文档的基本信息...其实解析的逻辑也比较简单,遍历整个数组,再从字典取出关键信息...

  • 去除P标签

description这个字段直接带有P标签,这里需要用到正则去除掉

  • 去除fields中P标签

description这个字段在fields中也会有,这里直接遍历去除好了,顺便也补充一下字段,主要是补充两个字段id和child字段,因为这里的请求参数和返回参数,需要在前端展示,object类型的字段肯定会有子,相当于树形,element中,展示树形数据必须有row-key...

  • 字段默认值和可选值数据转换

这里默认值是要展示在前端的,类似下图的;可选值其实就是一个枚举值,到时候动态生成表单,类似一个下拉框进行选择~~(先画个饼)~~

我们要处理类型有number、Boolean、String、Array

1.number类型全部转成整型 2.Boolean类型全部转成Python中的布尔值 3.String类型可选值去除双引号 4.Array类型默认值补充"]"

以上处理具体可看__fields_value_change方法

  • body解析

先去除P标签、补充字段再进行默认值/示例值转换

  • 请求示例解析 在api_data.json中,其实就是字符串,直接取出来之后,直接json.loads
  • header解析

这里可有可无,到时候脚本不维护也ok

  • response解析

这里默认取200,跟body解析一样

  • 返回示例解析

这里跟请求示例一样

  • 其他信息解析

其他信息的解析,暂不讲解了,大家可以看看代码,无非就是一层层判断下去,再进行获取

  • 组装case对象信息

清洗之后数据如下:

case的组装信息

param_in信息 到这里的话,解析apidoc数据差不多完成了,但是这里object类型的参数我们并没有处理,正常来说f参数应该挂载在e字段下面

接着,来进行最后一步的操作,处理生成树形数据

  • 生成树形数据

从上面的图片,其实可以发现object类型底下的参数,field都有记录着路径,譬如e.f,表明f是挂载在e下面...所有只要我们根据.切割字符串,默认取列表后两位,就能知道父key和子key

先遍历param_list,如果发现有child字段,就需要挂载子参数,有child字段的,可能有两种情况,一是本身就已经是父参数,field字段无需变更,二是该参数是嵌套参数,譬如a.b.c.d,这里的父参数就是c,子参数就是d,需要把field设置为d。最后通过__find_son_params方法,找出需要挂载的子参数

找出子参数,涉及到递归,大家结合gitee上的demo试着体会一下

这段代码不知道会不会有bug,不过应该是会满足大家的需求,因为脚本的入参大多都不会很复杂,一般就2层结构

最后测试一下~

设计表结构

apidoc数据算是清洗完毕了,接着就是同步数据的逻辑了,首先先设计表结构,表结构的话,跟case对象信息一致

python 复制代码
from sqlalchemy import Column, String, Text, INT
from app.models.base import FunBaseModel

class DataFactoryCases(FunBaseModel):
    """脚本表"""
    __tablename__ = 'data_factory_cases'
    project_id = Column(INT, nullable=False, comment="项目id")
    title = Column(String(255), nullable=False, comment="标题")
    name = Column(String(255), nullable=False, comment="方法名")
    description = Column(String(512), nullable=False, comment="描述信息")
    group_name = Column(String(255), nullable=False, comment="分组名")
    header = Column(Text, nullable=True, comment="请求头")
    owner = Column(String(255), nullable=False, comment="负责人")
    path = Column(String(255), nullable=False, comment="脚本路径")
    param_in = Column(Text, nullable=True, comment="请求参数")
    param_out = Column(Text, nullable=True, comment="返回参数")
    example_param_in = Column(Text, nullable=True, comment="请求示例")
    example_param_out = Column(Text, nullable=True, comment="返回示例")


    def __init__(self, project_id, title, name, description, group_name, header, owner, path, param_in, param_out, example_param_in, example_param_out, user, del_flag=0, id=None):
        super().__init__(create_id=user['id'], create_name=user['username'], del_flag=del_flag, id=id)
        self.project_id = project_id
        self.title = title
        self.name = name
        self.description = description
        self.group_name = group_name
        self.header = header
        self.owner = owner
        self.path = path
        self.param_in = param_in
        self.param_out = param_out
        self.example_param_in = example_param_in
        self.example_param_out = example_param_out

总结

今天完成了解析apidoc数据步骤,下篇继续完成同步入库和消息处理~

相关推荐
全栈练习生几秒前
Agent工程化三层架构
python·ai
高洁0113 分钟前
边缘AI与大模型轻量化:让智能跑进每一个终端
人工智能·python·深度学习·机器学习·迁移学习
MoRanzhi12031 小时前
第6篇(中)· 使用 PyQt5 实现 2048 高性能计算版:无头后台求解与三档运行模式
python·pyqt·数据持久化·多进程·进程间通讯·后台任务·断点续跑
Metaphor6923 小时前
Python 自动化办公:如何轻松在 PDF 中导入与导出表单数据
python·pdf·自动化
外收内放12 小时前
面向对象高级(实战案例)
开发语言·python·学习
专业程序开发源12 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
FPGA小迷弟13 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
c++·python·ai·plotly·django·ai编程·claude
卷无止境13 小时前
面向arm64桌面客户端开发全景:语言、框架与生态
后端·python
fanruitian13 小时前
python else用法
开发语言·python
Thinker QAQ13 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing