Page 115 - 《软件学报》2025年第5期
P. 115

郝蕊 等: 基于事件标记的多粒度结合安卓测试序列约减                                                      2015


                 多研究工作用来收集测试数据或对比测试工具. 但是随机测试对于与程序逻辑有关的操作无法高效生成, 例如示例中
                 改变  server 值操作, 另外, 一些程序也要求进行用户登录才可进行后续操作. 为了发现更丰富、贴合实际的崩溃测试
                 序列, 我们在完全随机的基础上加入了处理程序输入值、用户登录数据等模块, 辅助更高效的发现崩溃测试序列.
                    我们收集了来自       DroidDefects 与 [4]  Droixbench [29] 两个数据集中的测试应用, 它们均提供了安卓应用上的测试
                 崩溃错误, 被很多安卓测试方面的工作采用              [30−35] . 此外, 我们通过对其提供的崩溃错误复现步骤进行分析, 获取了
                 一系列测试输入值. 通过这种方式, 我们最终获得了来自                 7  个应用的  66  个崩溃测试序列, 如表    1  所示, 这些应用来
                 自  GitHub、FDroid  等软件代码管理平台, 包含了日常工具、游戏、新闻媒体等多种应用类型, 其测试序列长度范
                                                                             [18]
                 围为  8–797, 并且包含了用户登录、输入等复杂情景. 在之前的研究工作中, Echo 中仅提供了                    5 个测试序列, Simply-
                 Droid [16] 中虽然提供了  95  个测试序列, 但仅  25  个测试序列来自真实错误, 其余均为变异错误, 相比之下, 我们的数
                 据集不仅包含了更多的真实错误序列, 也反映了更丰富的测试场景.

                                                      表 1 实验数据集

                    应用程序        应用描述      应用版本      API版本            错误类型               序列数     序列长度
                   AntennaPod   播客管理       1.5.0.1    4.4        NoClassDefFoundError     1       75
                   ATimeTracker  时间管理      0.51.2     6.0         NullPointerException    8      64–146
                   ButterKnife  安卓工具       1.0.0      4.4         NullPointerException    3       8–13
                   CampFahrplan  日程浏览      1.32.2     4.4       IllegalArgumentException  7      49–79
                    LibreNews   新闻通知        1.4       6.0         NullPointerException   15      41–124
                                                             ArrayIndexOutOfBoundsException
                   OpenSudoku   数独游戏       1.1.5      6.0         NullPointerException   24      66–797
                    Transistor  广播电台       1.1.5      4.4         IllegalStateException   8      97–350


                 4.2   方法实现
                    对于测试数据收集, 我们采用          Appium  测试框架完成随机测试策略与程序执行状态获取与分析, 我们共支持
                 点击、拖拽、缩放、按键操作、用户等待、输入、设备旋转等多种事件, 为了验证测试序列的可复现性, 我们对
                 每个测试序列重复执行了         5  遍确认其测试结果均可触发程序崩溃.
                    在方法实现方面, 我们利用         Soot [36] 进行软件的基础解析, FlowDroid  [37] 进行静态数据流分析, FlowDroid  是目
                 前对安卓应用进行静态污点分析的最好的工具之一, 已经被很多学术界与工业界的工作采用                               [38−42] , 它完整建模了
                 安卓的控件生命周期, 并且满足上下文敏感、流敏感、对象敏感、域敏感, 可以得到高精度的分析结果. 具体来
                 说, 给定安卓   APK  程序, Soot 首先对程序进行解析获得        Jimple 中间码, FlowDroid  在此中间码基础上进行静态数
                 据流分析, 因此本文方法即可对          Java 源代码进行分析, 也可以在缺乏源代码的情况下对               APK  程序进行分析. 本文
                 实验均在处理器为       Intel i7 8750, 内存为  32 GB, 操作系统为  Windows 10  的计算机完成, 实验语言为  Java.

                 4.3   研究问题
                    为了验证    TREC  的效果, 我们将其与之前的两个最相近的工作进行对比: SimplyDroid              [16] 、ECHO [18] , 这两个工
                 作均提供了源代码, 我们直接采用其默认参数与实现进行实验, 此外, SimplyDroid                  工作提供了    3  个算法版本, 我们
                 采用其工作中介绍的效果最优的           LHDD  方法.
                    在评价指标上我们主要关注           3  个方面的表现: 约减结构正确性、约减序列长度、约减效率. 其中约减结果正
                 确性是指方法能成功找到触发程序崩溃的序列, 这是基础与前提, 此外, 约减算法还应尽可能找到短的触发程序崩
                 溃的序列, 序列越短, 则后续开发者或开发工具在进行错误理解与错误定位时, 需要关注的信息越精简, 无用干扰
                 信息越少. 约减效率则不仅包括搜索最短序列的算法运行时间, 也包括前期对测试序列分析准备时间. 综上, 我们
                 提出了如下    5  个研究问题.
                    ● 研究问题    1: TREC、SimplyDroid、ECHO  约减后的测试序列是否可以正确触发程序崩溃?
                    ● 研究问题    2: TREC  约减后的测试序列是否比其他方法约减后的测试序列更短?
   110   111   112   113   114   115   116   117   118   119   120