APP下载

面向Android 平台的GUI 测试输入自动生成研究综述

2020-11-25唐文博熊彩铃王慧亚

现代计算机 2020年8期
关键词:测试工具应用程序状态

唐文博,熊彩铃,王慧亚

(四川大学计算机学院,成都610065)

0 引言

在过去的几年中,我们目睹了移动应用程序业务的惊人增长。根据最近的报道,目前最流行的Android 平台应用市场Google Play 提供了超过一百万个应用[1]。和传统的软件一样,在应用程序发布之前需要对其进行充分测试,以确保其行为正确。随着智能手机的快速发展以及日益激烈的市场竞争,厂商需要频繁地更新应用程序以吸引用户,因而快速迭代周期导致测试所需的资源如时间、人力等受到很大的限制,使得传统的手工测试方法难以实现有效的测试,因此自动化测试的重要性越来越高。

GUI 具有良好的交互性,相对于传统的DOS 界面,GUI 更加友好和直观,用户能够更加轻松地使用Android 程序。目前几乎所有的Android 应用程序都有GUI,GUI 在整个应用程序中的代码量占比也达到了60%[2]。GUI 在应用程序中占有非常重要的地位,因此目前GUI 测试已经成为了Android 自动化测试中最常用的方法[3]。

在GUI 自动化测试过程中,测试输入自动生成是资源消耗最大,也是最关键的步骤。测试输入的质量与测试覆盖率有直接关系,也能够极大地影响自动化测试的有效性。因此大量学者针对测试输入自动生成进行了研究。本文对当前Android 测试输入自动生成相关研究进行综述,分析了相关研究的优缺点并指出了当前研究面临的挑战。

1 Android测试输入的定义

Android 应用测试输入可分为事件输入(将用户的手势动作发送到GUI 上以触发事件)与数据输入(应用数据输入与环境输入)[4],由于本文主要讨论Android 平台上的GUI 测试输入,因此我们这里只考虑事件输入,我们将测试输入的生成过程定义如下:

(1)初始化一个运行环境e,将被测应用P 在其上运行以到达一个初始状态s0∈S0。

(2)循环地观测应用系统的状态直到满足某个终止条件,并利用观测到的状态构建GUI 模型,GUI 模型能够反映应用程序上事件的转换过程。

(3)根据GUI 模型,采取一定的策略生成测试输入,将其发送到应用系统上以探索应用系统的状态空间S。

为了保证测试质量,应用系统的状态空间S 必须被有效地探索,也就是我们构建的GUI 模型需要尽量完整。同时为了减少测试过程中时间的开销,需要保证生成的测试输入尽量不包含冗余路径。大量的学者针对上述问题进行了研究。

2 GUI测试输入相关研究

当前针对GUI 测试输入生成的研究,主要可以分为三种,分别是随机策略、基于模型的策略以及基于目标的策略,由于基于模型的策略能够有效地避免生成冗余测试,同时帮助开发者快速定位出故障的地点,因此基于模型的策略成为了当前GUI 测试的常用方法,本节将着重介绍基于模型的策略。

2.1 随机策略

随机策略指随机生成测试输入并输入到GUI 上,最典型的工具便是Google 官方提出的Monkey[5]工具,该工具能够随机生成类似用户的测试输入并输入到手机界面上,然后模拟用户的点击等手势,以及一些系统级的事件。MonkeyRunner 同样是Android SDK 自带的测试工具,它可以用于做功能测试,回归测试并且可以自己定义测试扩展,灵活性较大。Dynodroid[6]对Monkey 进行了改进,它能够从随机生成的测试输入中删除掉冗余测试,从而提高了测试效率。

2.2 基于模型的策略

基于模型的策略指通过构建GUI 模型生成测试输入。Choi.w[7]等人提出了SwiftHand 算法,该算法能够自动生成GUI 的测试输入序列。该算法使用机器学习来在测试期间学习应用程序的模型,使用学习后的模型来生成访问应用程序未探索状态的用户输入,并在生成的输入上使用应用程序的执行来完善模型。该算法的一个关键特征是它避免了重新启动应用程序,因而提高了效率。此外,Choi.w 通过使用一种名为DetReduce 的启发式技术,在给定通过运行自动GUI测试工具生成的大型测试输入的情况下,为GUI 应用程序创建小型回归测试输入。DetReduce 通过识别和消除现有的自动GUI 测试工具引入的某些常见形式的冗余,极大地减少了最小化GUI 测试输入所需的时间。

