基于语义感知SBST的API场景测试智能生成
摘要:面对庞大服务接口群,完备的接口测试覆盖和业务上下文场景测试看护才有可能保障产品服务的质量和可信。如果你想低成本实现产品和服务的测试高覆盖和高质量看护,这篇文章将为你提供你想要的。
本文分享自华为云社区《基于语义感知SBST的API场景测试智能生成【智能云测】》,作者:DevAI。
1 背景
据2022年统计数据,华为云已发布商用的云服务达到220+。以单个服务500+接口数量计算,已商用的云服务的接口总数高达10W+。每接口参数数量更是平均超过20个,全组合测试会带来组合爆炸,费时费资源,是不可完成的任务。为在有限的测试投入下保障有效的问题拦截和测试覆盖,通常需要投入专职测试人员人工设计测试逻辑和测试数据组合,门槛高,依赖业务经验和自动化开发经验。而当前主流的API测试自动生成工具,基本采用传统的随机测试、Fuzz测试、基于代码覆盖目标引导的SBST等,不感知接口业务语义,只能较好地解决单接口测试生成,对于多服务、多组件接口功能交互、协议交互时序场景、状态相关场景,生成有效性极差,误报高,效率低下,导致用户E2E业务场景看护不足,易遗漏功能交互场景、异常调用等测试场景,导致现网问题时有发生,甚至服务中断。
面对庞大基数的接口群,需要完备的接口测试覆盖和业务上下文场景测试看护才有可能保障产品服务的质量和可信。
2 API场景级测试智能生成
(总体流程图)
Semantic-aware & search-based API场景级高度自动生成方法,基于正向API接口定义文档和逆向现网、类生产脱敏导流数据,挖掘接口操作上下文语义依赖和入参数据约束,生成接口操作依赖(概率)图(ODG),和接口参数约束字典,基于接口定义生成显性测试oracle, 基于脱敏导流数据挖掘生成隐性业务测试oracle。覆盖操作依赖图和字典批量迭代生成实例化测试序列下发SUT测试执行,准实时收集测试response并自动判定。依据前序迭代response结果,动态修正更新ODG图和参数字典以及测试oracle。实现API场景级测试全自动生成、判定、修正、再生成。
迭代过程中辅助以代码覆盖为导引,定向加速测试序列种子变异和优化。全过程极少需要人工介入和确认,是一种L4-L5全自动测试生成方法,能够实现低成本、低代码、低误报、高质量的覆盖增强测试能力。
术语解读:
ODG图:基于Swagger2.0和OpenAPI3.0.0规范的Rest接口定义文档,正向挖掘API接口操作上下文依赖ODG图;
OTPG图:基于现网业务请求流量数据,以用户、时间、环境等维度,逆向挖掘API接口调用时序业务转移概率图;
动态修正: 基于动态执行响应码和响应结果,实现执行时动态更新修正ODG和参数字典,解决静态依赖数据中的错挖和漏挖问题;
测试oracle挖掘: 自动挖掘测试断言,包括响应参数统计分布和接口入参 vs出参的requires、relational、only one、zero one……数值关系或蕴含关系等常见约束关系,实现响应异常(状态码、返回码、接口定义schema violation)自动检测和业务依赖违反自动判定。
2.1 测试设计和执行交互模式变革
AS IS是当前测试设计和执行交互模式,多数环节需要人工理解设计文档,测试方案设计(测试逻辑时序设计、测试数据组合设计、测试判定点设计)和测试自动化实现开发,且要求参与人员熟知被测产品或服务业务、接口文档,熟练掌握测试技术、测试自动化框架、测试自动化方法开发。依据经验先设计、实现、调试、固化基线化测试用例,再批量按需执行,最后出报告、提单、反馈开发。。。
To Be是API场景测试智能生成技术带来的测试变革之后的交互模式,测试人员只需简单配置生成需要的数据来源(哪些接口定义,哪个时间段的导流数据)即可,其余测试设计活动、执行活动和判定活动均交由生成工具服务自主挖掘探索完成。最终只需少量人工批量确认结果,按需固化、基线化用例,以便后续回归测试。
为有效衡量和举证测试生成服务的测试生成质量和生成效率,API场景测试智能生成服务提供了有效性、缺陷拦截、覆盖率三大维度的指标和趋势数据
2.2 关键技术
2.2.1 API接口操作上下文依赖ODG图静态挖掘
API接口操作依赖图(ODG图)反映了接口间的操作时序以及接口间参数依赖。通过遍历ODG图,可以生成完备的业务场景,以实现业务场景功能交互测试覆盖。因此,ODG图的准确性和有效性定了测试生成的质量。
下图为ODG图生成的流程图:
本技术采用两种规则进行ODG图的挖掘:
1. 基于接口间出参-入参依赖挖掘
参数匹配:根据参数名称、类型是否完全一致来建立依赖关系
子串匹配:参数A的名称是参数B名称的子串
分词匹配和编辑距离匹配: 存量接口中存在大量接口的参数命名不符合规范,或关键信息在url资源路径中,需通过分词、编辑距离等方式来发现潜在的关系
参数黑名单:部分无实际业务意义但多个接口都包含的参数,如page分页信息等,采用添加黑名单的方式过滤
2. 基于对同一资源对象的CRUD操作语义顺序依赖挖掘
符合restful规范:Post->Get->Put->Delete的挖掘
不符合restful规范:对URI信息构建方法映射,如“add-”-> “Post”, “query/get-” -> “Get”, “remove-” -> “Delete”, 对URL的路径分词识别是否对同一资源的操作,以实现CRUD语义的依赖挖掘
(以真实业务为例生成的ODG图)
2.2.2 API接口操作时序上下文依赖OTPG图挖掘
OTPG图是对业务场景挖掘的有效补充,我们对脱敏后的导流数据,以用户/时间/环境等维度,按API接口操作时序及接口间出入参的取值匹配,计算转移概率,生成OTPG图。
2.2.3 动态修正技术
在测试生成任务执行过程中,根据场景测试序列sequence实例的结果反馈,动态更新ODG图和参数字典,更正错挖和漏挖,进一步提升生成成功率和场景序列的成功请求长度。
Top-Down: 分解请求不通的sequence成多个sub sequence,直到sub sequence请求成功,并更新参数字典
Bottom-Up: 重组请求成功的sub-sequence和字典取值,实现更长长度的sequence的请求成功
(动态修正示意图)
基于动态修正技术,我们在ICSE 2022发表了题为《MOREST: Model-based RESTful API Testing with Execution Feedback》的会议文章。
2.2.4 测试Oracle挖掘
鉴于随机参数的生成效率低下,我们引入参数约束,提升参数生成效率。同时为了验证返回结果,我们引入Oracle挖掘。参数约束是指请求参数间存在的约束关系,如参数A要大于参数B;Oracle是指对于返回结果的约束,如request中的某个参数值等于response中某个参数值。
常见的约束类型如下:
API测试用例生成的在测试oracle挖掘的流程示意图:
(参数约束&Oracle挖掘示意图)
现有全自动生成方案只能探测非业务功能相关的显性问题,例如黑盒oracle:应用crash,白盒oracle: 空指针、内存溢出等问题,或者只能通过对比测试的方法来判定结果,不能解决业务相关复杂oracle的生成问题,因此当前对于业务相关oracle仍需大量人工投入设计、补全。
该模块旨在解决测试oracle的生成难题,基于接口定义文件和现网脱敏导流数据实现接口内/间2-wise 乃至n-wise参数蕴含、数值关系等约束挖掘(隐性oracle),以及状态码、schema violation等显性测试Oracle生成和自动判定。
3 小结
面对云化产品版本的快速迭代,应用场景日益丰富,产品功能渐趋复杂,完全基于经验人工设计的接口测试在云化产品质量保障上越来越捉襟见肘。因此基于接口文档和现网流量数据的智能API测试生成技术应运而生,实现了单接口与多接口业务场景的双覆盖,做到真正帮助测试人员提高工作效率,并有力保障了云化产品质量。
该生成服务的应用前景:
1. 对于小规模测试团队或无专职测试人员的全功能团队或测试小白,可基本实现少人参与或无人参与的无代码化高度自动化Rest 接口正常场景级测试用例生成,自动化执行和判定。
2. 对于有专职测试人员、测试专家的测试团队,可低成本提升测试场景覆盖率、缺陷拦截效率,减少测试设计投入。
3. 可以正常场景API测试基础上实现异常场景 (可靠性测试)和并发场景(性能压力模型)的全自动化生成,完全替代现有接口fuzz测试,实现接口全场景测试无代码化。
基于语义感知SBST的API场景测试智能生成的更多相关文章
- PhantomJS是一个基于WebKit的服务器端JavaScript API
PhantomJS是一个基于WebKit的服务器端JavaScript API,它基于 BSD开源协议发布.PhantomJS无需浏览器的支持即可实现对Web的支持,且原生支持各种Web标准,如DOM ...
- 基于nginx+lua+redis高性能api应用实践
基于nginx+lua+redis高性能api应用实践 前言 比较传统的服务端程序(PHP.FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放. ...
- bloom-server 基于 rust 编写的 rest api cache 中间件
bloom-server 基于 rust 编写的 rest api cache 中间件,他位于lb 与api worker 之间,使用redis 作为缓存内容存储, 我们需要做的就是配置proxy,同 ...
- Spring Cloud Zuul 2(基于配置中心的动态API网关)
在大体了解了API Zuul 和 配置中心Config后我们来尝试完成一个基于配置中心的动态API网关 创建项目 命名为api-gateway-dynamic-route并加入config 和 Zuu ...
- 使用Minifly打造基于视觉感知的跟踪无人机
前言:无人机和人工智能现在是非常热门的话题,将两者结合起来是一个比较好的创意,本文介绍一种可行的解决方案来实现基于视觉感知的跟踪无人机.从零开始搭建无人机系统工作量和难度(以及钱)都是非常大的,所以在 ...
- 使用 postman 给 API 写测试
使用 postman 给 API 写测试 Intro 上次我们简单介绍了 使用 postman 测试 API,这次主要来写一些测试用例以检查请求的响应是否符合我们的预期以及如何使用脚本测试 使用 po ...
- [转载]基于TFS实践敏捷-实现用户场景
您是新用户的 Visual Studio 应用程序生命周期管理 (ALM) 和 Team Foundation Server (TFS) 吗? 您想知道如何您和您的团队可以获得最大受益的这些工具来生成 ...
- 基于iSCSI的SQL Server 2012群集测试(四)--模拟群集故障转移
6.模拟群集故障转移 6.1 模拟手动故障转移(1+1) 模拟手动故障转移的目的有以下几点: 测试群集是否能正常故障转移 测试修改端口是否能同步到备节点 测试禁用full-text和Browser服务 ...
- 使用 node-odata 轻松创建基于 OData 协议的 RESTful API
前言 OData, 相信身为.NET程序员应该不为陌生, 对于他的实现, 之前也有童鞋进行过介绍(见:这里1,这里2). 微软的WCF Data Service即采用的该协议来进行通信, ASP.NE ...
随机推荐
- li 与 li 之间有空白间隔是什么原因引起的,有什么解决办法
li 与 li 之间有空白间隔是什么原因引起的,有什么解决办法 原因 浏览器会把inline元素间的空白字符(空格.换行.Tab等)渲染成一个空格.而为了美观,我们通常是一个 放在一行,这导致 换行后 ...
- 超硬核解析!Apache Hudi灵活的Payload机制
Apache Hudi 的Payload是一种可扩展的数据处理机制,通过不同的Payload我们可以实现复杂场景的定制化数据写入方式,大大增加了数据处理的灵活性.Hudi Payload在写入和读取H ...
- vector存放边的方法
#include<bits/stdc++.h> using namespace std; struct Edge{ int x; int y; }; vector <Edge> ...
- maven在idea中的一点使用技巧
maven在idea中的一点使用技巧 idea已经支持将参数的意思也展示出来,确实很方便. -U是强制拉取,因为如果拉取某个jar包,失败了,那么在一段时间内,idea不会重试,除非指定-U. -X呢 ...
- 使用mqtt+ssl加密 WebSocket 客户端连接 MQTT 服务器以及ws+wss协议
上篇用TLS/SSL保证EMQ的网络传输安全讲了使用自签ca加密MQTT传输数据,如果mqtt用在web端,如何使用ssl.tsl加密? 1.web客户端 // 引入mqtt.min.js // 将在 ...
- Myql 中的事务回滚机制概述 ?
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销.要同时修改数据库中两个不同表时,如果它们不是一个事务 ...
- 学习Puppet(一)
puppet的入门 1.简介 puppet是一种采用C/S星状结构的linux.Unix平台的集中配置管理系统. puppet拥有自己的语言,可管理配置文件.用户.cron任务.软件包.系统服务等. ...
- js获取一周前日期
项目中需要设定默认开始时间为一周前,结束时间为现在,现在写一下如何用js获取一周前日期. 1 var time=(new Date).getTime()-7*24*60*60*1000; 2 var ...
- Java根路径设置(在获取本地路径时会获取到这个文件夹,,这样就可以专门放配置文件了)
在获取本地路径时会获取到这个文件夹,,这样就可以专门放配置文件了
- 浅析Node与Element
起因 起因有二: 在看winter老师的分享:<一个前端的自我修养>时,有注意到这么一幅图,里面有写childNode和children属性. 昨天有学弟问起我,能否自己定义一个所有元素节 ...