点击关注“有赞coder”
获取更多技术干货哦~
作者:Henry
部门:美业测试
前言
接口自动化测试是个老生常谈的话题,基本上每个测试团队都会涉及,市面上大部分文章会从如何设计框架去讲解。但是这一次我想回归自动化的根本价值,从持续演进的解决方案出发,讲解有赞测试团队的心路历程和对于接口自动化的理解,欢迎交流。
有赞测试团队肩负的一个使命是:打造高效且可靠的产品交付能力。为了完成这个使命,我们会借助各种工具,而接口自动化就是其中的一把利器。
如何让接口自动化的价值最大化,首先需要想清楚如何去评估接口自动化的质量,有赞测试团队是这样思考的:
接下来介绍的持续演进的方案都是基于这两个方向去努力的
二、业务服务器架构
为了让大家更好地理解我们的演进思路,我先简单介绍一下我们业务的服务器架构,接口自动化的测试目标。
客户端:渠道较多,分Web、H5、小程序、APP、Pad,通过youzan.com域名请求,统一接入到公司网关层Nginx集群,反向代理转发到对应业务的Web服务器。
所以,接口自动化面临2种选型:
该如何选择呢?小朋友才做选择题,成年人我们都要了,两者互相结合,扬长避短。
这里需要从三个阶段来看:回归测试前、回归测试中、回归测试后。
回归测试前,我们通过2个事情来提升效率:
1、精准定位自动化测试覆盖范围
最原始的范围依据是根据功能测试用例来,但这不是客观合理的,我们从对外暴露的接口数和后端Service层应用的代码覆盖率去评估。
我们基于JaCoCo进行二次开发实现增量代码覆盖率统计,可以拿到每次执行自动化后的指令级覆盖(Instructions,C0coverage),分支(Branches,C1coverage)、圈复杂度(Cyclomatic Complexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes)。通过这些信息我们可以对我们的自动化进行查漏补缺。
通过解析前端路由文件,获取线上正在使用的接口数,作为基准,对比自动化执行请求的接口数,可以快速告诉各个模块负责人覆盖盲点。
2、高效编写自动化脚本
我们需要通过抓包工具来获取请求信息,这里面涉及到请求过滤、数据格式化、拷贝、顺序调用等工作,我们做了一个Chrome插件来代替这些大量的重复性工作,以提升自动化编写效率。
依下图所示,先Start开始抓包,操作被测页面,Stop停止,列表会过滤显示符合条件的XHR类型请求,请求信息自动格式化,支持手动单条删除or拷贝,点击Copy调用接口批量上传到自动化测试平台,是不是大大简化了前期获取原生数据的工作。
在我们测试平台进行用例的二次编辑,全部支持界面化。
回归测试中,只需要关注一个事情:执行时间。随着业务不断壮大,线上接口数接近2000+,对应的自动化接口请求数10000+,每次全量执行时间需要1个多小时,这样的速度是无法接受的,为了在10分钟之内解决战斗,我们做了3个事情:
1、延迟队列
废除了Sleep方式,将数据有延迟的校验放置到延迟队列中,支持自定义在一级模块or二级模块后再校验。
2、多级模块支持并发执行
我们采用官方的CompletableFuture异步线程类实现执行逻辑,Executors线程池管理,和业务账号池关联起来,一个线程对应一个执行账号资源,项目实际多模块并发的代码如下:
合理的使用线程池能够带来以下明显的好处:
3、数据清理采用命令模式
采用这个方式的优势:
回归测试完成后,当然要去分析结果了。一个信息全面,交互良好的测试报告可以让自动化结果分析效率大大提高。
有赞测试团队会定期分析线上漏测BUG,从后端BUG的分析结果来看,主要原因集中在偶现的数据不一致和复杂用户场景覆盖两个方面,反映出组装接口请求进行自动化测试覆盖的局限性。如何消灭这2个盲点,成为了我们演进的一个方向,我们将接口自动化测试场景转战到生产环境。
1、线上业务自动化校验
在公司越来越复杂的分布式架构下,难免会出现远程调用失败,消息发送失败,并发bug等问题,最终会导致系统间的数据不一致。传统的接口请求方式是无法发现这类问题的,我们需要借助BCP业务校验平台。
举个实际BUG场景:买家在有赞商家店铺购买商品参与了满减送,但是赠送的优惠券迟迟没有送达。我们来讲讲如何覆盖这个场景的:
这样能做到,用户购买商品产生的每一笔数据,都会经过我们自动化校验,确保每一笔数据的一致性,偶现的BUG是不是无处遁形
2、流量录制回放
前面提到的传统接口自动化解决方案,无论优化到什么程度,对于用户场景覆盖和效率提升,都是有一定的局限性的。
所以,为了不断演进我们需要引入新方案,有赞测试团队引进的流量录制回放,基于阿里开源的JVM AOP的能力,通过对被测应用进行挂载Sandbox,进行字节码注入,从而达到在线上录制流量和测试环境回放流量的目的。
上图是有赞流量录制回放平台的架构图,一次完整的流量录制回放是这样的:
由此看来,对比传统接口自动化,流量录制回放有如下优势:
以上拙见,希望能起到抛砖引玉的作用,欢迎各位测试同仁一起来交流分享。