接口测试 【测试平台开发】云筑网 “天眼” 质量平台系列(一)--- 打造高效接口自动化测试

中建电商-质量部 · 2021年05月12日 · 最后由 pangxie 回复于 2021年08月31日 · 2294 次阅读

一、背景

   公司分了几条业务线,除了不同业务线开发使用的技术栈不一样外,测试同学的技术栈也不一致,技术能力参差不齐。这样导致有的人用 java,有的用 python,有的用 postman,有的用 Jmeter;虽然都能达到目的,但自动化的复用性和可维护性受到极大挑战。而且不管是使用哪种方式做接口测试,都会有一些公共的东西需要提取。介于以上原因,决定设计一套属于公司共用的测试平台;于是就有了我们的云筑网天眼质量平台。

二、平台使命

   推出测试平台不仅是为了解决技术栈或工具的一统江湖,更多是为了提高组装自动化测试脚本的效率、持续集成迭代测试工具、DevOps 闭环、推广测试平台、提高测试部门在整个公司的影响力!

三、效果展示

执行计划:

执行结果:

点击对应 case,可以查看 case 的每个前后置操作,步骤的执行情况

点击详情,可以查看每个步骤的详情请求数据,请求 url,header,body 和返回,方便定位问题

四、技术选型

前端:
   html+css+js:对前端基础要求较高,效率较低。
   vue:上手较快,其以模板语法为基础,以数据绑定和组件化开发为核心,摆脱繁琐的 DOM 操作。
   最终选择前端使用 vue 框架,搭配使用广泛的 elementui 组件库。
后端:
   Django / Springboot
   二者框架均可以有效支撑平台后端开发,区别和特点就不赘述。由于公司后端大部分使用的技术栈为 Java,想要提高测试人员对于 Java 代码的走读能力以及未来单元测试的能力;
   最终选择 Spring boot + Mybatis 作为平台后端开发框架。

五、平台简介

   天眼质量平台目前包含用户管理,项目组管理,项目管理,接口管理,用例管理,测试计划,环境配置,数据库配置,测试报告等模块。
   模块关系:业务线 == 项目组 --> 项目 --> 接口 --> 用例。测试计划关联需要执行的测试用例,执行测试计划生成测试报告。

六、平台亮点

  • 调试接口、执行用例时自动登录,告别 cookie,token
  • 录入接口时,提供调试功能,保证录入接口的正确性
  • 录入用例时,支持前后置操作可以操作数据库,提取数据库参数。均提供调试功能,可以实时查看前后置操作和数据库参数提取的执行结果
  • 用例可以添加多个步骤,支持步骤间的参数前后关联。并且提供单个步骤执行结果和前后关联参数的调试功能
  • 用例步骤支持返回参数断言和数据库断言两种断言方式。均提供调试功能,可以实时查看当前步骤的断言结果
  • 提供函数助手等功能

七、平台功能展示

1. 用户管理

用户用户的增删改查,每个新增用户会分配一个或多个项目组,用户只有其所在项目组下的操作权限

2.项目组管理与项目管理

公司不同的业务线对应不同的项目组,不同的项目组下根据具体业务建立不同的项目,用于挂靠接口与用例

3.数据库配置

支持 MySQL 与 sqlserver 类型的数据库连接,用户用例的数据库前后置操作,数据库变量提取,sql 断言等场景,
数据库连接具有测试连接的调试功能,可以用于检测当前数据库连接信息或者数据库状态之后正确可用。

4.环境配置

用例的执行是在不同的环境下执行,测试平台均予以支持;于是需要在平台上进行环境相关配置,比如:dev、qa、pre、prd
不同的系统对应的域名会有所差别,比如云筑商城有:采购商中心、供应商中心、运营平台,对应的域名不一样,需要在环境配置中进行管理,以便于接口调用域名的拼接!
在执行用例时,会根据计划所选择的环境(dev、qa 等)信息和用例关联接口的所属平台定位到具体的环境信息,用于用例执行。

