为什么要写测试平台
2020第四季度的时候使用 Django + DRF + vue2 + HttpRunner2.x 写过一个半成品的接口自动化平台,后面由于一些原因就没有在写。直到 2021 年的第四季度,由于一些原因,又开始搞接口自动化测试平台了。
这次前端用的技术栈是 vue3 的 Composition API 语法(基于最新的 3.2.x 版本的 script setup 语法)、typescript、vite,element-plus 以及 vue3 的全家桶。
为什么要用 vue3 和 ts ?
当然是更快更好用,composition-api 更加适合大项目,ts 的可靠性和可维护性更高,虽然可能我用不到这些特性,但并不影响我以后出去面试的时候吹牛逼。
后端使用的是 Python 的 FastAPI 框架 + sqlalchemy + mysql + Apscheduler + pydantic 等
最早看到 FastAPI 框架是在 HttpRunner3.x 的源码里看到的,当时读源码的时候不知道这个库是做什么的,然后就去 Google 上搜索了一下。当时网上关于 FastAPI 的资料还是比较少的,就去看了下官网,从刚开始打算了解一下,到花了一下午的时间,都看啃官网文档。看完官方文档之后就放弃用了几年的 Django 框架。
平台大体可以分为三个部分。第一部分也是最主要的。运行 api 并且返回测试结果。我起名为 LRUN,L 代表了我姓的首字母和公司英文的首字母。它的主要功能就是传入一个 yaml 路径,在内部对 yaml 文件进行处理,包括参数提取、参数替换、断言、hooks,最后返回测试结果。
例如下面的 yaml 内容,实现了四个接口。登录接口,登录成功后获取到 token,保存为变量,在传给后面的接口,可以在请求头里使用提取到的变量。新增供应商,字段 contacts 是不能重复的,所以我写了个随机生成名称的方法,在这里直接调用这个方法。也可以选择该接口是否执行、执行次数、请求前置、请求后置等
- config: base_url: http://47.101.111.187:8081 headers: {} name: 冒烟测试 variables: {} - test: extract: code: body.code token: body.data.token mock: false name: 登录接口 request: headers: Accept-Language: zh-cn json: password: zouzou username: zouzou method: POST url: /api/user/login setup_hooks: - ${hook_down()} - ${hook_down()} skip: false ssl: true teardown_hooks: - ${hook_down()} times: 1 validate: - eq: - body.code - '2001' - eq: - body.msg - login success - eq: - status_code - 200 - test: extract: {} mock: false name: 新增供应商 request: headers: Authorization: JWT ${token} json: contacts: ${staff_name()} contacts_iphone: '17111111111' id: null remarks: '12' supplier_name: ${staff_name()} method: PUT url: /api/manage/supplier skip: false ssl: false times: 1 validate: - ne: - body.msg - 供应商添加成功 - test: extract: id: body.data[0].id mock: false name: 查询员工数据 request: headers: Authorization: JWT ${token} json: account: '' name: '' method: POST url: /api/manage/search/supplier?page=1&size=10 skip: false ssl: true times: 1 validate: - eq: - body.code - '2001' - eq: - status_code - 200 - len_gt: - body.data - 8 - test: extract: {} mock: false name: 删除供应商 request: headers: Authorization: JWT ${token} json: {} method: DELETE url: /api/manage/supplier?id=${id} skip: false ssl: false times: 1 validate: - eq: - body.msg - 删除成功
各参数意义如下
- test:一个 test 为一个接口用例
- times:接口运行次数
- skip:是否跳过接口
- SSL:是否开启 SSL 验证。
- mock:是否 mock 接口(目前功能还未实现)
- request:填写请求信息,请求方式、请求体、path 等
- extract:提取接口响应里的参数,支持提取响应头、响应体、响应 cookies。
- validate:断言,支持丰富的断言方式(13种断言方式,满足接口测试断言的多种场景),eq 表示断言相等,not_equal 不等于
- setup_hooks:请求前置,可以做一些加密处理
- teardown_hooks:请求后置
运行上面的 yaml 文件后返回的结果如下,会返总耗时、总接口数、成功用例数、失败用例数、跳过的用例数。还有单个接口的详细信息。
查看返回结果
也会有详细的运行日志,简单截了三张图
如果你们用过 httprunner2.x 以及 httprunner3.x 的话,你就会发现功能很相似。因为我读了 httprunner3 的源码之后自己写了一个,起名为 LRUN。很大的一部分代码都是从 httprunner3.x 拿过来 借鉴的。在此感谢 debugtalk 开源出这么优秀的框架。
那么我为什么要重新写一个呢?为什么不集成 httprunner3.x 呢?
2020 年使用 Django +DRF 写的时候,我是集成了 Httprunner2.7 版本的,但目前作者已经不维护 2 版本了,最新的是 3 .x 的版本。
在我读了 httprunner3 大部分的代码之后,我发现 httprunner3.x 是不支持通过传入 yaml 或者 json 文件路径来运行的(读了源码没发现这样处理的逻辑,也可能是我没有找到,欢迎各位大佬进行指教)。这样的话集成平台就不太好集成(个人感觉),而且作者目前也是在开发 go 版本的,有 bug 也不能及时的修复。
最重要的一点是我自己写底层实现我可以很方便的进行扩展,例如支持 RPC、Mock 等。后期也可以自己实现。出了bug 也方便进行定位、修复。
第二部分是使用 FastAPI 写的接口,主要是将数据保存到数据库,组装成 LRUN 所需要的 yaml 格式,在传给 LRUN 进行运行,最后拿到测试结果返回给前端。
第三部分是 vue 写的前端页面,可以在页面上输入数据,调用接口保存的数据库中。
画了简易的架构图,如下
下面来看一下平台页面是怎样的
登录注册
登录页面
注册页面,和登录页面是一样的,只是一个 css 样式的翻转
登录成功之后进入到首页,主要是做一些数据的展示(近 6 个月新增 API 数接口还未实现)
左侧可以收起菜单,也可以全屏。最右边可以退出登录、修改密码、修改头像。
项目管理
可以进行项目的增删改查,也可以创建私有项目。
平台项目之间是进行隔离的,当你选择了项目之后,才能进行下面的操作。
点击项目名称进入到环境管理页面
环境管理
点了项目名称之后就进入到了环境管理页面,显示的是该项目下的所有环境
可以添加测试环境、开发环境、线上环境等等。