D.Amalfitano[8]开发了一款名为AndroidRipper 测试工具,该工具将基于模型的技术用于Android 应用程序并执行自动化测试,该研究成为了之后大量研究的基础。R.Mahmood[9]等人开发了一个测试框架,通过构建GUI 模型生成有效的测试输入。Cao Y 等人[10]提出了一种针对Android 应用的基于模型的GUI 测试技术。该方法将等效小部件分组到一种状态中,并设计了一种新的基于反馈的探索策略,该策略根据已触发的搜索项的执行结果动态调整操作的优先级,并倾向于选择可以到达应用的新状态的操作,避免了局部和重复的探索。为了捕获应用程序运行过程中的信息以构建GUI 模型,Jamrozik K 等人[11]开发了Droidmate,Droidmate 能够探索应用程序,在运行时反复读取设备GUI并监视对Android API 方法的调用,并且根据该数据决定要执行的下一个GUI 操作(单击、长按、文本输入等),并提供了探索策略。该过程一直持续到满足某些终止标准为止。

W.Yang 等人[12]通过混合分析的方法提高了GUI模型生成的准确性,混合分析指将动态分析和静态分析结合起来对应用程序进行探索,混合分析既能够解决静态分析方法无法获取应用程序动态运行时的状态信息的问题,又能弥补动态分析过程中遇到的路径不可达的问题[13]。该研究通过对源代码执行静态分析,并将得到的信息用于支持应用程序的动态探索和GUI 模型生成过程,提高了GUI 模型准确性。

尽管混合方法能够提高模型的准确性,但由于大多数现有的方法都是通过逆向工程创建应用程序的模型。而由于逆向工程方法的不完备性,应用模型不能广泛地捕捉应用的动态行为,因此混合分析方法往往缺乏全面性。为了解决这个问题,D.Amalfitano 等人[14]开发了Mobile GUITAR 工具,该工具提出了一个高效的应用程序控件探索算法,在避免了静态分析带来的复杂性的同时,提高了遍历的效率,保证了生成的GUI模型的完整性,为高效的基于模型的Android GUI 测试铺平了道路。

2.3 基于目标的策略

由于某些应用程序行为只能在提供特定输入后才能显示。因此测试工具需要使用更复杂的技术(例如符号执行和进化算法)来指导探索以前未发现的代码[15],这就是基于目标的方法,该方法往往是针对某个特定行为进行检测,典型的应用场景是对应用程序进行恶意检测[16],例如N.Mirzaei 等人使用符号执行方法[17]进行测试,试图检测出更深层次的故障。

尽管基于目标的策略提高了故障/错误检测能力并揭示了其他工具无法发现的错误,但是这些方法需要相对复杂的数据或分析技术,例如使用完整源代码的静态分析,因此需要消耗大量的资源[18],同时该方法的拓展性较差,难以应对频繁的需求变更。

3 结语

通过对当前GUI 测试输入自动生成的相关研究,我们可以发现仍然存在以下几点问题值得深入研究和改进:

(1)由于应用程序的GUI 存在大量的UI 元素,而不同的UI 元素与用户的交互方式不一定相同,UI 元素与其可能支持的交互行为的排列组合数目是非常巨大的,因此我们可以认为GUI 状态空间S 是无穷的。因此在构建GUI 模型的过程中会不可避免的遇到了软件界通用技术瓶颈——状态爆炸问题,这使得测试输入生成技术无法在有限的测试资源下遍历整个状态空间,只能探索一部分状态。由于不同的测试过程目的不同,其对于不同的状态有着不同的重要性评估。如何生成测试输入以优先探索到所服务的测试过程认为更重要的状态,以更好地服务测试过程,是测试输入生成技术的一大挑战。

(2)由于状态空间以及状态转移方式的未知性以及状态空间的无穷性,很难在有限的测试资源内精准地构建GUI 模型。测试输入生成技术无法准确地获知生成什么测试输入可以进一步探索状态空间未被探索的部分。有一些测试输入不会导致应用系统状态的转移,如应用当前不可处理的输入。而有一些测试输入只会探索已经探索到的状态。由于无法准确识别这些输入,状态空间探索容易困于局部,影响生成的测试输入的有效性。同时,状态空间中存在一些深层状态,需要特定的测试输入序列才能够探索到。一些状态需要特定的数据输入(如登录账号密码等)才能够探索到,而另一些状态需要一个特定的长测试输入序列(如多次交替发送两个点击输入)才能够探索到。由于状态空间的未知性,测试输入生成技术无法准确得知所需的测试输入,从而很难探索到这些状态。因此如何构建完成的GUI 模型,是测试输入生成技术的另一大挑战。

猜你喜欢

测试工具应用程序状态
边缘智力儿童及其智力测试工具的研究进展
删除Win10中自带的应用程序
状态联想
Http并发连接测试工具
生命的另一种状态
热图
坚持是成功前的状态
福禄克推出先进的连接式测试工具系统
关闭应用程序更新提醒
三星电子将开设应用程序下载商店