英语原文共 12 页,剩余内容已隐藏,支付完成后下载完整资料
Android自动化测试输入生成时代:这个时代到了吗?
摘要 - 像所有软件一样,移动应用程序(“应用程序”)必须经过充分测试,以确保其行为正确。因此,近年来,研究人员和从业者都开始研究自动化应用测试的方法。特别是,由于Android的开源性质和其在市场上的大部分份额,已经对在Android操作系统上运行的应用的输入生成技术进行了大量研究。在这个时间点上,实际上在文献中存在许多这样的技术,它们在它们生成输入的方式,他们用于探索被测试的应用程序的行为的策略,以及他们使用的具体启发式不同。为了更好地了解这些现有方法的优势和弱点,并获得有关如何使其更有效的方法的一般洞察,在本文中,我们对Android的主要现有测试输入生成工具进行了彻底比较。在我们的比较中,我们根据以下四个指标评估这些工具及其相应技术的有效性:易用性,在多个平台上工作的能力,代码覆盖率和检测故障的能力。我们的结果为Android应用程序的输入生成提供了一个清晰的图片,并确定未来的研究方向,如果适当调查,可以导致更有效和高效的测试工具Android。
一.引言
在过去几年中,我们目睹了移动应用(或简称“应用”)业务的令人难以置信的增长。与所有软件一样,应用程序必须经过充分测试,以确保其行为正确。因此,毫不奇怪,随着这种增长,对自动测试移动应用程序的工具的需求也在增长,并且在这一领域的研究量也在增长。大多数研究人员和从业者在这方面的努力针对Android平台,有多种原因。首先,Android目前在移动市场占有最大份额,这使得这个平台对行业从业者非常有吸引力。第二,由于设备和操作系统版本的分裂,Android应用程序经常遭受跨平台和跨版本不兼容性,这使得这些应用程序的手动测试特别昂贵,因此,特别值得自动化。第三,Android平台及其相关技术的开源性质使其成为学术研究人员更合适的目标,他们可以完全访问应用和底层操作系统。此外,Android应用程序是用Java开发的。即使它们被编译成Dalvik字节码,这与Java字节码明显不同,但是存在多个框架可以将Dalvik字节码转换为更加熟悉和更易于分析和测试的格式(例如,Java Bytecode [26],Jimple [7 ]和smali [29])。由于所有这些原因,在Android应用程序的静态分析和测试方面进行了大量的研究。 在测试领域,特别是,研究人员开发了技术和工具来针对最昂贵的软件测试活动之一:测试输入生成。 实际上,在现在的文献中有许多这些技术,它们在产生输入的方式,他们用于探索被测试的应用程序的行为的策略,以及他们使用的具体启发式不同。 然而,仍然不清楚这些不同方法的优点和弱点是什么,它们在一般情况下和彼此之间的有效性,以及如何和如何改进。
为了回答这些问题,在本文中,我们提出了一个现有的主要现有工具支持的测试输入生成技术Android.1的比较研究该研究的目标是双重的。 第一个目标是评估这些技术(和相应的工具)以了解它们如何相互比较,以及哪些技术可能在哪个上下文(例如,应用的类型)中更合适。我们的第二个目标是更好地了解Android测试输入生成中涉及的一般权衡,并确定可以改进现有技术或定义新技术的方法。在我们的比较中,我们运行了60多个真实应用程序所考虑的工具,同时评估了它们在多个维度上的有用性:易于使用,在多个平台上工作的能力,代码覆盖率和故障检测。我们通过评估安装和运行工具的难度以及使用它们涉及的手工工作量来评估工具的易用性。虽然这是一个非常实用的方面,而且通常在研究原型中只受到有限的注意,(合理)易用性可以使复制研究成为可能,并允许其他研究人员在现有技术和工具的基础上。由于Android生态系统的碎片化,所考虑的工具的另一个重要特性是它们在不同的硬件和软件配置上工作的能力。因此,我们通过在不同版本的Android环境中运行这些工具来考虑和评估这些工具。我们考虑覆盖,因为测试输入生成工具应该能够尽可能多地探索测试中的应用程序的行为,代码覆盖通常用作代理。因此,我们使用这些工具为每个应用程序生成测试输入,并测量每个应用程序上不同工具实现的覆盖率。虽然代码覆盖是一个很好理解和常用的措施,它通常是行为的粗略近似。最终,测试输入生成工具应该生成有效地显示被测代码中的故障的输入。因此,在我们的研究中,我们还测量了工具生成的输入中有多少导致在所考虑的应用程序中的一个或多个失败(被识别为未捕获异常)。 我们还执行了额外的手动和自动检查,以确保抛出的异常表示实际故障。
我们的研究结果表明,虽然我们研究的现有技术和工具是有效的,他们也有弱点和限制,并有改进的余地。 在我们的结果分析中,我们讨论这些限制和确定未来的研究方向,如果适当调查,可以导致更有效和高效的测试工具Android。 为了允许其他研究人员复制我们的研究并建立我们的工作,我们将所有的实验基础设施和数据公开在http://www.cc.gatech.edu/~orso/software/androtest.
本文的主要贡献是:bull;针对Android应用程序的主要现有工具支持的测试输入生成技术的调查。
bull;对超过60个真实世界应用程序执行的此类技术和工具的广泛比较研究。
bull;对结果的分析,讨论所考虑的不同技术的优势和弱点,并突出该领域未来可能的方向。
bull;一套由实验性基础设施和数据组成的工件,它们可以免费获得,并可以复制我们的工作并在其上构建。
本文的其余部分结构如下。 第二部分提供Android的背景信息。 第三部分讨论我们在研究中考虑的测试输入生成技术和工具。 第四部分描述我们的研究设置并呈现我们的结果。 第五部分分析和讨论我们的发现。 最后,第六节总结了论文。
二.安卓平台和应用程序
Android应用程序运行在三个其他主要软件层的堆栈顶部。 Android框架提供了一个API,使应用程序可以访问设施,而无需处理操作系统的低级细节。 到目前为止,已经有20个不同的框架发布和随之而来的API变化。 框架版本控制是导致Android中碎片问题的第一个元素。 由于新的框架版本需要几个月才能在Android设备上占据主导地位,因此该领域的大多数设备都运行旧版本的框架。 Android开发者因此不断地努力使他们的应用程序与旧的框架版本兼容。在运行时,Zygote守护进程为每个运行的应用程序创建单独的Dalvik虚拟机(Dalvik VM),其中Dalvik VM是基于寄存器的VM,可以解释包括运行时层中的根本性更改,因为它引入了ART(即Android 运行时),一个新的运行时环境,大大提高了应用程序性能,并将最终取代Dalvik VM。 定制的Linux内核,它站在Android软件堆栈的底部,提供系统的主要功能。 一组本地代码库(如WebKit,libc和SSL)直接与内核通信,并向运行时层提供基本的硬件抽象。
Android应用程序主要是用Java编写的,尽管开发人员通常会使用本地代码来提高性能。 Java源代码首先被编译成Java字节码,然后翻译成Dalvik字节码,最后存储到.dex格式的机器可执行文件中。 应用程序最终以apk文件的形式分发,这些文件是包含dex文件,本机代码(任何时候存在)和其他应用程序资源的压缩文件夹。 Android应用程序在AndroidManifest.xml文件中声明其主要组件,它们可以是四种不同类型:
活动是负责应用程序用户界面的组件。 每个活动都是一个包含各种UI元素的窗口,例如按钮和文本区域。 开发人员可以通过为每个生命周期阶段(即创建,暂停,恢复和销毁)实施适当的回调来控制每个活动的行为。 活动对用户输入事件(如点击)做出反应,因此是Android测试工具的主要目标。
服务是可以在后台执行远程操作的应用程序组件。 与活动不同,它们不提供用户界面,因此它们通常不是Android测试工具的直接目标,虽然它们可能通过一些活动进行间接测试。
广播接收器和意图允许进程间通信。 应用程序可以注册广播接收器,以通过意图通知特定系统事件。 例如,当接收到新的SMS,新的连接可用或正在进行新的呼叫时,应用程序可以进行反应。 广播接收器可以在清单文件中或在运行时,在应用程序的代码中声明。 为了正确地探索应用程序的行为,测试工具应该知道什么是相关的广播接收器,以便他们可以触发正确的意图。
内容提供者充当共享数据存储的结构化接口,例如联系人和日历数据库。 应用程序可能有自己的内容提供商,并可能将其提供给其他应用程序。 像所有软件一样,应用的行为可以取决于这样的内容提供商的状态(例如,关于联系人列表是否为空或者它是否包含重复)。 因此,测试工具应该“嘲笑”内容提供商,试图使测试确定性,并实现更高的应用程序的行为的覆盖。
尽管基于GUI并且主要用Java编写,Android应用程序与Java独立GUI应用程序明显不同,并且以某种方式显示不同类型的错误[14],[15]。 因此,Java [12],[21],[22]的现有测试输入生成工具不能直接用于测试Android应用程序,而必须创建自定义工具。 为此,在该领域已经进行了大量的研究,并且已经提出了用于Android应用的若干测试输入生成技术和工具。 下一节提供了该领域现有主要工具的概述。
三.现有的ANDROID测试工具:概述
Android的输入生成工具的主要目标是检测测试中的应用程序中的现有故障。因此,应用程序开发人员通常是这些工具的主要利益相关者,通过使用工具,他们可以在部署应用程序之前自动测试应用程序并修复发现的问题。然而,由这些工具生成的动态跟踪也可以是更具体的分析的起点,这可能是Android市场维护者和最终用户的主要兴趣。事实上,Android应用程序大量使用特性,如本机代码,反射和代码混淆,几乎每个静态分析工具的限制[4],[5],[11]。因此,为了探索Android应用程序的行为并克服这些限制,通常的做法是采用动态分析并使用测试输入生成工具来探索足够的行为进行分析[10],[32]。例如,Google已知在其云基础架构上运行每个应用程序,以模拟它在用户设备上的工作方式,并寻找恶意行为[17]。
测试输入生成工具可以单独分析应用程序,也可以关注应用程序与其他应用程序和/或底层框架之间的交互。无论这些工具的最终用途是什么,挑战是生成相关的输入,尽可能多地运行测试中的应用程序的行为。由于Android应用程序是事件驱动的,因此输入通常以事件的形式,可以模拟用户交互(UI事件),例如点击,滚动和文本输入,或系统事件,例如新接收的短信。测试工具可以根据不同的策略生成此类输入。他们可以随机生成它们或通过遵循系统的探索策略。在后一种情况下,探索可以由应用的模型指导,其可以静态地或动态地构造,或者利用旨在实现尽可能多的代码覆盖的技术。沿着不同的维度,测试工具可以通过将Android应用程序视为黑盒或白盒来生成事件。在后一种情况下,他们将考虑代码结构。灰盒方法也是可能的,其通常提取应用程序的高级属性,诸如活动列表和包含在每个活动中的UI元素的列表,以便生成将可能暴露未开发行为的事件。
表1提供了文献中介绍的Android现有测试输入生成工具的概述。据我们所知,此列表是完整的。对于我们的研究,我们在这些工具中选择了那些可用的工具,它们的主要目标是覆盖被测应用程序的状态空间。因此,我们忽略了只关注使应用程序崩溃的工具(例如,意图模糊器)和其目标是识别特定问题的工具(例如,死锁检测器)。该表报告了所有这些工具,突出了我们在研究中考虑的工具,并根据它们的特征对它们进行分类。特别地,该表格报告工具是公开可用的,在受限制的政策下分发还是仅在纸上呈现,是否需要被测试的应用的源代码,以及它是否需要插件,无论是应用本身还是底层的Android框架。以下部分提供了有关每个这些工具的更多细节,根据其探索战略分组,并解释我们为什么不能在我们的研究中考虑其中的一些。
A.随机探索策略
第一类测试输入生成工具,我们考虑使用随机策略生成Android应用程序的输入。 在其最简单的形式中,随机策略仅生成UI事件; 随机生成系统事件将是非常低效的,因为有太多这样的事件,并且应用程序通常只对其中的一些,并且只在特定条件下做出反应。
基于随机探索策略的输入生成器的优点是它们可以有效地生成事件,这使得它们特别适合于压力测试。 它们的主要缺点是随机策略几乎不能产生高度具体的输入。 此外,这些工具不知道应用程序的多少行为已经被覆盖,因此可能生成无助于探索的冗余事件。 最后,他们没有指示探索成功的停止标准,而是诉诸手动指定的超时。
Monkey [24]是最常用的测试工具Android应用程式,部分原因是它是Android开发人员工具包的一部分,不需要任何额外的安装工作。 Monkey实现最基本的随机策略,因为它认为被测试的应用程序是一个黑盒子,只能生成UI事件。 用户必须指定他们想要Monkey生成的事件数。 一旦达到这个上限,Monkey停止。
Dynodroid [18]也是基于随机探索,但它有几个特点,使其探索比猴子更有效。 首先,它可以生成系统事件,它通过检查哪些是相关的应用程序。 Dynodroid通过监视应用程序在Android框架中注册监听器来获取此信息。 由于这个原因,它需要仪表框架。 Dynodroid的随机事件生成策略比Monkey实现的更聪明。 它可以选择最不频繁选择的事件(频率策略),并且可以考虑上下文(BiasedRandom策略),即,在更多上下文中相关的事件将被更频繁地选择。 对于我们的研究,我们只考虑了BiasedRandom策略,这是默认的策略。 Dynodroid的另外的改进是当探索停止时允许用户手动提供输入(例如,用于认证)的能力。
大多数属于此类别的其他工具是输入模糊器,旨在通过随机生成意图的值来测试应用内通信
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[138821],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。