写在开始

前段时间完成了接口自动化测试平台当前版本的所有功能,并且使用docker在阿里云完成了系統部署。根据这几年的测试经验和公司其他领域的产品,这次从无到有设计、编写、部署测试平台收获良多。
接口自动化测试平台技术栈为 vue + python falsk 前后端分离实现,数据库使用的是mysql和mongodb,异步任务用到了rabbitmq。现在已经实现了多接口批量测试、用例管理、测试集内用例依赖关系处理、分布式异步测试执行、测试集灵活配置、测试结果多维度查看、定时任务、用例调试、mock数据管理和测试结果邮件通知等功能。
源码地址:https://github.com/guojiaxing1995/easy-test
在线接口文档:https://www.showdoc.cc/easyTest

easy-test 自动化测试平台

1 系统架构

在这里插入图片描述
浏览器请求从web前端到api服务后端,包括http请求和socketio请求。api后端服务访问mysql和mongodb数据库对数据增删改查,同时其也作为生产者将任务数据加入到rabbitmq队列中。worker作为消费者连接队列后消费队列数据执行任务,执行过程中操作数据库并请求api服务后端通过websocket连接向前端广播数据。

2 表结构设计

mysql中除去原本CMS框架系统自带的表,测试平台业务表有8张

表名描述
case用例表
case_group用例分组表
project工程表,工程是批量测试执行的单位
config_copy工程配置表,工程类型为副本类型的工程配置
config_relation工程配置表,工程类型为关联类型的工程配置
task执行记录表
scheduler定时任务表
user_auth工程、用例组授权表

mongodb中业务集合有3个

集合名描述
easy用例执行记录
mockmock数据
modify用例修改记录

3 测试核心思想

  • 用例归集:用例管理模块是对用例(接口)进行增删改查操作,完成对用例的归集操作,用例可以归到不同的分组中。用例中除了接口的一般信息如请求方法、请求地址、请求体、请求头等还有接口数据后置处理后断言判断,接口数据后置处理实现了测试集内用例依赖,断言增加了对测试结果的判断。在这个模块中用例无法执行测试,只有调试功能。
  • 测试工程:工程是一个测试集,是批量执行的运行单位。新增一个工程后,从用例组中将用例加入到工程中,工程中包含多条用例。工程与用例的关联关系有2种,一种是与用例表绑定关联关系,一种是取当前时刻的用例数据重新保存一份。

4 测试总览模块

测试总览
这个模块是登录后默认进入的首页模块。顶部展示了系统中的资源个数:工程数、定时任务数、mock接口数、用例数。左边是工程成功率、失败率top5和测试人员执行top3。右侧是用例通过率和执行数top10。中间是指定工程的总成功率、当前成功率、同比增长、以天为单位最近7次(同一天取最新一次)执行结果、雷达图。下方是今日测试情况:今日执行测试数、今日测试工程数、今日新增用例数。

5 postman模块

postman
这个模块是类postman功能的模块,虽然叫postman但没有postman那么强大,实现了简单的接口请求功能,只要网络通,就可以进行单接口的测试。左边的树形结构是用例分组-用例树,可以通过快速点击用例来将平台归集的用例数据显示到右侧的代码框中,实现对平台的用例快速debug。

6 用例管理模块

6.1 新增\编辑用例

新增用例
一条用例就是一个接口,除了一般的接口数据以外,这里主要说下后置处理断言方式
后置处理和处理语句是配套的。后置处理有5个选项,分别是不做处理、保存全部键值对、json提取器、正则表达式和自定义处理。

  1. 不做处理就是不对接口返回数据做处理,处理语句不需要填;
  2. 保存全部键值对是将返回的json数据全部保存在一个字典中,供之后的接口使用,处理语句不需要填
  3. json处理器是从返回的json串选中指定key的value保存并给其赋一个新的key,处理语句格式key1:new_key1 key2:new_key2
  4. 正则表达式是从返回的数据中通过正则表达式获取目标值并保存在指定key中,处理语句格式为REGULAR,key1 REGULAR,key2。保存的参数的使用是在请求头和请求体的value处填写变量"${var}"
  5. 自定义处理支持自己定义一个python函数来对接口返回数据进行处理,保存为变量供下一个接口使用

