作者:华东师范大学软件学院苏亭教授、博士生孙静翎
移动终端设备操作系统(如安卓、苹果、鸿蒙等)提供了很多用户可更改的系统设置选项(例如网络、定位、应用权限、消息勿扰等)。当这些系统设置被用户更改时,运行于移动设备上的移动应用软件(以下简称App)也可能会受到影响,需要及时调整自身行为,做出主动地自适应。比如,当用户关闭5G网络再切换到Wi-Fi网络、或授权/撤销某个应用的特定权限时,App都应该主动、正确地调整其行为。然而,由于上述这些系统设置种类繁多(以安卓系统为例,其包含9大类系统设置,近百种不同的设置选项选项)、并且可随时被用户更改(以安卓系统为例,用户可通过系统自带的Settings应用进行更改),很容易导致App产生一些非预期的功能错误(如程序崩溃、业务逻辑出错等)。
事实上,这类由于系统配置变更引入的软件错误(以下简称设置缺陷)十分普遍:基于对开源社区GitHub上180个典型App的1074个设置缺陷分析,我们发现95%的App存在设置缺陷,其中约71%的设置缺陷导致了(非崩溃的)业务逻辑错误(如软件功能失效)。然而,由于配置空间大、且缺乏恰当的测试预言(Test Oracle),现有的自动化App测试方法和工具很难检测出这些设置缺陷。
2. 真实的设置缺陷案例
下图给出了某邮箱App的一个真实的设置缺陷(为了方便展示,我们对App页面和错误触发路径做了简化)。
图 1给出了该邮箱App中“删除日程“的功能场景:用户进入“Calendar“功能模块,创建”group meeting”这一日程,然后长按该日程,选择“Delete“删除该日程,该日程可以被正常删除掉。
然而,当我们变更App的日历权限后,该邮箱App中“删除日程“的功能场景出错了(如图 2所示):当我们先撤销该邮箱App的日历权限(对应Revoke Permission),然后重新授予日历权限(该邮箱App自己会弹出一个权限请求框,对应Allow Permission)后,执行原先的“删除日程“的功能场景,用户永远无法删除之前创建的这一日程“Group Meeting”,造成了用户的困扰。
3. 解决方案和效果
为了系统性地解决上述设置缺陷问题,华东师范大学研究团队(https://mobile-app-analysis.github.io/)与字节跳动软件工程研究团队(Dev Infra Research Center,https://se-research.bytedance.com/)展开了一年多的合作研究,利用蜕变测试方法(Metamorphic Testing)实现了一种针对移动应用软件设置缺陷的自动化检测技术,并将该技术应用于对头部应用抖音产品的测试中。在将近8个月时间内,对抖音23个待发布版本的持续测试中,总计发现了48个有效的设置缺陷,其中高优先级缺陷占18个,近一半的设置缺陷已经被抖音工程师修复(见图 3)。目前,该项基于蜕变测试思想的设置缺陷检测技术已经集成在字节官方App测试工具平台中,作为了自动断言Auto Assertion(AA)模块算法的一部分(我们在后面会详细介绍技术原理)。
事实上,除了在抖音中取得良好的测试效果外,该项基于蜕变测试的测试技术在对其他头部应用(如微信、支付宝香港钱包、QQ邮箱、剪映等)的快速测试中,也找到了十余个真实设置缺陷(其中发现的个别设置缺陷可导致用户的语音和视频信息的泄漏,均已经汇报给对应App企业进行了修复)。
蜕变测试是一种用来解决“测试预言问题”的软件测试方法。其关键思想是利用种子测试输入与其对应的变异的测试输入这两者在测试输出上所满足的特定关系(称为蜕变关系)来检测软件错误。例如,一个经典的例子为利用蜕变测试验证sin(x)函数的实现正确性。为了验证sin(x)正弦函数的实现是否正确,可以利用"sin (π − x) = sin x"这一蜕变关系,实现测试输入的自动生成和测试结果的自动验证。假设种子测试输入x为1.234,即使我们不知道sin(1.234)的具体输出,但依然可以构造一个变异的测试输入y=π−1.234,然后判断种子测试输入和变异测试输入产生的输出是否一致(即判断sin(1.234)是否与sin(π−1.234)是否相等),如果输出不一致,则当前sin(x)的实现存在错误。在实际应用中,蜕变关系并不一定是要求是严格的数学上的“相等”关系(如上面例子中的"sin (π − x) = sin x"),也可以是其他的逻辑关系(如“不相等”,“小于”等,取决于具体的问题场景)。
为了解决设置缺陷,我们的想法是利用上述蜕变测试方法解决测试输入生成和预言问题。我们提出了一种设置敏感的蜕变测试方法 (如下图所示) ,具体定义如下:设e为一个GUI事件(如点击、输入、滑动),设e.w为该GUI事件的目标控件(如按钮、输入框、图片),设ℓ为被测应用的一个GUI界面。
假设下列公式是一个种子测试序列:
之后,通过在种子测试序列中插入一个事件对 <e_c,e_u> 可以获得一个变异的测试序列 E′ 其中 e_c 更改了某一个设置,而 e_u 是将该设置改回原先的值。于是,我们通过检查种子测试序列 E 和变异测试序列
图 4 设置敏感的蜕变测试方法的基本原理图
图 5 针对某邮箱App“删除日程”功能场景的设置缺陷测试过程
目前,此项基于蜕变测试思想的设置缺陷检测技术已经集成在字节官方App测试工具平台中,作为自动断言Auto Assertion(AA)算法模块中的一部分(如图 6所示)。
图 6 字节FastBot测试平台中自动断言(AA)模块架构
具体来说,该技术的整体工作流程为(如图 7所示):该技术在两个相同型号的设备 A 和 B 上并行运行相同版本的被测App。在测试期间,该技术在设备 A 上即时生成种子测试用例,并同时在设备 B 上重放注入了设置变更的相同种子测试用例(即变异测试用例)。该技术在如下循环中不断迭代:(1)获取设备 A 上 App 的当前 GUI 页面,(2)从GUI页面中随机选择一个可执行的控件并生成一个UI事件,(3)分别在这两个设备 A 和B上执行该UI事件。这种即时策略为在运行时注入设置更改提供了灵活性,从而避免破坏种子测试的可执行性。这里,我们要求设备 A 和 B 型号相同(例如相同的 Android 版本和屏幕尺寸),是为了确保测试环境尽可能相同,减少测试过程中的不确定环境因素带来的干扰。在上述测试过程中,该技术将随机注入一对事件到设备B上。在执行每个UI事件后,该技术会从设备 A 和 B 中分别抓取 GUI 页面,并检查设备 B 的UI页面是否与设备 A 的页面一致(同时也会监控可能的App崩溃错误)。如果该技术发现了GUI页面不一致,就会生成一份错误报告,其中包括已执行的UI事件序列(即触发设置缺陷的测试用例)和GUI页面不一致的位置,帮助开发人员快速定位和修复问题。
图 7 基于蜕变测试的设置缺陷检测技术工作流程图
5. 更多信息
目前该项技术的研究论文已经正式发表在2023年4月的软件工程期刊IEEE Transactions on Software Engineering上。更多关于该项技术和研究工作的细节请参考该论文:
"Characterizing and Finding System Setting-Related Defects in Android Apps". Jingling Sun, Ting Su, Kai Liu, Chao Peng, Zhao Zhang, Geguang Pu, Tao Xie, Zhendong Su. IEEE Transactions on Software Engineering (TSE), 2023. https://ieeexplore.ieee.org/document/10064083/ (or https://tingsu.github.io/files/TSE23-SetDroid.pdf)
孙静翎(华东师范大学博士生):https://jinglingsun.github.io/