接口测试|接口自动化落地实践

一 接口自动化测试作用

1、提高测试(回归测试)效率、节约成本;

2、保证每次测试的一致性。自动测试具有一致性和可重复性的特点,使测试更客观,提高测试的信任度;

3、将重复的任务自动化,避免因重复劳动产生厌倦,也能让测试人员有更多精力设计更多更好的测试用例,提高测试准确性和测试人员的积极性;

4、能执行一些手动测试比较困难或手动执行成本较高的测试;

5、为了更好的持续集成和交付。

二 为什么做接口自动化测试

供应链业务,ToB的流程较多,客制化严重,主流程相似,但逻辑细节有很多分支,底层的改动影响范围难确定,只靠手工测试执行慢,且容易覆盖不全,接口自动化迫在眉睫。

如下图所示:主流程都是客户下单后经过我们系统处理下发给下游承运商(如中间主刺),但每个客户可能都存在细微逻辑差别(分支逻辑如主刺上的边刺)。

图片

三 接口自动化落地以及迭代的过程

1、落地过程介绍:

落地其实就是想好用什么做,开始做,让做好的东西落地(后优化)执行使用的过程。

我们的落地以及优化的过程分8个部分完成(如上图):

图片

下面我将详细为大家解读如何以“case的持续积累”为主线,按部就班地持续优化,由量变到质变的接口自动化落地过程。

2、落地过程详细解读:
1)重要客户的用例编写:

这里分两步,一是要先选取一个“好”的框架,第二才是“花时间”去写自动化case。

a)有关自动化工具(框架):

如果去网上搜“接口自动化”会有很多种实现方式,Junit、Phpunit、Pytest、jmeter等等很多种;

综合学习成本、持续集成、用例管理、测试报告、扩展性等多方面考虑,最终选择了Httprunner,它有如下的优点:

a.继承 Requests 的全部特性。满足HTTP(S) 接口测试的各种场景需求

b.测试用例描述方式有表现力。支持参数化、函数、以及结果提取等方式,可用简洁的方式进行各种用例描述。

c.测试用例与执行代码分离。采用YAML/JSON描述测试用例,降低用例编写及维护成本;用例转化格式后,可配合不同的执行引擎(比如Jmeter、Locust),达成不同的测试目的(性能测试)。

d.用例可以基于日常手工测试录制(后进行简单调试),避免重复开发。基于 HAR 实现接口录制和用例生成功能(har2case)。

e.测试用例分层合理(api->testcase->testsuit)。高抽象,避免一个接口改动造成大面积用例修改;高复用,便于创建复杂测试场景;方便用例的分组、按需执行。

f.支持测试用例和测试数据分离。避免等价类等场景需要构建重复用例;同时方便构建海量性能测试数据。

g.测试结果统计报告简洁、清晰、详尽;方便进行结果查看和问题定位。

h.高扩展性。能够轻松实现二次开发、Web平台化、Jenkins等持续集成工具对接(采用CLI调用)、自定义报告模板等。

另外该框架是开源的,社区资源比较充足,已经有很多人关注、应用以及维护,会持续迭代,可参考的资料多,有问题可以快速找到解决方案。QA横向也拉齐了公司的各业务线都使用该框架。

b)case积累:

确定好框架,第二步就是编写自动化case,需要的就是时间了。因为学习成本较低,前期熟悉下httprunner就可以上手去写并调试,在写case的过程中再不断的深入学习,不断积累case的同时对框架本身也有足够的了解了。

当前,写case是要有规划的,因为需要在高度迭代的项目中间争取时间去完成,而且对接的上下游系统较多,不同的交互方式、不同的传输协议,调试起来相对还是比较麻烦的。所以我们优先完成了订单通用流程以及重点客户流程的case编写。

具体到写某个case呢,除了场景设计的合理全面外,还要考虑以下几点:

a.校验(断言)一定要细致,错误的例子就是只断言到http应答码是200,正确且完美的case一定是像手工测试一样,需要对是否已经落到存储且存储的值是否正确做好校验的;

b.case的健壮性,不能总是失败,花很多时间去看为什么失败,比如:异步流程写入稍微慢,断言时查不到数据或状态还未更新,影响到case的结果,可以多sleep几秒或者改为查库做断言;

付出是有回报的,自完成自动化的case积累后,我们线上重要客户没有在出现过问题。另外当你遇到原来上线前需要大量时间手动回归的场景,只需要一行命令就搞定的时候,就更能发现收益有多大了,特别是发现问题的时候。

2)Mock服务参数校验:

首先说一下为什么要做这个校验(我们把与被测系统有rpc交互的系统服务全部以mock服务替换掉了),因为mock服务是接口级别的假服务(没有逻辑判断),无论调用mock服务时传的是正确或者错误的数据,返回值都是我们设定好的固定的值,所以使用mock服务会缺失对被测系统逻辑处理后向下游传值是否正确的校验。举个例子:

针对以上情况,我们做了如下图的改造,通过调用时传入logid,将调用mock服务的参数写入redis中,key为logid+url,然后再通过自动化程序使用该key对调用mock服务的参数做查询,将查询到的结果与预期做比较,以完成对mock服务(下游服务)的校验。

