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

2018                                                       软件学报  2025  年第  36  卷第  5  期


                   e 47  由于未造成  GUI 界面的跳转变化被其忽略, 导致其约减后路径无法触发崩溃. SimplyDroid                算法约减后的结
                 件
                 果中有   22  个测试序列无法触发崩溃, 达到了总序列数的             33%, 通过对其无法正确约减的序列进行分析, 我们发现
                 其在  Activity  层次进行抽象, 导致约减策略过于粗略, 很多事件被合并到一起进行验证, 程序无法崩溃时则直接忽
                 略这些事件, 导致其中一些原本对触发程序崩溃有作用的关键事件被去除, 例如序列                           5  来自  ATimeTracker 应用,
                 在此序列中, 其触发崩溃的操作为创建活动并打开设置, 将其                  sound  属性从  disabled  切换为  enabled, 然后返回活动
                 列表并点击创建的活动, 其中切换           sound  属性的步骤仅改变了     sound  控件的状态, 而由于    SimplyDroid  在  Activity
                 层次进行建模, 忽略了此关键步骤, 导致其约减结果无法触发崩溃. 我们的方法                       TREC  则对所有的测试序列均可返
                 回正确触发程序崩溃的结果.

                 4.4.2    研究问题  2: 约减序列长度分析
                    表  2  中右侧第  3、6、9  列给出了每个算法对各个测试序列约减后的序列长度. 由表格可以看出, 在                       ECHO  给
                 出的测试序列能够触发崩溃的情况下, 仍无法保证其给出的是最短测试序列. 例如对于序列                              44, ECHO  约减后序
                 列长度为   35, 而  TREC  和  SimplyDroid  则分别给出了长度为  14  和  17  的测试序列. 这是因为  ECHO  仅仅在控件层
                 次进行约减, 抽象粒度较低, 当测试序列一直在同一               Activity  中进行细微探索时, 导致测试状态跳转图中最短路径
                 也很长, ECHO  生成的测试序列也会很长. 而          SimplyDroid  本身在  Activity  层面进行抽象、TREC  采用控件与页面
                 布局结合的方式进行抽象, 均可规避这个问题.
                    对比  SimplyDroid  与  TREC  的约减结果, 在  57  个测试序列上, TREC  约减后的序列长度比        SimplyDroid  得到
                 的结果更短或相等, 占到总序列的          86%, 而在这其中二者给出的序列长度相差大于              3  的达到了  30  个. 此外, 对于标
                 号  57–60  的  4  个序列, SimpyDroid  给出的序列仍包括几十甚至上百个事件, 与        TREC  给出序列长度相差      10  倍以
                 上, 通过进一步分析发现, 此缺陷来源于           Transistor 应用, 其是一款广播电台收听与管理应用, 其崩溃触发操作序列
                 包括了应用切换、输入等复杂操作, 且包括了对创建的电台的图标切换操作, 此操作无法在                              Activity  层次上进行
                 体现, 导致  SimplyDroid  无法有效约减, 约减后序列仍旧包括很多冗余, 我们认为在这种情况下                    SimplyDroid  给出
                 的测试序列对开发者进行后续的测试理解或复现没有任何帮助.
                    TREC  仅在  10 个  (15%) 上生成了更长的测试序列, 而在这其中二者给出的序列长度相差大于                  3 的仅有  3 个  (序
                 列  34、40、43), 经过对这些序列进行分析, 我们发现这           3  个案例均来自    OpenSudoKu  游戏软件, 包括了简单、中
                 等、复杂这    3  个难度的数独游戏界面, 它们均采用了相同的布局结构, 导致                 TREC  在布局粒度上约减时无法区分.
                 此外, TREC  在这  3  个测试序列的约减结果长度分别为          14、15、19, 约减掉了原序列的       82%、83%、82%, 我们认
                 为此约减结果已经足够精简, 可以辅助开发者进行后续测试理解或复现.

                 4.4.3    研究问题  3: 约减效率分析
                    表  2  中右侧第  4、7、10–12  行分别给出了    ECHO、SimplyDroid、TREC   的约减时间, 其中标记时间为         TREC
                 对每个事件进行标记花费的时间, 约减时间代表了具体约减算法执行时间. 由表格可以看出, 在                              ECHO  能够成功
                 约减的情况下, 其与     TREC  花费的时间相差不大, 我们进行了二者运行时间的配对                 t 检验, 其显著性   p 值为  0.072 39,
                 代表二者之间没有显著差别, 这也与二者均是先发现平凡最短路径的设计策略相匹配.
                    对于  SimplyDroid, 其在  58  个测试序列上的约减时间均高于        TREC, 占到了总序列的     87.88%, 而对于其能成功
                 约减的序列, TREC    则在  36  个案例上能在更短时间内约减, 占到了总成功序列的                81.82%. 此外我们计算了二者在
                 成功案例上的配对       t 检验, 其结果为   0.007 9, 说明  TREC  约减效率明显优于   SimplyDroid  方法.
                    为了更直观地展示二者的区别, 我们计算出二者在每个测试序列上的总执行时间相差数值, 并绘制了柱状图,
                 其结果展示在图      3  中, 其横坐标为测试序列标号, 纵坐标为运行时间差, 数值为正表示                 TREC  约减效率更高, 此外,
                 黄色柱形代表     SimplyDroid  在此测试序列上的约减结果无法触发测试崩溃. 从图              3  可以看出在绝大多数测试序列
                 上, TREC  的约减时间均明显小于        SimplyDroid, 其中很多测试序列二者相差时间超过             1 h, 二者最高时间相差
                 1 308.52 min, 超过  21 h. 此外, 二者时间相差超过  1 h  的序列中, SimplyDroid  在绝大多数案例上均无法成功约减,
                 这严重限制了其在实际使用的价值, 开发者可能等待                 1 h  仍无法得到可成功触发崩溃的约减结果. 例如序列              37  源
                 于  OpenSudoKu  应用, 包括了编辑单个数独游戏名称然后取消、删除单个数组游戏等操作, 这些操作由于均在弹
   113   114   115   116   117   118   119   120   121   122   123