前言
一款 APP 的发布以及新功能的迭代需要经过严格的质量保证,而崩溃性问题是影响 APP 稳定的头号问题。其中,因前端不兼容后端服务数据格式变更而引起的崩溃问题占有一定的比例。这类崩溃问题一般排查难度较大,且利用常规测试方法通常很难有效降低这种类型缺陷的比例。
是否有更好的方式来提前预防数据变更导致的崩溃问题?本文将重点介绍爱奇艺技术产品团队打造的 APP 健壮性测试实践内容。
背景
爱奇艺 APP 拥有丰富的视频资源,需要频繁进行节目上线或者下线、各种活动配置等操作调整。这些内容迭代主要是通过后台管理系统进行,然后下发到 APP 端并在 UI 层展示。在版本功能迭代过程中尽管有大量的、针对性的质量保证方法,但是服务端业务逻辑盘根错节,一些极少用到的功能配置可能在历经多次代码迭代后在最新版本 APP 中出现兼容问题,一些第三方依赖接口可能会因为格式的变化而引发前端 UI 不兼容甚至崩溃,这对于 APP 的健壮性、稳定性提出了很大的挑战。
爱奇艺技术团队对线上历史问题进行总结、对行业内前沿技术进行探索,最终经过多次探讨后设计了一种 APP 健壮性测试方案。团队研发的基础网络库 SDK 对 APP 收到的服务端接口返回进行拦截,从网络层进行数据替换。团队根据历史问题的总结、日常经验的积累提炼出一系列数据组合,当 APP 进入需要测试的页面时,就会去拉取并进行“脏数据”填充,以便尽早发现因数据变更引发的崩溃问题。
测试效果图:从图中可以看到页面中的文字被脏数据修改
技术实现
从上图可以看到:
1)策略配置是一个独立的 Web 化模块,APP 内“脏数据”注入规则都由策略配置控制。
2)APP 内的基础网络库 SDK 模块是一个独立的功能模块,不会对其他功能模块有影响;并具有单独的开关控制,只有开关开启时才对后端返回的数据进行拦截替换。
下面将对实现情况进行具体说明。
一、WEB 策略配置--可视化界面
策略配置的前提是确认页面的哪些接口请求需要进行校验,通常一个页面有非常多的后端请求,每个请求都会带有很多不同类型的参数,对应的返回数据带了大量的 KEY 和 VALUE,数据配置对测试结果尤其重要。丰富的高危“脏数据”才能极大的提升网络数据测试的效果,如果纯手工输入“脏数据“进行测试,人力成本较高,最终我们通过 WEB 可视化界面进行数据策略配置,大幅度减少用户对“脏数据”的设计成本,因此策略配置界面的原则是数据通配、操作简单、策略可复用。
--策略示例图-1
--策略示例图-2
从策略示例图 1、2 可以看到,配置分为二部分:
1)URL 配置:
被测页面的请求 URL,支持域名模糊匹配、多域名同策略、域名参数匹配等。
2)数据配置:
支持单节点、多节点、节点移除/跳过;
支持同类型、非同类型、emoji 表情、#color、null 、空值、object 等。
可视化页面为用户提供多种默认策略,这些默认策略均是测试中提炼出的经验积累,用户仅需配置待测 URL 即可使用,极大地降低操作成本。
二、策略通信原理
鉴于测试的目标覆盖度以及测试任务执行效率两个维度考虑,我们具有两种遍历 JSON 的策略:
1)刷新单个节点进行顺序访问
此策略可以覆盖所有节点检查,根据返回结构,依次替换节点数据。具有节点全覆盖的特点。接口返回数据体量大时耗时会较长,所以此方式适用于 UI 自动化测试。
2)刷新遍历所有节点的全节点访问
此策略每次访问到匹配的 URL 时从列表内随机获取一个脏数据,对原数据进行替换。具有数据随机性强,遍历灵活度高的特点。接口返回数据体量无论大小,各个节点均有机会被替换,所以此方式适用于稳定性测试。
遍历策略开发难点:
任务过程中如有发生崩溃,重启 APP 后遍历执行仍然会在相同的崩溃节点反复测试,这导致测试效率低下后续测试步骤无法继续进行。为了解决这个问题,测试中 SDK 维护一个“脏数据”遍历的访问栈使用非递归遍历,会保存遍历栈到本地,不论是重启还是发生崩溃都可以直接从这个栈里恢复访问进度。
SDK 数据拦截实现:
通过基于 ASM 的 hook 框架编译时指定网络库对应的方法进行 hook 修改网络库的字节码实现拦截,将 JSON 数据按指定规则进行修改,最后将数据返回给网络库,传递到请求网络的业务方,此方法能有效地降低对基础库的侵入性能。
SDK 的特点:
泛用性广:移动端有各种不同的网络库在使用,把拦截网络库的功能独立成一个 library 并适应不同开发团队的技术场景,目前已落地到多个业务线。
非侵入式对接:各业务线通过该 SDK 对接网络库进行数据拦截,原有网络库无任何侵入式修改。
缺陷管理:在业务方使用“脏数据”的过程中发生异常崩溃,SDK 自动捕捉异常信息并投递缺陷给模块的负责人,测试任务将重启 APP 继续测试流程的循环。
三、测试驱动方式
SDK 开关打开后,运行我们的测试应用服务,就可以在 APP 的 UI 页面上进行操作。操作方式包括:自动化测试、稳定性测试、手工测试。
自动化测试(UI 自动化)
我们使用 UI 自动化作为主要的驱动方式之一,UI 自动化可以精准到达被测页面,并进行指定场景接口的返回数据替换测试。
针对健壮性测试的 UI 自动化,无需复杂的步骤,在达到指定页面后,重复触发接口请求。此驱动方式具有编写便利、维护成本低的特点。当被测页面接口返回数据量级较大时,需要耗费较长时间才能达到数据高覆盖的目的,UI 自动化无需值守可以极大降低人力投入。
此方式适用于回归测试、大量数据页面、性能压测等测试场景。
稳定性测试(Monkey 类测试)
为了让 APP 混沌测试覆盖更广,我们将“脏数据”修改方案在稳定性测试中进行实施 , 以低成本实现多页面触达的需求,触发更多页面的后端接口。默认使用全量字段随机注入。
以下是处理逻辑:
根据预埋或者自定义的页面层级访问权重,对 APP 中的页面进行随机访问。在 APP 启动且进入预期页面之前打开 SDK 开关。为了提高修改频率,可以在进入目标页面后适当加入刷新操作(可配置)。期间如触发崩溃问题,则通知 SDK 侧进行日志提取和缺陷提交,随后关闭 SDK,进入下一个循环。
手工测试
特点优势:具备灵活度高、成本低,针对自动化难以涉及的扫码、支付等多种场景;
使用场景:在开发准入、新功能测试中落地,针对新增接口节点进行充分验证;
执行流程:配置策略>安装 APK>进入启动页>填写策略 ID>进入被测页>缺陷分析>自动缺陷管理。
效果收益及未来规划
目前,该技术方案已经推行到多个业务线,在测试过程中召回多个难以发现的缺陷,帮助规避了线上可能出现的崩溃问题;新业务新场景接入便捷,落地投入成本较低,自动化任务几乎零维护;缺陷闭环率达 50%以上,有效提升代码的健壮性和稳定性。
未来,团队计划增加更丰富更多变的服务能力,包括:
1)提升数据节点覆盖的广度和深度;
2)丰富“脏数据”类型与内容形态;
3)接口迭代场景精准匹配,支持数据自动提取解析,针对性测试;
4)支持多台设备并发执行策略的能力,实现分布式数据遍历修改。
本文转载自:爱奇艺技术产品团队(ID:iQIYI-TP)
原文链接:爱奇艺移动端APP健壮性测试的设计与实践
活动推荐:
2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。
评论