InfoQ Geekathon 大模型技术应用创新大赛 了解详情
写点什么

爱奇艺移动端 APP 健壮性测试的设计与实践

  • 2021-05-15
  • 本文字数:2723 字

    阅读完需:约 9 分钟

爱奇艺移动端APP健壮性测试的设计与实践

前言

一款 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(微信同手机号)。

2021-05-15 07:001320

评论

发布
暂无评论
发现更多内容

Log4Shell 漏洞披露已近一年,它对我们还有影响吗?

SEAL安全

Log4Shell 12 月 PK 榜

15年磨一剑,亚马逊云科技数据产品掌门人 Swami 揭秘云原生数据战略的三大关键要素

亚马逊云科技 (Amazon Web Services)

亚马逊云科技

java程序员培训零基础怎么学

小谷哥

面试官:你先回去等通知吧!这个Java岗位我还有机会吗?

钟奕礼

Java java面试 java编程 程序员、

挤破脑袋要进阿里、腾讯的java程序员,去B站不香吗?

钟奕礼

Java 程序员 java面试 java编程

【iOS逆向与安全】iOS插件开发光速入门

小陈

信息安全等级保护的5个级别分别是什么?最高级别是哪个?

行云管家

等保 等级保护

2023来袭,分享500道我收集的Java架构面试题

钟奕礼

Java 程序员 java面试 java编程

手写一个react,看透react运行机制

goClient1992

React

26个月89场Java岗面试,0至3年程序员的入职门槛到底是什么?

钟奕礼

Java 程序员 java面试 java编程

参加前端培训之后能做什么?

小谷哥

大数据培训程序员就业前景如何

小谷哥

react源码分析:实现react时间分片

flyzz177

React

域内用户Hash获取方式总结

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

从今天起真正释放创造力 | Werner Vogels 在 re:Invent 2022带来多项开发者福音

亚马逊云科技 (Amazon Web Services)

亚马逊云科技

盘点 | 4类爆款小游戏开发引擎

FinFish

游戏引擎 小游戏 小游戏开发 微信小游戏 游戏开发引擎

前端培训学习后程序员有什么好的方向吗

小谷哥

react源码分析:深度理解React.Context

flyzz177

React

收到7个offer,用同一个技术套路了多位面试官

钟奕礼

Java java程序员 java面试 java编程

深入React源码揭开渲染更新流程的面纱

goClient1992

React

大数据培训学习的技术基础有哪些

小谷哥

react源码分析:组件的创建和更新

flyzz177

React

Wallys/DR9074E-Qualcomm Atheros QCN9074(QCN9024)/ 4x4 MU-MIMO Dual Band Wireless Module

Cindy-wallys

QCN9074 QCN9024

连阿里P8都赞不绝口的“分布式架构原理设计笔记”到底有多牛

小小怪下士

Java 程序员 分布式 架构设计

带你实现react源码的核心功能

goClient1992

React

Industrial wifi6 Wireless AP/DR AP6018 S AIPQ6010 2T2R 2.4G&5G high power Radio AP

Cindy-wallys

IPQ6010 high power 2.4G&5G

模块一作业

程序员小张

「架构实战营」

一个月面试了3家大厂Java岗,我发现这几个突破点

钟奕礼

Java 程序员 java面试 java编程

如何通过Java将Word转换为PDF

Geek_249eec

Java PDF word

cookie sessionStorage localStorage区别(详解)

达摩

缓存 Web Cookie LocalStorage sessionStorage

面试官:两个JVM的面试题就能证明,你连拿15K都不配

钟奕礼

Java 程序员 java面试 java编程

  • 扫码添加小助手
    领取最新资料包
爱奇艺移动端APP健壮性测试的设计与实践_移动_爱奇艺技术产品团队_InfoQ精选文章