经过 Postman 的简单测试,我发现可以直接抓取开普勒的包用于增删改查,轻易的操纵开普勒的功能,如创建场景测试的分组,并在分组中批量创建场景用例,如此来便萌生了真正自动化的想法:只需要抓包 + 撰写逻辑,即可实现单元测试 + 集成测试。简单来说,就是在代码中输入少许,即可在开普勒中生成所需的全部场景,代替手工完成输入参数、调参与改 BUG。
开发的大体思路:主要针对开普勒的自动化场景(场景测试 + 执行集)基于 Python 开发模块,使用固定模块(包含环境变量等)+ 调用模块(调用执行增删改查)的架构方式,每个模块都包含许多细分文件,每个文件仅用单独的一个类,目的是尽量地减少耦合,后续可能会使用数据库、框架等构建方式,使其成为一个更加完整、立体的小项目。
进程:
- 完成了整体大致逻辑框架
- 简单的检验了项目计划的可行性(使用面向过程代码实现)
- 实现了基类 check 的全部功能,用于判断所需的参数是否合乎规范(JSON, URL)
- 实现了基类 cvcurl 的部分功能,支持将 cURL 转换成 Python 代码(可提取 url、method、headers 等多个参数)
- 实现了基类 require 的部分功能,封装 requests 类,新增了很多功能(输出全部请求和响应信息等)用于更好的适配项目
考虑到场景用例步骤的数据量巨多,仅单独储存在一个普通文件中显然不可行,结合选择储存参数(用例步骤的参数)类型要用到 JSON,因此我选择使用 MongoDB 作为项目数据库。
采用 MongoDB 的优势:
- 储存方便,采用 JSON 格式储存更利于参数的直接读取和存入,操作简约,可视性也更高
- 便携性高,可以随时导出数据库中的集合或文档,离线操作方便了团队协同
- 速度快,根据相关效率测试,在 1w 条数据以内,Mongodb 的增删改查效率都全面碾压 Mysql
在实现了众多基类的基础之后,重心就应该偏移至 DEMO 演示与功能完善上,尽快实现自动化目标才是哥白尼的最终目的。于是我结合了多个基类,完成了多个 DEMO 的演示,如创建用例分组、生成用例步骤、查看数据库中的用例等。
进程:
- 将项目开发目标锁定在完善场景测试上,其他功能待开发
- 实现了基类 demand 的全部功能,主要针对开普勒的场景测试模块的交互(获取目标场景用例对应的 ID 等)
- 实现了基类 mulapi 的全部功能,主要针对开普勒的场景用例的步骤填入,可实现一键自动化填入全部步骤
- 实现了基类 database 的全部功能,能够与 MongoDB 数据库交互,将所需数据增删改查进数据库中
- 仅用 database 类,实现了 “数据库交互” 功能文件,支持批量导入 / 导出用例步骤出入数据库,支持一键修改数据库中的用例步骤等功能
当需要填写用例步骤时,自然是记不清每一个用例步骤名称的,这时便需要重新查看数据库中记录的用例步骤,但仅靠数据库完成搜索是不够的,因为存在步骤繁琐 + 可视性低的问题,由此我完成了 MongoDB 数据库中文索引,并构建了一个平台,专门用于检索用例步骤(采用了 jieba 中文分词 + paddle 的索引优化,采用 MVC 模型)。
此时,新建场景用例的用法为:
- 利用 “场景用例” 功能文件,确定用例分组的 serviceid、场景用例 ID 等环境参数
- 利用 “MongoDB 中文检索” 平台,本地检索所需的全部用例步骤名称
- 再利用 “场景用例” 功能文件,将环境参数、用例步骤名称等全部变量填入一个主函数中
- 最后运行 “场景用例” 功能文件
- OK,回到开普勒检查用例构建是否成功
当然,如果需要修改数据库中的用例步骤,也不需要亲自在 MongoDB shell 中修改,只需要利用 “数据库交互” 功能文件,该文件包含了全部增删改查的函数,一键调用即可。
至此,正式构建完成了本项目的核心功能,但依然是最简易的 DEMO 实现,还需要进一步优化迭代。
经过初步使用哥白尼,成果:构建自动化时间节省了 42%,具体指的是一个新的需求,从手动测试 API 接口,到思考每个用例步骤的所需参数与排列顺序,再到创建场景用例并填写全部用例步骤,最后自动化运行成功的全过程(最开始人力填写用例步骤与 DEBUG 需要 7 天;现在使用哥白尼自动填写用例步骤,需要 4 天),但最耗时的依然是思考每个用例步骤的所需参数与排列顺序。
进程:
- 结合 mulapi 类、demand 类和 database 类,实现了 “场景用例” 场景文件,支持新建 / 修改场景用例(包括内部的全部用例步骤),支持查询用例的 ID、serviceid 与反查等功能
- 结合 Flask 框架 + jieba 中文分词索引 + database 类,实现了 “用例检索” 场景文件,支持中文全文检索(关键字搜索)
使用一段时间,依然觉得步骤有些繁琐,灵光一闪,突然发现我一直在根据产品需求,来创建表单,然后根据表单内容一步步输入数据库,再从数据库中提取用例步骤(包括参数和排列顺序)来填入功能文件中,最后运行功能文件,自动化填入开普勒中,这其中怪的地方就是,我为什么要手动填写表单内容进数据库,再手动填入功能文件中?如果我一开始就让功能文件,自动化处理表单(填入数据库 + 传入开普勒),岂不美哉?
因此我又有了新的想法:
- 维护两个表单即可(场景用例表单、用例步骤表单)
- 数据库直接从表单中汲取数据(以前是手动输入到数据库)
- 将以前全部的功能文件进行封装,变成一个 “表单迭代” 功能函数,让哥白尼直接处理表单中的内容
- 运行 “表单迭代” 功能函数即可实现全部功能,而 “MongoDB 中文检索” 平台就用于检索(例如查看某个用例步骤的具体细节)
- 至于之前的功能文件(如 “场景用例” 和 “数据库交互”)可以用来查看和调整细微的细节
至此,正式迭代完成了本项目的全部功能,但版本无止境,依然需要进一步优化迭代。
再度使用哥白尼,成果:构建自动化时间节省了 58%,看似只进步了 16%,但这比较的是自动化测试整体的时间,如果只横向对比自动填写(哥白尼的主体功能)和手工填写场景用例,不考虑只能人力完成的任务(如需求分析与理解、手动校验单个接口等过程),哥白尼运行的时间几乎可以忽略不计!在我重构全部原有项目的时候,平均用时仅为 62 秒,目前整个项目有 118 个用例步骤,随着项目组的推进,以后可能会扩展到几百甚至上千的用例,如果纯手工来维护用例肯定是严重耗时且易错的(修改一个接口可能需要迭代几十个用例),使用哥白尼仅需要维护表单,即 Ctrl + F 一键更改接口,再一键运行表单迭代功能,最多不超过 10 分钟,就能完成全部自动化用例的迭代。
进程:
- 结合全部基类 + 功能文件,实现了集中化封装的新功能文件:“表单迭代”,支持从表单中汲取全部数据至 MongDB 数据库,并上传开普勒
- 对部分功能文件进行了 Bugfix 和迭代,适配了功能用例(如添加了延迟步骤用例)
已离职。
待完成:
- MongoDB 检索支持:模糊搜索和搜索分类
- 表单支持:md 和 csv 格式
- 前端美化