第38卷第5期   计算机应用与软件
Vol 38No.52021年5月 
ComputerApplicationsandSoftware
May2021
基于行为树模型的Android应用GUI自动随机测试方法
佘学文1 陈向宇2 刘东启2
(广东岭南职业技术学院 广东广州510663)
(华南理工大学计算机科学与工程学院 广东广州510006)
收稿日期:
2019-10-05。国家自然科学基金项目(61771007);广东省科技创新战略专项项目(2016A030305001)。佘学文,副教授,主研领域:可信软件工程,软件测试。陈向宇,教授。刘东启,博士。
摘 要  基于马尔可夫链等统计模型进行GUI测试是目前最有效的GUI自动化测试方法之一,但目前的方法在开始测试前需要很多前置条件,且要花费大量时间做静态分析等准备工作,从而导致测试效率和自动化水平不高。提出一种基于行为树的GUI自动化随机测试方法,该方法不需要进行静态分析,只需通过统计模型从用户使用日志中创建行为树模型,且可以动态地对行为树模型进行更新,以增加用户很少或从未使用过的事件的概率。对三种开源Android应用程序的评估,以及和其他GUI自动测试方法的比较结果显示:提出的Android应用GUI自动化随机测试方法具有很好的效果。
关键词  Android 软件测试 GUI测试 自动化测试 行为树模型
中图分类号 TP311.5    文献标志码 A    DOI:10.3969/j.issn.1000 386x.2021.05.003
AUTOMATEDRANDOMGUITESTINGOFANDROIDAPPLICATION
BASEDONBEHAVIORALTREEMODEL
SheXuewen1 ChenXiangyu2 LiuDongqi
(LingnanInstituteofTechnology,Guangzhou510663,Guangdong,China)
(SchoolofComputerScienceandEngineering,SouthChinaUniversityofTechnology,Guangzhou510006,Guangdong,China)
Abstract  AutomatedGUItestingbasedonbehaviortreemodelsuchasMarkovchainisoneofthemosteffectivetestingmethods.However,therearemanyprereq
uisitesbeforetesting,andrequiresalotoftimedoingstaticanalysis,whichleadstolowtestefficiencyandlowautomationlevel.AnautomatedrandomGUItestingmethodbasedonbehaviortreeisproposed.Thismethoddoesnotneedstaticanalysis,butcreatesbehaviortreemodelfromusagelogbystatisticalmodel.Thebehaviortreemodelcanbedynamicallyupdatedtoincreasetheprobabilityofeventsthatarerarelyorneverused.ThroughtheevaluationofthreeopensourceAndroidapplicationsandthecomparisonwithotherautomatictestmethodsofGUI,theresultsshowthattheproposedmethodofautomatedrandomGUItestingofAndroidapplicationhasgoodeffect.Keywords  Android Softwaretesting GUItesting Automatedtesting Behavioraltreemodel
0 引 言
随着人工智能和移动互联网的迅猛发展,智能手机已经成为人们生活的重要部分。美国媒体机构Zen ith发布的最新研究报告显示,2018年中国智能手机用户数达到13亿,位居全球第一,全球智能手机用户数也达到3
3亿,并且还在逐年增加。图形用户界面(GraphicalUserInterface,GUI)是用户与手机应用程序
(App)进行交互的最重要通道。在激烈的市场竞争
中,高质量、无瑕疵的GUI是一款应用程序成功的重要前提,GUI测试是保证应用程序GUI质量的重要手段。目前,学术界和工业界已经研究、实现和评估了多
种GUI测试的方法[1-6],但Joorabchi等[7]
一项关于移
动App开发面临的挑战的研究表明,超过70%的移动应用开发或测试人员在实践中倾向于采用手动方法进行GUI测试,从事全自动GUI测试的人数不到5%,超过一半的参与者认为实现自动化GUI测试是一项具
22
    计算机应用与软件2021年