其中第5点是一个比较好的解决方案,它在一定程度上解决了平台化不够灵活的问题,兼顾了灵活性和规范化。
在这里插入图片描述

断言方式就比较好理解了,它和预期结果是一组的。目前有5种断言方式,分别是等于、不等于、包含、不包含、返回状态是否为200。等于是判断指定key的value值是否与预期值相等,相等则用例通过,预期结果格式为target_key,target_value;不等于与等于相反;包含是判断目标预期结果是不是在接口返回中,在返回中则用例通过,预期结果只需填写预期结果值即可expect;不包含与包含相反;判断HTTP状态码SUCCESS是判断接口的HTTP响应码是不是2XX,是2XX则用例通过,此断言无需填写预期结果。

6.2 用例列表

用例列表
用例列表展示归集的接口用例信息,可以通过用例分组、名称等查询项查询。点击编辑按钮进入编辑页面对用例进行编辑。点击删除按钮可以删除用例。
用例调试
debug
点击调试按钮,以抽屉的方式弹出调试框,填写服务地址可以对用例快速调试。
用例上传批量新增
用例批量上传
点击批量上传按钮弹出上传弹窗,通过上传excel表格用例数据批量新增用例。模板可以在平台下载。上传过程中,遇到错误数据则整个表格数据不会新增入库,数据错误会给出原因和表格位置。新增成功则刷新列表。

6.3 用例修改记录

用例修改记录
用例被编辑、如果与上一次比较有修改变更就会生成一条修改记录。列表展示目标用例的修改记录,被修改项标红显示。左边是用例分组-用例树,点击选则用例,列表刷新展示对应用例的数据。列表可以根据URL、请求方法、后置处理、修改时间来搜索数据。

6.4 用例分组

在这里插入图片描述
该模块可以对用例进分组行增删改查操作,可以为目标用户进行对应用例组的授权,只有授予权限的用户才可以操作用例组和用例组下的用例。

7 工程管理模块

7.1 工程列表

在这里插入图片描述

与用例分组类似,该模块维护的是工程数据。对工程进行新增、编辑、删除、查询、用户授权。
每个工程都有一个‘运行参数’,运行参数是工程被运行前预设的环境变量,字典类型。
要重点说一下的是工程在新增的时候有2种类型可以选择,一种叫关联,一种叫副本。关联类型的工程,其与用例组中的用例是绑定关联关系的,用例组中的用例改变,工程中的用例改变;副本类型的工时,其未与用例组中的用例建立关联关系,是在添加用例到工程中那一时刻的用例复制一份加入到工程中,换言之是绑定了用例的副本,用例组中的用例和工程中的用例分开修改,互不影响。

7.2 工程配置

在这里插入图片描述
前面说到了工程是批量测试的执行单位,是测试集,那么怎样把用例从用例组中添加到工程中呢?
从上图可以看到,左边是按照用例组选择的用例列表,右边是工程配置列表。工程添加用例的办法就是将左侧需要的用例拖动到右侧列表中,把不需要的用例从右侧拖动到左侧,配置列表通过上下拖动用例来改变用例顺序,点击用例上的开关按钮可以控制用例是否执行,最终保存即可。我认为拖动用例来控制测试集配置,这是平台化灵活方式的最佳体现。
左侧用例鼠标移入严谨按钮弹出浮框,可以查看用例详情。右侧列表除了上面提到的开关,还有debug按钮,效果通用例列表的debug功能。除此之外,副本用例的编辑功能也在这里,通过用例上的按钮实现。

8 测试执行模块

测试执行
测试执行列表是所有工程的列表。点击启动按钮,则测试启动。生产者会生产数据加入到消息队列中,消费者获取数据执行测试。进度条会实时显示测试中的进度。点击对应的操作按钮会分别跳转工程配置、工程列表、用例日志、运行记录和运行详情页面。

9 测试结果模块

9.1 运行记录

运行记录
列表为批量执行的测试记录,显示记录对应的工程、执行人、执行结果、测试时间信息。可以通过执行编号、执行人、工程和执行时间查询。
2个操作按钮点击后分别跳转运行详情和用例日志页面。

9.2 运行详情

在这里插入图片描述