5.接口管理

作用:统一管理所有接口信息,包含:名称、路径、接口所属项目服务、协议类型、请求方法、header 管理、参数管理等。
新建接口时,所有接口信息都可以根据基础信息配置获取,用户直接选择。

管理请求头、管理参数(支持 form 表单和 json 两种方式)

保存接口前可以直接根据录入示例参数进行调试,默认使用所属项目及服务的 qa 环境进行调试。

6.用例管理

作用:维护接口自动化用例。
用例结构主要包括:前置处理(执行 SQL,准备数据、提取数据)、测试步骤(调用对应的接口)、后置处理(执行 SQL,还原数据、提取数据)

前后置处理的时候支持调试 SQL,提取参数及使用参数:

测试步骤支持执行本接口,也可以选择其他接口作为基础:例如订单确认接口的测试,可以将第一步设置为执行下单接口,第二步再去进行确认;另外测试步骤支持调试(默认使用 qa 环境配置进行);
调试接口返回值:

支持对接口执行结果进行提取用于步骤间的参数前后关联,且提供调试功能可以实时查看提取结果;

支持返回值断言和数据库断言两种断言方式,均提供调试功能可以实时查看实际提取结果;

7.测试计划

通过执行测试计划来批量执行测试用例。创建测试计划会要求选择测试环境(dev、qa、pre、prd)

8. 测试报告

查看计划的总体执行情况,测试用例的通过率和总耗时。

点击对应 case,可以查看 case 的每个前后置操作,步骤的执行情况

点击详情,可以查看每个步骤的详情请求数据,请求 url,header,body 和返回,方便定位问题

八、后期规划

质量数据看板,直观量化开发质量和测试质量(后续会介绍)
接入公司内部研发工具生态链,实现 DevOps 闭环
支持从 swagger 导入接口,并且记录和展示不同版本的差别,解决前端开发与测试对于接口文档改动追踪的痛点
集成性能测试,实现在线编写压测脚本,自动按需调度负载机发压和服务器性能监控
功能测试用例、计划、bug 等支持,打造公司完整的测试链路平台

由于测试平台的前后端搭建篇幅较大,本文中仅介绍了平台的功能及要解决的问题,暂未展示代码;希望能给大家带来一些搭建测试平台的灵感和思路,也欢迎各位大佬拍砖提建议,不断完善我们的质量平台。

下一篇我们将介绍如何从 0 到 1 去搭建一个属于自己的测试平台,敬请期待!
共收到 19 条回复 时间 点赞

有一些问题想探讨一下:
1、自动登录,用例运行过程中,被其他地方刷新了 token,当前的用例能够做到自动刷新 token 吗?
2、用例的某个步骤失败了,怎么实现重试
3、用例某个步骤需要等待,但不知道具体的等待时间,怎么样实现类似于回调的方式让等待

请教下,指定环境,这个是什么逻辑呢?
是后端指定环境的 ip 吗?直接在执行的时候域名替换成 ip
还是在 nginx 中配置,这块比较小白

对这个自动登录的兼容情况比较好奇啊,我目前碰到的不同的项目的用户登录状态的判断相差还是挺大的,你这边是怎么统一做到的?
我碰到过需要将状态信息放到 header 里面的,放到 cookie 的,还有直接放到 body 里面的

我在美团的时候也有人做过类似的平台,但比这个功能少一些,但只限制于处理 server 端相关,有计划接入前端自动化相关吗

对这个结果页面的前置后置也很感兴趣,这个是通过用例前后调用其他用例来实现,还是说单独定义了一些方法类型,来判定为前置还是后置?

ZYH 回复

环境配置的目的:环境与用例的解耦
我们测试环境的域名跟 ip 运维有统一配置,如果没有映射关系的话,可以在平台部署的机器上去设置 host。
这里环境的概念,打个比方,环境中会设置:
采购商中心:
qa 环境:xxx.qa.yzw.cn
dev 环境:xxx.dev.yzw.cn
pre 环境:xxx.pre.yzw.cn
调用某个接口时:xxx.xx.yzw.cn/getInfo;在测试计划里会选择环境;如果测试计划选择的是 pre 环境,这时,测试计划里用例的执行调用的接口就是:xxx.pre.yzw.cn
无需在 nginx 做什么配置

