引用:S. R. Choudhary, A. Gorla, and A. Orso. Automated Test Input Generation for Android: Are We There Yet? In 30th IEEE/ACM International Conference on Automated Software Engineering (ASE 2015), 2015.
摘要:
同所有软件一样,移动应用程序(Apps)必须进行全面的测试,以确保其具有开发者预期的行为和表现。因此,近年来,研究人员和从业人员都开始研究移动应用程序自动化测试的方法。特别是,由于Android的开源特性及其巨大的市场占比,已有大量针对Android应用程序测试输入(通常是GUI事件,如点击、滑动、输入)生成工具的研究。目前,有许多这类工具,它们有着不同的测试输入生成方式、测试策略以及不同的特定启发式方法。为了更好地理解这些现有方法的优点和缺点,并了解如何提升工具的效果,我们对Android现有的主要测试输入生成工具进行了全面的比较。我们根据四个指标评估这些工具的有效性:易用性,多平台兼容性,代码覆盖率以及检测故障的能力。我们的结果清晰地展示了Android应用程序输入生成的***技术,并确定了未来的研究方向,如果经过适当地研究,可以为Android带来更有效和高效的测试工具。
引言:
现有的许多自动化测试输入生成技术,它们具有不同的输入生成方式、测试策略,以及具体启发式方法。然而,目前尚不清楚这些不同方法的优点和缺点是什么,它们在一般情况下效果如何,以及它们是否需要改进,如何改进。
为了回答这些问题,我们提出了一个针对Android现有测试输入生成技术的比较研究.1该研究有两个目标。***个目标是评估这些技术(和相应的工具),对它们进行比较,评估其可能更适合于哪种测试环境(例如,应用类型)。我们的第二个目标是更好地理解Android测试输入生成中涉及的一般权衡(tradeoffs),并确定可以进行改进的现有技术或定义新技术。
工具介绍:
Android测试输入生成工具根据其不同的测试策略可以分为以下3类:
随机测试策略:
基于随机测试策略的输入生成器的优点是它们可以高效地生成事件,这使得它们特别适合于压力测试。它们的主要缺点是随机策略几乎不能产生特定的输入。此外,这些工具不知道已经涵盖了应用程序的多少行为,因此可能会产生冗余事件。***,它们没有测试完成的停止标准,而是采用手动指定的超时。
使用此策略的工具:Monkey,Dynodroid,Null intent fuzzer,Intent Fuzzer,DroidFuzzer。
基于模型的测试策略:
一些Android测试工具构建并使用一个应用程序的GUI模型来生成事件并系统地测试应用程序的行为。这些模型通常是有限状态机,应用程序的Activity作为状态,GUI事件作为转换。一些工具通过区分Activity状态来构建精确模型(例如,具有启用和禁用按钮的相同Activity将被表示为两个单独的状态)。大多数工具动态地构建这样的模型,并且当生成的所有事件到达的都是已有状态时停止测试。
使用此策略的工具:GUIRipper,ORBIT,A3E-Depth-First,SwiftHand,PUMA
系统的测试策略:
应用程序的部分行为只能由特定的输入来触发,这就是为什么一些Android测试工具使用更复杂的技术(如符号执行和进化算法)来指导测试之前未被覆盖到的代码。对于随机策略无法触发的应用程序行为,使用系统的测试策略具有明显的优势。然而,与使用随机策略的工具相比,这些工具的可扩展性要低得多。
使用此策略的工具:A3E-Targeted,EvoDroid,ACTEve,JPF-Android
实证研究:
实验使用4个指标来评估测试输入生成工具:易用性,多平台兼容性,代码覆盖率以及检测故障的能力。我们一共选用了68个Android移动应用程序,使用VirtualBox来提供实验用的虚拟机,每个虚拟机配置为2核6GB RAM,并配置了三种Android版本的虚拟机,分别对应的SDK版本是:10 (Gingerbread),16 (Ice-cream sandwich)核19 (Kitkat)。对于每一个工具在每个应用程序上的一次运行,我们都会重置一次虚拟机,并重复10次,取实验数据的均值。
对于每一次运行,我们使用Emma (http://emma.sourceforge.net/)收集代码覆盖率。我们通过收集虚拟机测试过程中的log(也称为logcat)来获取应用程序故障,并且我们会人工审核这些应用程序故障的真实性。
1.易用性和多平台兼容性
表2报告该工具是否开箱即用(NO EFFORT),是否需要一些努力(LITTLE EFFORT),无论是正确配置还是修复小问题,或是否需要付出巨大努力(MAJOR EFFORT)。截至目前,我们只是报告我们安装每个工具的经验。
2.代码覆盖率和故障检测能力
从图1中,我们可以看到,平均而言,Dynodroid和Monkey的表现优于其他工具,其次是ACTEve。其他三个工具(即A3E,GUIRipper和PUMA)实现了相当低的覆盖水平。尽管如此,即使那些平均达到低覆盖率的工具也可以达到一些应用程序的非常高的覆盖率(大约80%)。我们手动调查了这些应用程序,发现它们是最简单的应用程序。
图1. 各工具在各应用程序上运行10次的覆盖率差异 图2. 各工具覆盖率随时间的变化
图2显示所有工具在几分钟内(5到10之间)达到***覆盖范围,唯一的例外是GUIRipper。 造成这种差异的可能原因是GUIRipper经常从其初始状态重新启动测试,此操作比较耗时。 (这实际上是SwiftHand通过实施限制重启次数的测试策略来解决的主要问题。)
图3显示故障中只有少数涉及自定义异常(即,在测试中的应用程序中声明的异常)。其中绝大多数导致标准Java异常,其中最常见的是空指针异常。
总结:
在本文中,我们提出了Android的主要现有测试输入生成工具(和相应的技术)的比较研究。 我们根据四个标准评估了这些工具:易用性,Android框架兼容性,实现的代码覆盖率和故障检测能力。根据这一比较结果,我们确定并讨论了不同技术的优缺点,并强调了该领域未来研究的潜在方向。
致谢
此文由南京大学软件学院2018级硕士田元汉翻译转述。