页面展示某一次执行记录的详情信息。顶部工程和记录编号下拉选择框二级联动,选择记录编号后页面数据刷新。饼图为目标记录的成功失败占比,折线图为近7次执行记录趋势。右下方为此次运行的用例,通过icon来标识用例成功或失败,点击一条用例可以在左侧查看用例执行的详情,包括测试结果、接口返回、工程和用例信息。
右上角红色的图标点击会展示此次测试的所有环境变量,包含预设的和测试中生成的。
右上角绿色按钮点击会下载此次测试的html报告。

9.3 用例日志

用例日志
列表展示所有记录中用例的执行记录,维度是运行的每一条用例。显示每一条用例属于哪个工程、哪一次测试记录、运行的结果是什么。点击日志详情按钮进入对应用例执行记录的详情,点击运行记录跳转task记录列表页。

10 定时任务模块

定时任务
以工程为单位新增定时任务,定时任务执行同cron。可以对cron表达式、邮件发送设置进行更改。

11 用例分析模块

用例分析
从用例的角度来分析对应接口的质量好坏。评判标准有总成功率、被多少个工程添加、修改次数和最近10次失败次数与成功次数。成功率越高说明质量越好,使用该用例的工程越多说明热度约高。

12 我的数据模块

我的数据
展示当前登录用户的数据:包括我创建的用例、我维护的工程、我维护的定时任务和我执行的测试记录。当前登录用户可以快速的查看自己的数据。

13 mock管理模块

mock管理
在测试工作中可能会遇到有些接口没有或还未完成的情况,这时就需要mock假数据。mock管理模块实现了对mock接口的新增、删除、修改、查询操作,并且通过flask的路由实现了mock功能。
新增接口后请求地址会自动在原字符串头部拼接/mock,请求时需要使用完整请求地址。
mock接口列表中mock数据最右侧的发送按钮,点击后会跳转postman页面并带入数据在该页面,点击请求按钮可快速验证mock接口。

14 平台docker部署

平台的所有服务、中间件和数据库都使用docker进行部署。
前端vue项目使用nginx部署,default.conf配置文件在vue项目目录下,我配置了域名,部署时可以根据自己情况修改。
后端flask配置文件路径为\app\config,只需要修改静态服务地址SITE_DOMAIN(此处我在nginx配置中做了转发,如果不需要则删除nginx配置文件中assets相关配置)。
worker可以根据自己的资源启动多个,修改compose文件即可。
flask工程目录下有api服务镜像构建文件Dockerfile-api和worker服务镜像构建文件Dockerfile-worker,vue工程目录下有前端服务镜像构建文件Dockerfile,工程目录下有docker-compose.yaml文件,该文件只需要酌情修改端口映射。镜像无需手动执行构建命令构建,服务启动会自动构建。
服务启动

docker-compose up -d

服务停止

docker-compose down

数据初始化
执行工程目录下mysql文件夹的init.sql脚本进行数据初始化

服务部署
上图红框标注处为部署成功后所有的服务。

写在最后

这个版本比2年前做的初版本的接口测试平台,不论在界面还是功能上都要好太多太多了。这个版本把同步任务改成了异步任务,定时任务从内存保存变为持久化到mongodb,新增了工程概念、mock管理、权限划分和多维度结果查看等功能。其中除了定时任务的后端逻辑外,其他逻辑和页面全部是重写的,虽然肯定还是有不足,但比较与之前的版本是有了很大的进步。
目前设计的所有功能,都是我从测试的角度来考虑,这样的一个平台需要什么样的功能。与初版本不同,这次妥协的比较少,最初的版本由于能力的问题在功能和交互上做了太多的妥协。随着工作经验的不断积累和能力的提升,对同一个事物的想法在不同阶段也会有所不同。虽然目前功能的实现告一段落了,但后期还会有新增和优化的功能,比如目前我想到的就有用例数据驱动和用例关系画板展示等等。
前后端分离的好处就是一个后端可以对应多个客户端,多个客户端共用一套API接口。后期可以实现平台对应的小程序端,小程序端的功能就比较简单,只要有数据的查看、定时任务启停和测试执行。小程序在最初的版本中是有的,但现在版本功能重新进行了设计,对应的功能也需要调整。python语言由于其简单性,在实现功能过程中比较简单和高效,等到趋于稳定后也可以尝试使用java来实现。

Logo

前往低代码交流专区

更多推荐