摘要:面对庞大服务接口群,完备的接口测试覆盖和业务上下文场景测试看护才有可能保障产品服务的质量和可信。如果你想低成本实现产品和服务的测试高覆盖和高质量看护,这篇文章将为你提供你想要的。

本文分享自华为云社区《基于语义感知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场景测试智能生成的更多相关文章

  1. PhantomJS是一个基于WebKit的服务器端JavaScript API

    PhantomJS是一个基于WebKit的服务器端JavaScript API,它基于 BSD开源协议发布.PhantomJS无需浏览器的支持即可实现对Web的支持,且原生支持各种Web标准,如DOM ...

  2. 基于nginx+lua+redis高性能api应用实践

    基于nginx+lua+redis高性能api应用实践 前言 比较传统的服务端程序(PHP.FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放. ...

  3. bloom-server 基于 rust 编写的 rest api cache 中间件

    bloom-server 基于 rust 编写的 rest api cache 中间件,他位于lb 与api worker 之间,使用redis 作为缓存内容存储, 我们需要做的就是配置proxy,同 ...

  4. Spring Cloud Zuul 2(基于配置中心的动态API网关)

    在大体了解了API Zuul 和 配置中心Config后我们来尝试完成一个基于配置中心的动态API网关 创建项目 命名为api-gateway-dynamic-route并加入config 和 Zuu ...

  5. 使用Minifly打造基于视觉感知的跟踪无人机

    前言:无人机和人工智能现在是非常热门的话题,将两者结合起来是一个比较好的创意,本文介绍一种可行的解决方案来实现基于视觉感知的跟踪无人机.从零开始搭建无人机系统工作量和难度(以及钱)都是非常大的,所以在 ...

  6. 使用 postman 给 API 写测试

    使用 postman 给 API 写测试 Intro 上次我们简单介绍了 使用 postman 测试 API,这次主要来写一些测试用例以检查请求的响应是否符合我们的预期以及如何使用脚本测试 使用 po ...

  7. [转载]基于TFS实践敏捷-实现用户场景

    您是新用户的 Visual Studio 应用程序生命周期管理 (ALM) 和 Team Foundation Server (TFS) 吗? 您想知道如何您和您的团队可以获得最大受益的这些工具来生成 ...

  8. 基于iSCSI的SQL Server 2012群集测试(四)--模拟群集故障转移

    6.模拟群集故障转移 6.1 模拟手动故障转移(1+1) 模拟手动故障转移的目的有以下几点: 测试群集是否能正常故障转移 测试修改端口是否能同步到备节点 测试禁用full-text和Browser服务 ...

  9. 使用 node-odata 轻松创建基于 OData 协议的 RESTful API

    前言 OData, 相信身为.NET程序员应该不为陌生, 对于他的实现, 之前也有童鞋进行过介绍(见:这里1,这里2). 微软的WCF Data Service即采用的该协议来进行通信, ASP.NE ...

随机推荐

  1. BGP的五种报文六种状态

    BGP的五种报文 Open报文:用于协商BGP参数,包括版本号,AS号等信息.在两个路由器之间建立了TCP会话之后开始交换Open信息以确认是否能形成邻居关系,是TCP建立后发送的第一个信息,类似OS ...

  2. 关于web以及浏览器处理预加载有哪些思考?

    图片等静态资源在使用之前就提前请求资源使用到的时候能从缓存中加载, 提升用户体验页面展示的依赖关系维护

  3. URL转义特定字符

    import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.Charset; // 实例代码 Str ...

  4. jQuery对象的创建

    1.js类库 JavaScript封装了很多的预定义的对象和实用函数,能帮助使用者建立有高难度交互 客户端页面,并且兼容各大浏览器.跑在浏览器,请求服务器 当前比较流行的js库: jquery EXT ...

  5. 以太网在汽车行业中的挑战——灵活的接口及软件使ECU开发不再复杂

    以太网在汽车行业中的挑战--灵活的接口及软件使ECU开发不再复杂 以太网将会在一批新车型中作为一个车载系统网络使用.因此,下一步就是以太网和现有汽车网络技术的集成,包括:CAN.FlexRay.LIN ...

  6. 小记-用canvas完成图像液化(向前变形)过程

    前几天由于团队需要,折腾了一下图像液化的处理过程. 现在来整理一下思路,做个记录. 用到公式如下,网上拿来的 话不多说,上代码 本来想尽量写出点逼格...后来发现怎么写也还是几个function搞定, ...

  7. SQL之创建表

    1.创建表------ (方法一)-------create table Persons(id NUMBER,                                       age NU ...

  8. C#编写一个简易的文件管理器

    编写一个简易的文件管理器,通过本次实验,练习 TreeView.ListView 和SplitContainer 控件的使用,同时熟悉 C#文件系统的操作方法以及 File 类和 Directory类 ...

  9. 新版vue作用域插槽的使用

    2.6开始,作用域插槽的使用有了不同的地方: 作用域插槽的个人理解就是让子组件的数据可以在父组件中使用:  也是一个数据传递的方式了: 不多说,上代码 子组件定义一个插槽,并且定义一个需要传递到父组件 ...

  10. uni-app中实现图片左滑的效果

    template: 1 <view class="my-reg"> 2 <view class="my-regs"> 3 <ima ...