有挑战性的工作,且移动应用GUI测试目前仍然是一项劳动密集型工作。
为了提高Android应用GUI测试的效率和自动化水平,本文建立一套易于实现、开展测试的前置条件简单且更加高效的Android应用GUI自动化随机测试方法,该方法在开展测试前只需要简单的准备工作,同时采用以下手段来保证更好的代码覆盖率:
1)在测试时通过映射GUI树和行为树模型来避免静态分析。
2)动态更新模型以增加用户在使用应用程序过程中很少或从未使用过的事件的概率。
3)应用统计模型建立行为树模型。
1 相关工作
目前,工业界和学术界已经在Android应用GUI自动化测试方面开展了许多工作。Google提供的An droidSDK中,给出了三种可用于自动化测试的方式,即Monkey、MonkeyRunner和Instrumentation。其中Monkey[3]是测试Android应用程序最常用的工具,它通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入
、手势输入等)对被测应用程序(Applica tionUnderTest,AUT)进行有效的自动化测试。但Monkey自动生成的大量输入很简单,无法生成需要人类智能组合的测试输入,且会生成很多冗余输入。文献[4-5]采用了基于Hook机制的GUI自动化测试方法。文献[8]采用的基于随机探索的方法。文献[9]采用了基于模型(MBT)的方法并研制了工具Android Ripper。该工具维护一个GUI状态机模型,在执行测试过程中,AndroidRipper通过深度优先搜索(DFS)策略动态分析GUI的控件获取其可触发的事件序列,每一个事件序列就是一个测试用例。文献[10-11]提出基于捕获用户输入的GUI自动化测方法,其中文献[11]创建了一个名为MonkeyLab的工具,该工具通过挖掘GUI的模型为自然和非自然事件序列生成可操作的场景。
2 方法设计
本文提出的基于行为树模型的GUI自动化随机测试方法的创新之处在于开展测试的前置准备过程简单,且测试过程中会动态更新行为树模型以增加测试覆盖率。初始行为树模型是通过统计建模从使用日志中创建的,考虑到Android应用的部分事件可能在使用日志中没有出现过,提出通过将行为树模型中的事件映射到GUI树中的控件来解决,同时行为树模型中事件的概率也随着测试的进行而动态调整。图1为本文方法的总体框架,
主要分为六个步骤。
图1 方法总体框架
1)从使用记录器中预先收集使用日志,并利用HierarchyViewer从AUT中提取GUI树。
2)应用统计模型创建行为树模型,然后将行为树模型中的事件映射到GUI树中的控件,以便根据
要执行事件序列,自动进行GUI控件操作,实现GUI的自动化测试。
3)从行为树模型中随机选择事件,生成执行事件序列。
4)将所选事件触发到AUT。
5)对使用日志进行日志分析,根据分析结果得到用户执行某事件的频率,并根据事件频率调整概率,动态更新行为树模型。
6)重复步骤2)至步骤5)直到达到时间限制或预先确定的事件数量。
2.1 日志获取与GUI树创建
此步骤的目的是获取用于生成行为树模型的控件、使用日志和GUI树。
2.1.1 使用日志获取
获取使用日志是本文方法开展测试的唯一前置条件和步骤。使用日志是通过使用记录服务Recorder从AUT获得的。Recorder服务使用Android的Accibli tyService实现,该服务以AccessibilityEvent的形式捕获测试人员或用户执行的事
件,然后收集这些事件并通过Android调试桥(AndroidDebugBridge,ADB)传输到Observer。如表1所示的事件,如果Recorder服务开启,那么一旦用户开始使用应用程序,Recorder服务就会记录用户的使用日志,直到用户关闭该应用程序。由于这些使用日志是建立行为树模型的基础,因此覆盖的使用场景越多越好,测试方可以通过众包的方式获得大量使用日志数据。
表1 AccessibilityEvent定义的几种事件类型
事件类型描述
TYPEVIEWCLICKED表示单击视图事件
第5期   
佘学文,等:基于行为树模型的Android应用GUI自动随机测试方法
23
 续表1