木月 回复

有计划做 web 自动化或者 app,目前投入产出比不高所以会放到远期规划

木月 回复

用户的登录也是在执行时默认会去操作的。不同的业务线登录确实不一样,登录功能是内置在平台里了,所以无需用例编写者去额外编写登录相关的操作。
用例挂接口,接口挂项目,项目会有登录的特性,当某一个测试计划里包含了多个项目的用例,那么计划执行前,平台会提前进行所有相关的登录操作,以解决 cookie 等问题

木月 回复

前置与后置的定义更多的是为 用例做一些数据准备和扫尾工作(清理数据、结果提取成变量为其他用例使用)
前置里包含了:调用其他接口、数据库操作、redis 操作等
后置里除了前置包含的功能,还有结果提取的功能

花菜 回复

1、测试计划开始--->登录各个涉及到的端--->执行计划中的用例;如果计划中有部分用例涉及到注销登录等操作,也不会影响其他用例执行(类似一个全局、一个局部的概念)
2、用例某步骤失败,如果是在用例调试阶段,可以直接重新调试;如果是在执行测试计划阶段,那么目前需要重新执行测试计划;不过你的建议挺好,我们可能会在计划中增加失败重跑(类似 testng)
3、因为接入测试平台的接口都是同步的,不存在异步情况;再加上步骤是串行在执行的,所以还暂未碰到阁下描述的情况

第 1 点、在开始的时候登录,获取抽取出一个全局的变量,假设现在是用 token,但是在整个用例运行的过程中,这个全局变量中的 token 失效了,怎么样更新这个全局变量。
登录的 token 是执行的时候,每一步都会去全局变量池里面拿?还是说在解析用例的时候,已经把全局变量取出来,放在步骤中了。

第 3 点、指的异步接口,发送请求后,接口内部会执行一个任务,任务的执行时间不是稳定的,可能是 10s,可能是 3min,执行完之后把结果写到数据库。那么在下一个接口中要查询这个结果,就要先等待任务执行完,但又无法知道具体的等待时间。如果把等待写死为 3min,但实际 10s 就有结果了,比较浪费时间;又或者是 3min 还没写完,就会导致用例失败。

同一个域名,然后指定不同的 IP 呢?这在服务器是怎么操作呢?

ZYH 回复

你应该值的是同一个接口,指向的后端服务的服务器 IP 不一样?集群的概念?服务都是注册在网关上的,会随机调用 (nginx 配置)
如果你指的是某一个域名想要指定调用到某一特定 ip(多个 ip 的情况下),那么直接将域名换成 ip 地址去做调会简单一些

其实很简单,就一个 host 映射的事情。
做一个地方存储 host,然后解析请求中的 base_url
我的平台已经实现了。

请教个偏的,
贵司左边菜单用的什么字体,菜单 两个 item 之间间距多少

贵司的这个平台左边菜单相当美观,我做的(用的 elementui)难看的一笔

想借鉴下

不同的业务 token 也不一样,你这调试接口、执行用例时自动登录怎么做到一致的?还是说仅仅只是做了登录,其他需要 token 的请求还是要手动加入吧。

关注关注

花菜 回复

异步接口相关解决方案我的想法是,提供轮询步骤,对于执行结果进行轮询查询,比如设置轮询次数 20 次,和轮询间隔时间 3s,设置一个或是多个轮询退出条件,当接口返回的数据符合对应退出条件,则退出轮询查询,否则等待间隔时间再查询直到轮询次数用完。

'例挂接口,接口挂项目,项目会有登录的特性',这个的意思是每个挂到平台的项目,都提前把登录这部分写好了,执行用例的时候,调一次对应项目的登录接口,是这样理解吧

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册