数据工厂系列(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数据步骤,下篇继续完成同步入库和消息处理~

相关推荐
金玉满堂@bj14 分钟前
PyCharm 中 Python 解释器的添加选项及作用
ide·python·pycharm
程序员三藏19 分钟前
如何使用Pytest进行测试?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
随心点儿1 小时前
使用python 将多个docx文件合并为一个word
开发语言·python·多个word合并为一个
不学无术の码农1 小时前
《Effective Python》第十三章 测试与调试——使用 Mock 测试具有复杂依赖的代码
开发语言·python
sleepybear11131 小时前
在Ubuntu上从零开始编译并运行Home Assistant源码并集成HACS与小米开源的Ha Xiaomi Home
python·智能家居·小米·home assistant·米家·ha xiaomi home
纪伊路上盛名在1 小时前
(鱼书)深度学习入门1:python入门
人工智能·python·深度学习
夏末蝉未鸣011 小时前
python transformers笔记(TrainingArguments类)
python·自然语言处理·transformer
德育处主任Pro2 小时前
「py数据分析」04如何将 Python 爬取的数据保存为 CSV 文件
数据库·python·数据分析
咸鱼鲸2 小时前
【PyTorch】PyTorch中数据准备工作(AI生成)
人工智能·pytorch·python
遇见你很高兴2 小时前
Pycharm中体验通义灵码来AI辅助编程
python