微服务化下的接口自动化测试
微服务化下,拆分出来的服务增加了接口数量。原本单体应用内部方法,演变成了一个service的rpc接口,过去内部单元测试实际上已经变成了接口测试,导致接口测试需求大增。
和许多团队一样,过去酷家乐的接口测试以本地代码工程为主,本地脚本的case管理结果查看等都不符合微服务化下的诉求,2022年酷家乐发起了本地脚本在线化改造,这里针对部分团队的最佳实践,简要和大家进行一些分享。
我们借助开源平台解决了接口测试的基础问题,例如将简单的http接口接入测试平台在线化管理,但在业务逻辑复杂的情况下,普通契约测试不足以发现bug,许多的业务链路实际需要场景化用例来完成。如何将链路式的场景化用例在线化是本次实践分享重点内容,场景用例这里更多的指下图的多接口串联case,包括多步骤操作,统一的复杂查询和结果校验等。
场景化测试脚本的问题和改造思路
首先我们利用服务化的思想将脚本进行重构。这个思路与开发领域从单体应用向微服务化的治理观念非常相似。具体有以下几方面的实践:
- 服务抽象与治理:针对测试代码管理和测试工具的服务治理问题,进行服务抽象,以便于更好地管理并可提供在线服务。
- 数据驱动对比测试:在数据驱动对比测试方面,采用了类似流量回放对比测试的思路。这种做法能够更真实地模拟用户场景,提高测试的针对性和有效性。
- 低代码编排与GPT辅助代码生成尝试:在低代码编排方面,尝试引入了GPT,以提高编排的效率和准确性。
- 统一的jsondiff建设:建立公司级的jsondiff能力,内部json对比规则共享,形成一个共享json对比能力的机制。
酷家乐在线化接口测试实践
服务API:简化调用,统一标准
在传统的接口平台基础上,将测试工具服务和被测业务接口统一API化。服务API就像是一个“中间层”,它能把各种业务测试的服务、被测接口等统一起来,通过统一的域名和标准化的参数进行调用,极大地简化了工作流程。非常类似OpenAPI的管理思路,把复杂的后端接口数据提供等通过这个服务API统一管理。
接口转化为工具:快速实现,简化操作
有了上述的服务API,暴露工具就变得非常简单。只需要点选或者输入,就能快速实现数据的交换和处理。只要postman可调通的http接口, 3分钟就能成完成一个工具的配置形成页面化使用。
关于低代码构建工具介绍,可参考公众号历史文章:服务端低代码实现和设计思路。
低代码编排:解决痛点,提高效率
实现了接口的快速录入后,需要继续解决case编排的问题。很多团队的做法是使用前端流程引擎,但复杂的编排和前端交互需要较高的开发成本和构建成本,运行调试效率又偏低。我们使用脚本编排来解决这个问题,通过groovy脚本在线编辑,兼容JAVA语法,并可直接引用开发工程包内的jar包,极大地提高了效率和易用性。进一步借助GPT大模型根据提示语可以快速的生成groovy脚本。
建立统一的JSON数据对比能力
在进行数据校验时,大型JSON文件对比是一个让人头疼的问题。基于JSON Path的对比需要较高的人肉维护成本。不同业务线有同样的数据校验诉求时,如何共享规则,避免重复建设成为了一个亟待解决的问题。针对这些问题,我们构建了一套酷家乐统一的JSON对比能力,下面简要介绍其实现:
- 基于开源库:利用开源库进行真正的数据对比,确保准确性,避免重复建设。
- 自定义规则:提供了一套规则,支持业务线自定义对比方式,如时间戳、ID、小数精度容差等元素对比,实现规则文件自动化脚本,测试工具,日常工作功能测试共享。
- 公共方法与界面:通过公共方法和界面,业务线可以直接引用和查看对比结果,大大简化了操作流程。
关于json对比的详细文章介绍,可参考历史文章:有了它,再也不怕JSON对比总是失败了。
专项实践效果
基于以上思想和原则我们建立了回归对比平台和测试服务化平台,借助回归对比平台实现场景化case的编排和数据驱动用例运行,将5个核心业务线的bug发现率提高到10%以上。
完成自动化在线重构的同时,测试服务化平台产出了200+的测试工具。测试,开发,技术支持工具使用周活达到1000次以上,测试服务平台成为了大家日常工作的基础平台之一。
展望未来
自动化要真正价值发挥不仅仅在于编写、运行和维护脚本,更在于如何管理测试数据、如何进行流量回放、如何构建和统计覆盖率等多方面。仍有三个方向值得我们深入研究:
- 如何进一步降低自动化的编写成本,提高开发效率?
- 考察用例有效性:线上跑了这么多场景,我们如何确保真正覆盖了用户的核心业务?这是一个既复杂又必须面对的问题。
- 脚本结果分析排查效率提升:当自动化脚本出现问题时,如何确保快速定位和修复?
作者:神雕
来源:微信公众号:酷家乐技术质量
出处:https://mp.weixin.qq.com/s/MmAYgPeR8oZJi1KrFoMBtQ
本文暂时没有评论,来添加一个吧(●'◡'●)