英语原文共 5 页,剩余内容已隐藏,支付完成后下载完整资料
摘要
越来越需要针对Android应用的自动测试技术。一个关键的挑战是系统地生成测试用例。系统地生成Java程序的测试用例的一种方法是符号执行。但是,由于Android应用程序在Dalvik虚拟机(DVM)而不是JVM上运行,因此应用符号运行工具(如Symbolic Pathfinder(SPF))来为Android应用程序生成测试用例。此外,由于Android应用程序依赖于应用程序开发框架,因此Android应用程序是事件驱动的,容易受到路径分歧的影响。本文概述了一种双管齐下的方法来缓解这些问题。首先,我们在Java Pathfinder(JPF)中开发了一个Android库的模型,以支持执行Android应用程序,以解决与JVM和路径分歧不兼容的问题。其次,我们利用程序分析技术将事件与处理程序相关联,用于自动生成模拟所有有效事件的Android特定驱动程序。
介绍
2008年,Google和开放手机联盟推出Android平台的移动设备。 Android是包括智能手机和PDA在内的移动通信设备的综合软件框架。自从成立以来,Android已经大幅上涨,部分原因是其蓬勃发展的应用程序市场目前提供超过50万个应用程序,每天添加和更新数千个应用程序。毫不奇怪,开发商,消费者和市场运营商对适用于Android应用的自动化测试技术的需求不断增加。
一个有希望的自动测试技术是符号执行[12],一种使用符号值而不是实际值作为程序输入的程序分析技术。它会沿着程序的每个路径收集对这些值的限制,并在求解器的帮助下为所有可达路径生成输入。尽管Android应用程序是以Java开发的,但它们为面向Java的符号执行工具(即Symbolic PathFinder(SPF))提供了三个挑战[22]。
第一个挑战是Android应用程序依赖于在设备或模拟器之外不可用的专有库。 Android代码在Dalvik虚拟机(DVM)[6]上运行,而不是传统的Java虚拟机(JVM)。因此,Android应用程序被编译成Dalvik字节码而不是Java字节码。为了使用SPF来象征性地执行Android应用,他们需要被转换成相应的Java字节码表示。
第二个挑战是Android程序对框架库的依赖使得它们容易出现路径分歧问题,而且比传统的Java程序更为容易。通常,当符号值流出正在符号执行的程序的上下文以及边界框架或任何外部库的上下文时,可能会发生路径分歧问题。然而,在Android中,路径分歧是常态,而不是例外。典型的Android应用程序由多个活动和服务组成,扮演软件组件的角色,它们使用Intents(Android的消息系统)进行广泛的互动。意图用于将值传递给另一个活动/服务,因此值将留下应用程序的边界,并在新的Activity / Service中检索之前通过Android库传递。
最后,Android是一个事件驱动系统,提取程序的输入值大部分时间依赖于用户操作,这意味着符号执行引擎必须等待用户与系统进行交互并点击一个按钮或启动其他程序类型可以继续执行某个路径。此外,系统本身或第三应用程序可以启动事件并使应用程序以某种方式行为。由于智能手机的环境敏感性,这些事件在智能手机应用程序中比传统软件系统更为频繁。
用于处理基于传统事件的系统的当前技术可能使用捕获重放或模型驱动的方法。在捕获重放方法[1,16,17]中,用户记录了与GUI相关的交互序列,它们在测试时重播。模型驱动技术[15,24]要求用户提供软件系统用法的模型。捕获重放和模型驱动的方法都取决于手动的努力,因此不是很方便,并且容易出现一些应用程序可能无法使用的方法,这些方法不容易被了解。
通过符号执行测试安卓应用程序
事实上,在安全测试的背景下,应用程序可能会故意地将隐藏的方式纳入其中。还通过爬行GUI [1,16,17]自动提取有向图模型,并使用这些图来生成测试序列,但是再次可能无法识别系统可以参与的其他方式。
在本文中,我们概述了应对这些挑战的多方面方法。我们描述了对SPF的扩展,它提供了建立Android库的存根。这些模型使我们能够在JVM上编译Android应用程序,并在Java PathFinder(JPF)上运行它们来解决第一个挑战,即DVM和JVM的不兼容性。此外,我们提供某些存根的逻辑来模拟Android库类的行为来解决路径分歧的问题。最后,我们利用Android规范的知识和应用程序的专用调用图模型将事件与处理程序相关联[13]。使用此模型,我们可以自动生成用于提取用户输入值的驱动程序,并生成用于运行应用程序的有效事件序列。驱动程序通过指导生成用于模拟实际用户行为的事件序列来解决最后一个挑战。由此产生的SPF扩展版本使我们能够象征性地执行Android应用程序来生成实现高代码覆盖率的测试用例。
本文的组织结构如下。
第2节提供了Symbolic PathFinder和Android的背景知识。第3节介绍一个用于说明研究的Android应用程序。第4节概述了我们的方法。第5节提供了我们如何建模Android库的详细视图,第6节提供了我们在生成Android应用程序驱动程序方面的细节。本文最后总结了第7节的相关研究,并讨论了我们将来在第8章中的工作。
背景技术
在本节中,我们首先提供一个关于SPF的简要背景,其次是Android框架的更详细的概述。
2.1符号路径查找器
JPF [11]是使用自己的虚拟机而不是传统JVM的Java程序的通用模型检查器。 Symbolim Pathfinder(JPF-Symbc)构建在JPF之上,作为使用修改的JPF JVM实现Java字节码的非标准解释的扩展[5]。 SPF分析Java字节码,并可以通过启发式求解来处理混合的整数和实际约束以及复杂的数学约束。 SPF可以用于测试输入生成和查找安全属性的反例[23]。我们正在扩展SPF来建模Android应用程序,并利用它来为他们生成输入和测试用例。
2.2 Android
Android是包括智能手机和PDA在内的移动通信设备的综合软件框架。 Android框架包括基于ARM处理器,系统库,中间件和一套预安装应用程序的完整Linux操作系统。 Google Android平台基于DVM,用于执行和包含用Java编写的程序。 Android还附带了一个应用程序开发框架,它为应用程序开发提供了一个环境,并且包括用于构建GUI应用程序,数据访问和其他组件类型的服务。该框架旨在简化组件的重用和集成。
每个Android应用程序都有一个必需的清单文件。这是每个应用程序的必需XML文件,并提供了管理Android平台中应用程序生命周期的基本信息。包含在清单文件中的信息种类的示例是应用程序的活动,服务,广播接收器和内容提供商的描述,以及其他架构和配置属性。
活动是向用户呈现并包含一组布局的屏幕(例如,LinearLayout,其横向或纵向地组织屏幕中的项目)。布局包含GUI控件,称为视图小部件(例如,用于查看文本的TextView和用于文本输入的EditText)。布局及其控件通常在配置XML文件中描述,每个布局和控件都具有唯一的标识符。服务是在后台运行并执行长时间运行的任务(如播放音乐)的组件。与活动不同,服务不会向用户显示交互屏幕。内容提供商管理存储在文件系统或数据库上的结构化数据,
如联系信息。广播接收器响应系统范围的通知消息,例如屏幕已关闭或电池电量不足。活动,服务和广播接收器通过意向消息激活。意图消息是与支持该操作的数据一起执行的操作的事件。意图消息传递允许组件之间的延迟运行时绑定,其中调用在代码中不是显式的,而是通过事件消息传递进行连接。
活动和服务需要遵循预先指定的生命周期[3]。例如,图1显示了Activity:onCreate(),onStart(),onResume(),onPause(),onStop(),onRestart()和onDestroy())的生命周期中的事件。这些生命周期事件在我们的研究中发挥重要作用,如下所述。
除了这些组件,一个典型的应用程序利用了很多资源。这些资源包括动画文件,图形文件,布局文件,菜单文件,字符串常量,用户界面控件的样式。大多数使用XML文件描述。一个例子,如前所述是布局。布局XML文件定义了活动使用的用户界面控件。资源每个都有唯一的标识符,用于在应用程序代码中区分并获取对它们的引用。
3. 说明例子
为了说明方法,我们将使用一个称为紧急部署系统(EDS)的“行车路线”应用程序(软件系统的子集)[14]。 EDS旨在允许搜索和救援人员实时共享并获取情况评估(例如,地图上的交互叠加),彼此协调(例如发送报告,聊天和共享视频流),并与总部接触(如请求资源)。
驾驶路线应用程序可用于计算两个地理点之间的越野行车路线,同时考虑距离,时间和安全性等成本目标。它还为用户提供最接近源,目的地或路由的调度。图2描绘了这个Android应用程序的GUI。输入框用于纬度/经度对以及用于计算方向的替代方法的按钮。纬度/经度坐标可以在地图中输入或选择。所得到的逐个转弯方向显示在单独的文本框中,并可选地显示在地图上。
4.方法概述
我们的工具的主要目标是使用SPF自动生成Android应用的测试输入。为了做到这一点,我们首先需要生成可以在JVM上执行的应用程序的Java字节码。因此,我们必须使用Java编译器编译应用程序的源代码,而不是Android的软件开发工具包(SDK)。这是通过首先使用我们的型号替换每个应用程序所需的Android库的平台特定部分来实现的。这些模型本质上是以每个组件的组合和回调行为保留的方式创建的存根。这允许我们在JPF上执行Android应用程序,而无需修改应用程序的实现。
此外,我们必须考虑到一个典型的应用程序由使用Android的Intent消息进行通信的多个组件(即活动和服务)组成的事实。当意图用于将符号值传递给另一个活动或服务时,出现路径分歧问题。为了解决这个问题,我们已经实施了适当的逻辑,用于模拟Android平台如何调解组件的基于事件的交互,并将该逻辑并入Activity,Service和Intent存根。我们将这些增强的存根称为模拟类,因为它们模拟了相应的Android构造的行为。这样我们就可以解决由Android组件相互通信的基本机制引起的路径分歧问题。
我们的方法的第二步是使用其调用图模型为应用程序生成驱动程序。与传统Java程序不同,Android应用程序不包含成为调用图的根节点的主类,其中始终启动该程序。 Android应用程序是事件驱动的,这意味着执行线程不断地在应用程序逻辑,系统和用户之间改变上下文。因此,Android应用程序不是代表应用程序完整控制流的连接的调用图,而是由一组断开的子调用图形组成,这些图表共同表示应用程序的逻辑。这些子调用图对应于应用程序可以由用户或Android平台访问的所有方式。图3示出了Android应用程序的假设调用图模型,其中A,B和C各自是具有根节点a,b和c的子调用图,而黑色圆圈表示应用程序的开始。
在生成子调用图之后,我们解析源代码,资源和配置信息,包括清单文件,以查找事件处理程序。这允许我们自动连接子调用图,以构建系统的调用图模型。图3示出了驾驶路线应用程序的呼叫图模型的一个子集。连接两个子图的虚线箭头说明了用户或系统启动事件。调用图模型表示应用程序中的所有可能的方法调用序列(执行跟踪),由图中的黑色箭头描绘。
最后,我们使用调用图模型来导出用于生成驱动程序的上下文自由语法(CFG)。驱动程序是模拟用户与应用程序交互的一系列事件。由于每个子图的根节点表示正在处理的事件,根节点的每个有效组合表示用户与应用程序交互的场景。例如,基于图3中的调用图模型,{a,c}和{a,c,b}是两个可能的事件序列。
我们使用EMMA [7](一个监视和报告Java代码覆盖率的开源工具包)来监视执行测试的代码覆盖率。我们从单个事件驱动程序开始,并继续以更多事件序列迭代生成驱动程序。当我们达到预先指定的代码覆盖率阈值时,测试停止。我们将在接下来的两年中更详细地描述这种方法。
5.对安卓库建模
解决Java程序依赖于外部库时发生的路径分歧问题的常规技术是为这些库提供存根。我们探讨了三种可能的技术来开发支持Android应用的存根,如下所述。
我们的第一个也许是最直接的方法是利用Android的库类的实现。 Android平台提供了一组图书馆类,用于访问手机上的资源。这些库类包含本地方法和依赖于平台的Java Native Interface(JNI)调用,不能在实际的手机之外执行。为了支持开发活动,Google提供Android.jar与Android的软件开发工具包,允许开发人员在开发环境中解决依赖关系并编译应用程序。首先脸红,似乎这个jar文件可以用来在JPF之上执行应用程序。然而,经过进一步检查,我们发现Google已经剥离了该jar文件中的库类,并替换了所有的方法体来抛出异常。
我们探索的第二种方法类似于Robolectric [20]中采用的方法,Robolectric [20]是在Android模拟器之外运行Android单元测试并在JVM之上运行的框架。在这种方法中,可以使用阴影类,它们是通过反射访问的模拟类。阴影类模拟实际的Android库类的行为,并通过反射来覆盖对它们的调用。这种方法对于在JVM上运行测试用例可能是有用的,但是不可用于JPF,因为目前的JPF不能处理反射。
最后,第三种方法,我们在实现中采用的方法是提供我们自己定制的stub和mock类。存根类用于将Android应用编译为JVM字节码,而模拟类用于处理路径发散问题。当返回类型是复杂数据类型时,我们开发了返回随机值的存根,当方法的返回类型是原始的,并返回对象的空实例。
处理Android平
全文共9155字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[143551],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。