图片

图片

这里可能会有人有疑问,为什么不能直接调用真实的下游系统,而要选择mock。使用mock首先是为了避免写数据的场景对下游服务产生影响,因为测试的都是假数据(我们未来还需要在线上跑),第二就是mock服务相对于真实的服务来说比较稳定,是我们自己掌控的,使用mock不会因为下游服务不稳定而影响到自动化的稳定性。

3)定时巡检:
接入Jenkins,通过配置对线上服务代码做定时的巡检(定时触发job),同时可验证到case的稳定性。

图片

图片

4)被测环境稳定性:

因为要对“线上”服务做巡检,所以要保持代码和数据库表结构的一致性;

因为碰到过旧版本pusher长时间运行时有goroutine泄露的问题,所以要定期重启pusher;

因为mock服务会因为线下机器资源不足自己挂掉问题,所以需要检查mock服务是否健康,不在了则拉起;

因为要长期定时运行,日志会越来越多,需要清理;

所以,增加了一些脚本,通过ct任务来定期做上面提到的各种解决问题的操作,以保障被测服务的稳定。

图片

5)执行时间优化:

有了以上,第一期的工作基本完成,剩下的就是持续不断的积累和优化case。在case不断增多的过程中,暴漏了一个新的问题–“执行时间”,随着case的增多执行时间会越来越长,特别是一些业务逻辑是通过异步mq(有的场景,一个请求出发N个mq),想要校验数据需要sleep较长时间才能做到有效校验,串行跑case显然会有很大问题。比如,上线前执行,如果比较紧急,自动化执行需要半个小时甚至一个小时的时间,这样就会比较“尴尬”。

为了解决该问题,我们做了如下优化:

1、通过脚本控制case可以并行执行,但并行执行会生成N个httprunner的结果报告,不好统计展示,所以又引起allure做报告的聚合。

2、增加db工具类,将通过接口查询获取数据的地方改为直接查询数据库,减少case中的sleep时间;

图片

3、支持直接脚本调用,避免等待ct任务定时执行,更灵活

图片

最终我们将case的执行时间从15分钟以上,降低到3分钟左右(如图为allure的结果截图,30种场景,300+的case执行只需要3分多钟);

图片

6)服务化,研发“自助”:

为了支持研发自测、提测准入执行,新增job,让研发可以通过输入相关的内容,点击开始构建,即可构建开始触发自动化:

需要输入以下内容,其他无需关注:

1)tapdurl  →  需求链接(多个关联需求可只写一个,没有可写明“备注:无”)

 2)models → 代码模块

3) test_branch → 代码分支(每个需求的提测分支,后端模块分支名需统一命名)

4)project_level → 选择C、D级项目

图片

代码的更新是通过在被测服务器上的脚本控制更新的(并且对rpcconf模块做了特殊处理,因为需要保持调用mock服务,要保证不被覆盖掉);

自动化执行结果会以企业微信消息的方式通知到构建者、QA、相关方向负责人;

图片

7)优化消息通道:

大家看到上面的执行结果通知,当前只能通过查看通知详情中的成功、失败的case数判断自动化是否全部通过的,定时巡检24小时都在进行,所以会有每天会有很多通知,需要每次点开关注是否有失败,容易“降低关注度”,所以我们做了消息通知通道的优化,将成功与失败的分开;

成功的通知(QA-msg通道):

图片

失败的通知(AutoTest-Alarm通道):

图片

8)打通上线系统:

人为限制研发执行难度大,只有接入流水线,通过系统限制才能达到强制执行的效果。提供合理可行的方案,配合op、inf、qad共同完成与上线系统的打通。

图片

至此,我们完成能够支持研发阶段研发自测、提测准入,测试阶段快速回归验证,上线时通过系统卡点,上线后对服务定时巡检的全流程覆盖的自动化体系建设。

图片

注:

a)服务巡检

通过jenkins定时触发自动化程序,在线下环境,定时对服务接口及服务的可用性做巡检;

b)上线流程卡点

C、D级项目上线前,都需要在部署完预期要上线的代码分支后执行执行自动化,自动化通过后才能继续下一步上线操作,不通过则阻断流程;

c)提测准入

提测前需要手动执行自动化case,通过后才能进行提测(提测申请中需要附上自动化执行结果的截图);

四 未来规划与总结

1、回归新功能使用

测试前完成编写,测试中调整,上线前可用于回归新功能使用。(这对整个团队都有很大的挑战,需要尽量保证定义好的接口协议在开发过程中没有变动;测试人员需要相对多的测试时间去调试case;)

2、线上(任意)环境执行

影子标+mock方案落地:达到一套自动化代码&数据在任何环境或服务上都可执行的效果。

影子链路,数据库、rpc调用的conf配置,全部配置为mock服务和影子库。

自动化是一个不断积累完善的过程,需要随着业务的变化同步做变更,随着case的不断积累优化,收益会越来越大,当然面对的挑战也会越来越大,要保证case的合理性、准确性、稳定性。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值