事件类型
描述
TYPEVIEWLONGCLICKED表示长击视图事件TYPEVIEWSCROLLED表
示上下滑动视图事件TYPEVIEWTEXTCHANGED表示更改编辑文本事件TYPEWINDOWSTATECHANGED
表示打开弹出窗口、菜单、
对话框等的事件2.1.2 从AUT中提取GUI树
GUI树是GUI控件的层次结构,在运行时使用AndroidSDK工具包中的可视化调试工具HierarchyViewer从AUT中提取。HierarchyViewer通过ADB与Android模拟器或Android真机进行通信,可以列出应用程序的树形结构布局,并提供所有GUI控件的ID、控件类型、文本内容、位置和大小等信息。本文使用图2所示的图片编辑程序来作为测试样例进行说明,图3显示了图2中示例活动的简化GUI树。在这个例子中,简化的GUI
树包括6个GUI控件:e1.
backButton、e2.editButton、e3.deleteButton、
e4.shareButton、e5.ima geView和e6.saveButton。
图2 样例AUT(图片编辑程序)
图3 AUT的GUI树
2.2 行为树模型生成和映射
在这个步骤中,根据使用日志创建行用户执行事件的行为树模型,然后将事件映射到GUI树中的GUI控件。
2.2.1 行为树模型生成
通过使用马尔可夫假设近似条件概率从使用日志创建行为树模型(如图4中的简化行为树模型)
。图4 简化的行为树模型
本文使用N gram语言模型来实现,N gram是一种基于统计语言模型的算法,又被称为一阶马尔可夫链,它的基本思想是将文本里面的内容按照单词进行大小为N的滑动窗口操作,形成长度是N的单词片段序列。在软件测试的背景下,这些单词代表事件,n表示事件的数量。例如,一系列事件etap1,etap2,ehold1,eswipeUp
,如果设n=2,那么2 gram为:1)p(etap2|etap1)2)p(ehold.1|etap2)3)p(eswipeUp|ehold.1
)如果设n
=3,那么3 gram为:1)p(ehold.1|[etap1,etap2])2)p(eswipeUp|[etap2,ehold.1
])其中,p(ex|[ej,ek])是在给定历史事件[ej,ek
]下选择事件ex的概率,当n较大时,模型可以存储更多上下文,从而可以更加充分地进行时空权衡。在实际中,用户的使用范围可能无法完全覆盖应用程序的所有功能。在图4中,假设当用户处于活动B时,可能发生另一个事件e6,但简化的行为树模型中没有该事件,这意味着模型未对程序的事件实现完全覆盖,且事件e6永远不会被映射、
选择和执行。因此,将GUI树中可用、但在模型中不存在的事件称为未知事件。
为了解决这个问题,需要调整概率分布。常用的N gram训练工具有SRILM、IRSTLM、BerkeleyLM和
KenLM等[12-14]
,这几种工具所用的算法思想基本一
致,本文以KenLM(速度最快,占用内存最少)作为训练工具,所用的平滑技术是M
odifiedKneser neysmoot hing[15]。因为它被认为是当前一个标准的、广泛采用
的、效果最好的平滑算法,ModifiedKneser neysmoot hing平滑技术有三个核心思想。
1)绝对折扣。为了给未知事件一些概率,必须降低其他事件的概率,以保持有效的概率分布。
2)插值。递归地组合所有k gram的概率,其中k∈1
,2,…,n,如果一个事件序列在模型中出现任何
24   
计算机应用与软件
2021年
k gram下标,那么它将产生非零概率。
3)历史。应该考虑每个事件出现的上下文的数量。例如,如果一个事件只发生在特定的上下文中,那么它就不太可能出现在新的上下文中。2.2.2 将行为树模型映射到GUI树
行为树模型中的每个事件都使用唯一的resource id作为键映射到GUI树中的GUI控件,如果没有定义resource id,则使用类型和文本映射到GUI控件。为了提高查速度,本文使用哈希表实现GUI映射器,并在每次重新获取使用日志信息后进行更新。
2.3 选择事件
本文的目的是测试应用程序,而不是创建一个自然的动作序列,因此,动作序列中的下一个事件并不会简单地依据概率的高低选择,而是随机选择。设e1,e2,…,en∈{possibleEvents},且h是先前选择的历史事件,事件选择器将根据给定的一系列先前所选事件的平滑概率来随机选择enext
:enext=w([p(e1|h)],[p(e2|
h)],…,[p(en|
h)])(1)
式中:w(L)是列表L的加权随机函数,[p(e1|h)],[p(e2|h)],…,[p(en|h)]∈L,∑n
p(ei|h
)=1,p(ex|h)是更新后给定历史事件h下事件ex发生的概率。从图5中可以看出,对于e1至e6,L分别为[0.07、0.14、0.28、0.41、0.07、0.03],列表的累加和为[0.07、0.21、0.49、0.90、0.97、1.00]。w将均匀地随机生成介于0.00和1.00之间的数字,并选择生成数字小于或等于其累加但大于ex-1的ex。假设数字是0.99,那么enext为e6
。图5 平滑后的行为树模型
2.4 执 行
EventExecutor执行由事件选择器在实际移动设备或仿真器上通过UIAutomator选择的enext,本文方法可以执行诸如单击、长按、滚动和文本编辑等事件,这些事件定义如下:
单击:点击并立即在视图中释放。长击:在视图点击并按住3s后释放。滚动:点击并拖动到x+Δx,y+Δ
y位置。文本编辑:输入任意的预生成的字符串。
假设enext为图4中的e6
,并且是可点击的,EventExecutor将向视图的中心触发一个单击事件,在这种情况下,本例中为saveButton。
2.5 更 新
执行后,利用偏置随机技术对模型进行更新,以调整所选择/执行的事件的概率,它减少了先前选择和执行的事件的小因子。
p′(ex|h)=p(ex|h)-d(ex,δfx
)(2)
式中:fx是ex的频率,d(ex,δfx)是ex的折扣值,p(ex|h)是给定历史事件h下事件ex发生的概率。假设d(e6,δf6)=0.005,那么根据式(2)可以得到p′(e6|h)=0.025,在从ex中减少一些概率之后,必须重新计算每个p′的概率,以便通过将其除以总p′概率来保持有效的概率分布。
p(ex|
h)=p′(ex|
h)∑n
i=1
p′(ei|
h)(3)
式(3)的结果如图6所示。p(e6|h)的概率降低了,但p(e1|h)至p(e5|h)略有增加,这将使其他事件有更大的机会被选择,从而提高代码覆盖率。最后,在执行e6
后更新器更新行为树模型。
图6 更新后的行为树模型
3 实验与分析
为了评估本文方法的有效性,将其与另外三种主流的方法进行比较:AndroidMonkey、手动测试和Dynodroid工具。评估采用的目标程序是三个未经修
改的开源Android应用程序:Anymemo[16]
、World
Clock[17]和WeightChart[18]。这三款工具分别具有动
态内容、静态内容和复杂的用户界面,可以在一定程度上保证评估的覆盖面和可信性。
表2 性能评估程序
App版本
LOC
描述
AnymemoV8.3.18989一款背单词软件AppWorldClock
V0.6
1251
一款简单的全球时间AppWeightChartV1.0.41149
一款体重记录软件
第5期   佘学文,等:基于行为树模型的Android应用GUI自动随机测试方法25
3.1 实验设置
软件测试app
所有的实验都使用AndroidAPI19在Nexus5模拟器上完成的,该模拟器具有1586MB的RAM,运行在64位Windows7计算机上,具有3.1GHz的i7处理器和16GB的RAM。让5个学生分别使用5分钟上述应用程序来获取使用日志,对他们如何使用这些应用程序没有任何限制,且每次实验AUT都安装在新创建的模拟器上,同时只使用默认设置。每一次实验,根据本文方法开发的工具、AndroidMonkey和Dynodroid都包含5000个触摸事件,为了确保每次执行下一个事件之前完成屏幕切换或动画,在每个事件之间设置500ms的延时。对于手动测试,要求测试人员在40min内尽可能多地手动执行这些应用程序。在每次实验后都会重置模拟器以防止它影响后续的测试,同时使用EMMA覆盖率检测工具[19]和自定义shell脚本从AUT收集覆盖率信息。
3.2 结果分析
在每个程序设置了10个数据采集点,每500次事件间隔读取一次代码覆盖率,测试结果如表3所示。Our_COV代表本文方法的覆盖数据,Monkey_COV代表AndroidMonkey的覆盖数据,Dynodroidy_COV代表Dynodroidy的覆盖数据,Manual_COV代表人工手动测试的覆盖数据,表中的数字表示每种方法所覆盖的代码行数和代码覆盖率。测试结果表明,在Anymemo中,本文方法的性能优于AndroidMonkey和Dyno droid,但是没有手动测试好。在3个应用程序测试中,人工手动测试的代码覆盖率均是最
高的,这是可以预见的,因为人类可以提供更智能的文本或顺序输入。
表3 四种测试方法代码覆盖率对比
AppAnymemoWorldClockWei
ghtCh
Our_COV
3121
(34.72%)
1089
(87.05%)
622
(54.13%)
Monkey_COV
1870
(20.80%)
968
(77.38%)
521
(45.34%)
Dynodroidy_COV
1387
(15.43%)
1025
(81.93%)
714
(62.14%)
Manual_COV
4231
(47.07%)
1126
(90.01%)
995
(86.60%)
图7显示了Anymemo的累积代码覆盖率。X轴表示基于500个事件间隔的事件数量。为了不在测试期间干扰受试者,在手动测试期间没有记录覆盖率,所以手动测试的数据为最终覆盖率。
图7 Anymemo的累积代码覆盖率
4 结 语
本文介绍了一种基于行为树模型的Android应用GUI自动化随机测试方法。该方法基于实际使用日志创建行为树模型,在运行时用GUI树映射行为树模型,用改进的Kneser Ney平滑技术处理零概率未知事件。为了评价本文方法的有效性,设置了实验,通过3个开源应用程序与AndroidMonkey、手动测试、Dyno droid等方法进行了对比。测试结果表明,本文方法在所有应用程序上都优于Androidmonkey,在Anymemo、WorldClock上优于Dynodroid,但是落后于手动测试。未来,将扩展本文方法能够处理的可操作事件,如缩放、拖拽等。同时通过更复杂的Android应用程序来评估本文提出的工具。
参考文献
[1]ChoudharySR,GorlaA,OrsoA.Automatedtestinputgen erationforandroid:Arewethereyet?(E)[C]//Proceed
ingsofthe30thIEEE/ACMInternationalConferenceonAu
tomatedSoftwareEngineering.IEEE,2015.
[2]YangW,PrasadMR,XieT.Agrey boxapproachforauto matedGUI modelgenerationofmobileapplications[M]//
FundamentalApproachestoSoftwareEngineering.Berlin:
Springer,2013.
[3]LinCH,YangCZ,PengL,etal.ExplorationschedulingforreplayeventsinGUItestingonandroidApps[C]//2018
IEEE42ndAnnualComputerSoftwareandApplicationsCon
ference.IEEE,2018.
[4]李江.基于hook机制的android自动化脚本录制回放框架的设计与实现[J].软件,2014,35(10):1-6.
[5]彭国军,程德智,赵豪东,等.面向Android软件动态行为监测的GUI自动化触发与测试方法[J].保密科学技
术,2014(10):29-35.
[6]MoranK,Linares VasquezM,PoshyvanykD.AutomatedGUItestingofandroidApps:Fromresearchtopractice[C]//
2016IEEEInternationalConferenceonSoftwareMaintenance
andEvolution.2016(1):648.
(下转第48页)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。