基于接口数据变异的App健壮性测试实践美团技术团队

在移动端App领域,健壮性可以理解为App运行时遭遇环境异常或者输入异常时客户端能够继续正常运行的能力。

对于这些风险,如果App没有处理,理论上都可能会产生展示异常、交互异常、性能、安全等问题,导致用户无法继续使用或在使用过程中产生不好的体验。比如用户操作App下单过程中,API请求出现故障未返回状态码为200的响应,App由于没有获取到预期接口响应的信息而发生崩溃,就会中断用户的使用流程。

在实际的客户端测试执行过程中,测试人员会考虑测试异常输入的场景,但由于成本无法做到无穷尽的测试,同时还存在人工执行遗漏的风险。

从美团App平台业务的历史故障分析中,我们发现:网络请求返回的数据与实现预期不符引发的Crash或核心功能缺失问题导致的故障占比最高,且影响面较广。比如接口返回非预期数据时,客户端处理数据类型转换异常导致闪退,即使5分钟内操作降级仍影响了百万量级的用户。因此美团平台业务App的健壮性测试探索优先从发现网络请求返回数据导致的异常开始。

因此,我们结合通用方案做了一些自定义改造,整体检测方案包含静态检测和动态检测两部分。

下文重点介绍端到端的动态检测方案。

响应体由基本类型数据和复合类型数据组成,相同基本类型的数据可能具备不同的业务语义,需要根据语义的类型做变异规则的区分对待,才能保障业务场景覆盖。

因此,如何保障变异数据构造的全面性和准确性,是我们面临的首要挑战。

要解决数据构造全面性问题,首先要解决页面描述方案,这样才能控制获取基础数据的唯一性。在解决方案中,我们构建了页面描述的特征规则,解决用户视角的页面标识问题。需要的信息包含端信息、页面路由信息、实验策略账号信息、页面标识模块合集等。通过页面请求数据自动录制的方式,自动更新迭代请求数据和页面之间的绑定关系,使得基础数据能够随需求迭代更新,从而通过变异规则构造生成的用例也能够自动更新。

在用例变异生成构造上,对于响应体里的Value设置了语义匹配规则,比如字符串的语义可能代表颜色、页面跳转路由、动静态资源链接(即图片资源数据/视频文件/GIF文件),需要区分特征分别按语义构造异常数据。比如在图片的变异数据构造里,除了需要构造非图片链接情况外,还要考虑不同图片格式、非图片格式以及非合法的图片剪裁格式拼接等场景。

我们对接口返回数据使用脚本做了初步的语义分析,人工二次校正后建立了基本数据类型和语义的映射集合,结合基本数据类型边界值和语义定义了初始的变异规则。然后对历史的线上健壮性问题和线下测试发现的健壮性Bug的变异数据进行整理,作为增补的变异规则。

在自动化测试执行过程中,我们基于App可测性改造提供的能力,对测试场景进行了控制,同时基于布局视图的解析SDK、App异常上报SDK提供的能力,完成了对App异常的通用检测。

伴随着变异规则的丰富,自动生成的数据量级是巨大的,数据的变异组合如果按照全覆盖方式来生成组合数量就是指数级增长。比如对于1种有7种变异取值的变量,如果存在n个此类型变量,就会产生7^n种数据组合,并且在实际业务场景中很多组合情况是没有意义的。

如何在保障用例构造全面性的情况下精简变异构造的用例数,是我们面临的第二个挑战。解决方案包含2个策略:1)数组元素结构一致时,删减构造的用例数;2)结构不完全一致的数组元素,引入编辑距离和并查集算法判断节点相似性,节点不相似,可以在一次数据生成里做合并构造。

我们可以把请求响应的JSON理解成树,第一个解决思路是判断树中节点、路径的相似度,相似节点删减构造。

如果路径、节点相似,可以推测路径即业务逻辑也是一致的,比如页面上的一些列表元素,可能是数据结构对象完全一致数组,如果对每个数组对象中的每个元素进行全用例构造,生成的变异数据量极大,且对业务场景或代码逻辑的增量覆盖有限,因此我们决定将构造逻辑优化,进行删减构造。即假如数组中元素的结构完全一致,那么同含义的字段可以为他们分配不同的变异构造值,然后删减掉无效的构造情况。应用这种方法可以有效降低28%左右的用例构造数量。

