一、前言
飞书深诺是国内唯一一家同时拥有13大全球新媒体渠道官方代理资质的数字营销企业,集成国际头部新媒体渠道资源,专注APP、电商、品牌、游戏四大场景的全链路出海服务,为中国企业出海提供一站式数字营销解决方案。作为一家技术产品驱动的公司,良好的软件质量对于产品的价值交付至关重要。就软件生命周期模型而言,软件测试是保障软件质量的最重要方法。而从测试金字塔模型来看,接口测试是易于实现且投入产出比较高的测试环节。本文将介绍飞书深诺集团质量部是如何开展接口测试工作,如何利用接口测试来提高测试能效,以及结合最近热门的AIGC技术为接口自动化加速的实践。
二、接口测试规范化
为什么要将接口测试规范化
2020年之前,我们项目中大约有60%的缺陷是由后端服务产生,其中30%左右都是由边界值场景、异常场景等所引发,这些问题在集成测试阶段难以模拟和发现。而接口测试正是以增加测试覆盖率、以做异常场景和边界值场景测试为目标的一种测试手段。但当时接口测试在项目中普及率并不高且没有纳入我们的质量体系,为了减少这些在集成测试中难以模拟的缺陷。我们从2020年中旬正式将接口测试纳入准入准出质量管理体系,主要有下列措施:
- 采用规范化的EXCEL用例模板编写接口测试用例。
- 项目用例评审阶段加入接口测试用例的评审。
- 开发人员提测接口时需要发送邮件,并附上提测分支,接口文档和简要说明。
- 将接口测试加入冒烟测试范畴。
将接口测试纳入准入准出质量管理体系后,开发和测试同学会基于以下标准流程开展接口测试:
接口测试规范化所带来的问题以及改进
接口测试规范化体系化后,个别项目经理反应项目的整体交付周期变长且绝大多少缺陷还是在集成测试时被发现。我们从各个环节分析了原因,发现主要是由于开展了接口测试后,测试同学对于如何开展接口测试比较生疏、编写接口用例的效率不高等问题导致了周期变长。针对以上的问题,我们主要从以下5个方向进行了改进:
下面是针对5个方向的改进描述:
-
对测试同学进行接口测试方法培训
我们开展了多期接口测试常用工具以及测试方法的培训,并以公司实际的业务系统为例,介绍了常见的接口分类,接口用例设计,接口测试工具的区别,HTTP协议等相关知识。
-
采用思维导图方式编写测试用例
我们基于xmind格式定义了一套用例编写规范,使用该规范编写的用例可以轻松导入到我们的测试用例管理平台,方便后期的统一维护与管理。
-
提供接口测试用例通用校验规则
我们整理了常用的接口用例通用校验规则,测试人员设计用例时可以参考此规则,节约了一部分时间。
-
可根据代码行覆盖率报告查漏补缺
我们开发了基于JACOCO的代码行覆盖率报告,测试人员进行接口测试后可以参考此报告进行查漏补缺,以免漏测的情况发生。
-
统一接口文档的格式
在此之前,项目中存在yapi,word,swagger等多种格式的接口文档,增加了测试人员学习使用成本,综合文档编写维护成本等考虑,公司架构组决定统一使用swagger作为统一的接口文档管理方式
效果评估
接口测试形成体系化后,测试人员在项目中对接口测试进行不断地深入实践,在结合业务丰富了接口通用校验规则、优化接口用例编写方式等诸多改进措施的前提下,经过了大半年的沉淀,到2020年底,我们发现项目质量有了明显的提升,但是付出的代价是项目交付周期的延长。项目质量主要提升在下面两个方面:
- 和接口测试规范化前相比,项目中大约30%的缺陷能够在接口测试阶段被提前发现,其中的70%缺陷属于边界值问题、上下游系统间联调问题。
- 生产问题漏出率减少了约10%(漏出率:生产环境缺陷数/总缺陷数),项目的交付质量有了明显提升。
三、接口测试自动化
为什么要将接口测试实现自动化
为了提升项目质量,我们将接口测试纳入了质量管理体系,在提升了质量的同时但也增加了项目的交付时长,与之前相比,项目的平均交付周期多了0.5天左右,业务方对此不太满意并希望可以如期交付。我们通过分析项目开展中的各个时间节点后发现,绝大多数的时间都消耗在了回归测试上。因此如何利用平台工具缩短回归测试时间,缩短项目交付周期成了我们需要立即解决的问题。
接口测试自动化方式的选择
为此我们调研了一些开展接口自动化的常用方式,并对比了优缺点
开展方式 | 优点 | 缺点 |
---|---|---|
Pytest | 灵活,可调试,编写用例效率高 | 需要编程基础,需要安装环境 |
MeterSphere | 不用安装任何工具,依赖于浏览器,利于推广,便于收集数据 | 对于业务复杂度高的用例编写起来不方便,非代码类缺少调试和自动生成等,用例编写效率降低 |
Robot framework | 关键字驱动,自定义用户关键字,支持测试日志和报告生成,支持数据库操作 | 接口测试用例写起来不简洁,需要掌握特定语法 |
Jmeter | 支持参数化,不需要写代码 | 创建接口用例效率不高,无法查看每一个接口执行情况的测试报告 |
基于Pytest编写用例效率高,且Python语法优雅简单、第三方库丰富、支持多种编程范式、可以调用JAVA,C等语言编写的模块、学习门槛低等优势下,我们结合公司目前的业务规模和复杂程度最终选择了以Pytest为核心来开展接口自动化。
接口自动化框架介绍
该框架围绕Pytest为核心开发,其分层结构图如下所示:
框架遵循测试脚本与测试数据隔离的原则,使用者安装依赖后,在其项目中编写接口定义以及测试数据即可。对于接口测试数据的编写,框架提供了TestCase类,封装了发送HTTP请求的常用参数以及对响应的断言等,TestCase类结构如下:
自动化项目在运行完成后,框架会收集运行数据并在我们的测试平台上展示详细的测试报告,包括接口定义,入参,预期以及实际响应,断言等,如下所示:
基于以上的步骤,自动化项目运行的整体流程如下:
效果评估
自2021年推行接口自动化以来,我们组织了多期关于python语言,pytest框架以及自动化框架的培训,并在1.0版本的框架上持续迭代并增加了许多新特性,如自定义断言,接口用例串联,链路追踪,运行失败通知等,并将自动化用例编写数量、自动化用例运行成功率、自动化发现的有效BUG数纳入绩效考核指标。
基于此框架,测试同学可以在接口测试阶段直接写自动化用例进行测试,也可以在接口功能稳定后编写自动化用例。截至到目前为止,测试同学已经为65个应用写了约上万条自动化用例。得益于测试同学投入了大量时间对自动化测试的持续维护,通过自动化测试,后端应用中核心场景回归测试时间缩短到了5分钟之内,项目的交付周期减少了1天左右,项目的平均交付周期减少了约0.5天,受到了业务同学的广泛好评。
四、接口测试自动化+AIGC
接口自动化在提高了回归测试的效率的同时也存在一些弊端,最为显著的一点便是需要投入大量的时间维护测试脚本,遇到运行失败的情况也需要花费精力排查原因。针对于前者,我们发现AIGC在代码生成方面有着天然的优势,且在开发领域已经出现了例如github copilot等反响不错的优秀工具。所以我们希望借助AIGC的能力帮我们减少一部分编写测试脚本的时间。
思路
我们在Prompt中传入了接口的定义、基础的验证点,入参的类型,并要求GPT根据入参类型生成一些测试数据,Prompt内容如下:
ChatGPT生成的代码如下所示,与测试同学在接口自动化项目中编写的脚本相差无几,且运行成功率达到了90%以上,后续修改只需要加入测试数据和验证点即可。
基于以上pytest代码的正确生成,我们决定在测试框架中提供了利用ChatGPT批量生成测试脚本的能力,大致思路是解析swagger接口文档获取接口定义,根据接口定义组装Prompt,再调取ChatGPT接口生成代码并写入测试脚本文件。
效果评估
ChatGPT生成测试代码的功能加入测试框架中后,利用此编写测试脚本的时间有了明显的缩短,以一个应用119个接口为基准进行对比,常规手工编写测试脚本大约需要4小时左右,而通过GPT批量生成测试脚本与常见的测试数据只需要30分钟。
实验数据
应用数 | 接口数 | POST方法 | GET方法 |
---|---|---|---|
1 | 119 | 75 | 44 |
效果对比数据
常规编写脚本时间 | ChatGPT生成脚本时间 |
---|---|
4H | 0.5H |
五、总结及展望
自2021年开展接口自动化以来,测试同学经过了一系列的培训以及学习,已经可以独立的完成项目中接口自动化工作并可以发现潜藏其中的问题。尤其对于功能测试同学而言,熟悉了对应接口的数据流转、逻辑交互后,在系统测试阶段便可以从更丰富的视角,更深入的角度来发现可能存在的缺陷。
对比20年初,项目交付周期环比减少了约0.5天,核心应用的行代码行覆盖率维持在45%左右,自动化脚本BUG发现率约60%左右 (计算公式:自动化测试发现的bug数 / 有效bug数),偏中台纯服务端的应用BUG发现率更是达到了80%。通过接口自动化的有效开展,成功地解决了回归测试繁琐易出错且效率慢的问题。
结合ChatGPT的接口自动化测试目前正处于探索尝试阶段,虽然减少了一部分测试脚本编写时间,但是还未能完全解决自动化测试维护成本高,排查问题花费时间长的问题,对此我们希望未来可以借助ChatGPT的能力分析自动化出错的日志,并利用一些机器学习算法预测出错的分类,并能够给出合适的修复建议,实现自动修复。
作者
喻峰 (飞书深诺质量部,测试专家)