如图数组的3个元素中均存在“resourceName”键值对,假如每个键值对有3种变异取值,按照全排列方式进行用例构造将会生成有9份变异数据,在删减构造情况下,可以分别为它们构造一个特定的变异值,这样变异生成用例数量可以从9减少为1。

在对业务接口返回数据的数据结构进行分析后,我们发现在层级越深的场景下,距离根节点越近的两个节点,业务逻辑耦合和结构相似程度越低,它可以进行合并构造,相互逻辑之间不会产生影响,比如有两个键值对,每个键值对的Value有3种变异取值,在合并构造情况下,可以从排列组合的6份数据减少到3份数据。

基于这个个思路,我们在实践中引入了编辑距离和并查集算法,以节点路径为参照,对树的每一层的每两个节点计算编辑距离,生成一个n*n矩阵;同时以树的高度减去节点位于的层数作为权重,修正编辑距离。基于这样的计算,会产生多个编辑距离矩阵。

为了尝试最大化合并构造用例效果,我们把编辑距离做了0,1矩阵转化。其中,由于编辑距离为1的两个节点可能存在业务逻辑耦合关系,必须放在同一个组里分别构造,所以我们把编辑距离大于1的情况转化成了0,最后得到了一个0,1的编辑距离矩阵。

在0,1矩阵情况下,我们使用了图的连通性概念,如果A和B连通,B和C连通,那我们认为A和C连通,转化到这里的概念就是A和B相似,B和C相似,那么A和C相似,它们应该被放在同一个组里分开进行构造,那么在同层元素构造时,我们会从每个分组里取到一个节点,对这些规则进行变异组合构造。

基于以上两个策略进行精简后生成的变异数据量较精简前降低了40%,同时代码覆盖率没有明显变化,并且保持不变的健壮性问题发现能力。

在健壮性工具建设一期里,我们实现了App页面加载展示场景的健壮性问题检测,支持崩溃、卡死和部分功能异常这三类异常检测。另外,基于节点相似性优化变异数据生成策略能够在保持效果不变的情况下有效控制测试时长,但是否有更优的合并算法和推荐算法,还需要更多的尝试。

在后续工具的迭代还会继续围绕异常构造和异常检测这两个方向,支持更丰富的构造能力和检测能力,以及更高效的构造效率。短期建设上,我们将会从业务视角出发丰富自动化变异数据生成建模,完善客户端异常通用异常检测能力,完成通用前后端交互的数据构造类型(比如:长连接消息)的覆盖;长期建设上,需要支持更丰富的数据和环境构造能力,通过智能化用例生成,提升测试效率。

Q1:节点相似的判断依据是什么?

A:从实际的response分析来说,两个节点的路径完全相似就是从根节点到最终的叶子节点上,它们的路径命名完全相似,数组里两个对象的结构完全一样。

Q2:用例的生成能举个例子吗?

A:比如颜色色值的格式是#+6位字符,通常运营配置会出现的情况是忘记添加#,或色值复制中少了一位。在这种情况下,我们会构造一个色值,比如没有返回#、色值位数不对、色值添加透明度,把这种场景作为构造情况,在配置里添加上,最后用代码生成。

Q3:健壮性平时执行的频率是什么样的?

A:第一个基于需求维度,需求维度需要人工触发;第二个基于变更维度,当组件发生变更时,可以关联到这段代码或者组件变更的页面,然后触发页面对应的健壮性测试,执行频率会受到组件变更频率的影响;第三个在回归测试时,App的回归测试两周一次,我们会把所有页面以及它关联的所有的用例都执行一次。

Q4:对于暴露给前端开发的接口,大部分是人为调用参数的变化,随机性相对比较高,对于必填和非必填参数如何确认用例的范围?

A:目前我们在实现的方案里,没有区分参数是必填参数还是非必填参数,所以对于整个数据接口返回里的所有结果都会进行构造,产生的问题是对于非必返回的参数可能产生的问题,到底是否是需要解决的问题,这部分目前通过运营手段做确认。

Q5:首页可能调用10个接口,然后针对每个字段都进行异常验证吗?

A:对于首页关联的接口,我们在接口请求、录制过程中和录制完数据后,会对接口进行确认到底有哪些接口是我们需要验证的,这是一次性的成本,录制完成后,会对每个字段都进行异常验证,当然会有一些黑白名单的设置。

Q6:对色号这种情况有一种生成规则嘛,这个规则是怎么制定?

Q7:执行的时候,如何知道页面对应哪些规则提前配置?

A:执行时,在测试接入过程中有一个配置过程,它不是配置这个页面和接口的关联关系,而是配置我们要测试哪些页面,自动触发自动化录制过程,就是到这个页面时,会触发哪些接口请求,生成这个页面和这个接口请求的对应关系,给到对应的配置人做确认,保证哪些接口是真正可能想要构造的,哪些接口不需要构造,最后以这个为基准测试,基于录制过程,比如业务迭代里面产生了新接口,我们在录制中能够感知到它关联的接口发生了变化,在发生变化时发消息给对应的测试提交人/负责人,TA确认这条规则放到黑名单里还是更新到需要构造的接口里。

Q8:是否有做页面显示的一个校验?怎么做的?

A:目前我们在页面里的模块做了“是否展示”校验,基于当前集成到美团的可测性SDK,这个SDK会获取到当前页面是否渲染里是否展示了对应模块的信息,通过请求把对应模块描述传给SDK,通过返回来校验是否展示。

THE END
1.统计知识数据分析4大段位,你在哪一层?n 即使互联网公司,100人以内的公司也不会专门设置数据分析师,除非是专门做大数据的公司。那么数据需求一般有产品经理,运营人员,或开发人员兼着做数据相关工作。 >100人 100人以上的公司,随着数据需求增加,会专门设置数据部门。数据部门是一个支持部门,完成什https://mp.weixin.qq.com/s?__biz=Mzg4NTM2NTI5Ng==&mid=2247599656&idx=3&sn=655cd5814ab1e32cb68ba80be623ec27&chksm=ceb10e48a3592e1514a9d83f8ff122d7e045dbf6fcc151ebf08f78c508d9b923b45296ebd349&scene=27
2.如何分析各类时长数据?后侵入时间数据集怎么计算服务请求的响应时长 缺陷修复的时长 问题的解决时长 开发响应周期 流动时间 前置时间 故障间隔时间 服务恢复时间 部署时长 无论关注对象是谁,无论度量指标叫什么名字,它的本质就是就是时间的长短,在定义与分析时长的数据时有哪些注意事项呢?我简单归纳如下: 时长https://blog.csdn.net/dylanren/article/details/142988323
3.数据分析常见术语是衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。在许多实际问题中,研究方差即偏离程度有着重要意义。方差是衡量源数据和期望值相差的度量值。 https://meta.ecnu.edu.cn/76/b3/c35753a423603/page.htm
4.万文长字带你搞懂JTAG的门门道道专业集成电路测试网在板级测试时,可以在模式选择的控制下,构成一条就集成电路边界绕行的移位寄存器链,对板内集成电路的所有引脚进行扫描,通过将测试数据串行输入到该寄存器链的方法,检查发现印刷电路板上的器件焊接故障和板内连接故障,极大地方便了系统电路的调试。IEEE114911标准的推广应用引起测试设备和测试系统的重大变革,边界扫描测试技http://www.ictest8.com/a/Principle/2023/08/JTAG.html
5.连江县教师进修学校附属幼儿园青塘湖分园2022增班教玩具设备及④供应商根据谈判小组的要求,在谈判过程中以纸质方式签署确认并提交的澄清或说明、解决方案、图纸图表以及最后报价等资料均为补充响应文件,谈判小组将此部分内容通过扫描或拍照或数据录入或附件上传等形式提交到电子平台系统,应保持两者内容一致,并作为补充电子响应文件进行评审。相关纸质响应文件应当存档保留,做为监督或核验http://zfcg.fuzhou.gov.cn/upload/document/20220527/10d18bad615b47489e1f887488d9b073.html
6.电脑硬件知识大全(实用)属于损耗品,跟个人喜好有关系,相对没有什么技术含量。 以上就是电脑硬件的组成部分,对于想学习电脑硬件的朋友,可以详细看看小编整理的电脑硬件知识。 电脑硬件知识大全2 主板就是个平台,把CPU,内存,显卡,硬盘,光驱通过数据线或者直接安装来组成一个工作整体。CPU相当于人的大脑,发出各种指令来协调各个部分的工作,内存https://www.oh100.com/peixun/yingjianweihu/478103.html
7.MySQL查询数据库响应时长详解作为一名测试工程师,在性能测试中,查询数据库的响应时长是一个重要指标。MySQL 提供了多种方法来监控和优化查询性能。本文将详细介绍如何使用 MySQL 的内置功能和工具来查询数据库响应时长,并分享一些性能优化的技巧。 启用查询日志 开启慢查询日志 慢查询日志用于记录执行时间超过指定阈值的 SQL 查询,默认情况下是关闭https://maimai.cn/article/detail?fid=1836927138&efid=7muk2UZMSVXehhdkgB8kcQ
8.CISSP:错题汇总D.当传输未正确加密时保密性违反可能发生javascript:void(null) 2:STRIDE通常用于评估针对应用程序或操作系统的威胁有关,下列哪一项不包括STRIDE元素? D A.欺骗 B.权限提升 C.否认 D.披露 解析:信息披露 不等于披露 3:下列哪一项是机密数据的最低军事数据分类 B https://www.jianshu.com/p/d216171e7d2e
9.最全的前端性能定位总结全栈前端精选长任务(Long Task) :当一个任务执行时间超过 50ms 时消耗到的任务 (50ms 阈值是从 RAIL 模型总结出来的结论,这个是 google 研究用户感知得出的结论,类似用户的感知/耐心的阈值,超过这个阈值的任务,用户会感知到页面的卡顿) TTI (Time To Internative) :从页面开始到它的主要子资源加载到能够快速地响应用户输入https://www.shangyexinzhi.com/article/4580576.html
10.抖店App上线客服数据透传快捷短语功能客服数据透传是飞鸽在【抖店App-接待】页展示了首次响应时长、平均响应时长、3分钟回复率(会话)、不满意率的实时数据,客服可以在抖店App上随时查看客服数据并且接收数据警示,帮助客服实时评估回复效率,快速响应买家进线! 根据《商家体验分规范》规定,飞鸽IM客服系统的近90天人工客服会话量中,每天8-23点,3分钟人工https://school.jinritemai.com/doudian/wap/article/aHWrB32aEzDM
11.DataWorks阿里云现在的api接口响应时长有标准规范吗?问答在阿里云 DataWorks 中,API 接口的响应时长是有标准规范的。一般来说,API 接口的响应时长应该在数百毫秒以内,具体时间取决于接口的复杂度、数据量大小、网络延迟等因素。在运行过程中,如果接口的响应时长超过了正常范围,可能会影响用户的使用体验和数据处理效率。为了确保 API 接口的响应时长符合标准规范,阿里云 Datahttps://developer.aliyun.com/ask/531136
12.抖音商家要如何解读客服分析看板数据?抖音的客服分析看板支持商家查看最新客服水平概况,筛选时间段查看近期趋势,具体指标包括:三分钟平均回复率、接起率、平均响应时长、平均等待时长等客服效率指标,用户咨询量、转人工接待量、人工已接待量等客服量指标,客服销售额及满意率等用户指标。商家可实时监控以上关键数据指标判断当前客服水平,及时监控指标变化趋势来https://www.shuaishou.com/school/infos55035.html
13.第2章运行时问题(SunManagementCenter4.0发行说明)当被监视代理的数量很多(比如说超过 100)且性能数据也很多时,生成最近七天数据的报告会花费很长时间。七天时限是指数据库中保存最小细节级别的历史数据的日期到当前日期的时间段。最小的细节级别是小时。所以,该报告需要数据库来检索最大量的数据。数据大小会随着所请求的数据属性数量的增多而增加。八天给数据库带来https://docs.oracle.com/cd/E19957-01/820-3709/6nf7n3qbc/index.html
14.Nginx缓存详解(二)之服务端缓存腾讯云开发者社区proxy cache属于服务端缓存,主要实现 nginx服务器对客户端数据请求的快速响应。nginx 服务器在接收到被代理服务器的响应数据之后,一方面将数据传递给客户端,另一方面根据proxy cache的配置将这些数据缓存到本地硬盘上。当客户端再次访问相同的数据时,nginx服务器直接从硬盘检索到相应的数据返回给用户,从而减少与被代理服务https://cloud.tencent.com/developer/article/1825465
15.架构必看:12306抢票亿级流量架构演进(图解+秒懂+史上最全)放票时 高并发的下单集中在一起,形成请求高峰(类似于秒杀),请求导致订单 / 电子客 票数据库负载过高,引起交易响应时间过长,造成 AS 以及 inetis 的交易线程池拥堵。 下单长时间不响应,同一次购买,用户会反复重试,从而加剧拥堵。 由于响应时间过程,用户进而反复重试,一次操作变成多次,操作此时倍数增长,进一步 造成https://blog.51cto.com/u_15127678/4565654