论文:Ke Mao,Mark Harman,Yue Jia,CREST Centre, University College London, Malet Place, London, WC1E 6BT, UK k.mao@cs.ucl.ac.uk, mark.harman@ucl.ac.uk, yue.jia@ucl.ac.uk
论文摘要
Sapienz是一种Android测试方法,它使用基于多目标搜索的测试来自动探索和优化测试序列,最小化长度,同时最大化覆盖率,并进行错误标识。Sapienz包含随机模糊测试,系统测试,基于搜索的挖掘和其他多种方式。Sapienz明显表现的比先进的技术Dynodroid以及广泛使用的技术Android Monkey表现得好。当检测前1000个Google Play应用程序时,Sapienz发现558个罕见的,以前未知的崩溃。迄今为止,我们尝试联系27个被测试出崩溃的应用的开发者。在这之中有14个已经确定程序崩溃是他们的错误导致的。
截止2016年1月,在Google Play有180万手机应用。就 络市场的开发而言,比如美国,英国以及加拿大,如今,手机应用的使用量已经远超桌面应用,但是测试技术却仍未跟上,并且由于设备的差异性软件测试者面临额外的困难,由于需要考虑到多种手机设备,这无疑增加了测试的代价。据调查发现,现在的手机端测试仍然大量依赖手工测试,自动化测试的技术还是很少见。
现在大多数在手机端使用的自动化测试技术是Monkey,但是它仍有很多的弊端。Monkey通过随机生成事件序列进行自动化测试,它使用标准的,简单但有效的默认测试数据库,将任何显示崩溃的输入视为故障显示测试序列。
我们提出了Sapienz,一种多目标自动测试Android应用的方法,它可以最大化代码覆盖并显示错误,同时保证最小化测试序列长度。
图1 现有的开源和闭源的Android App自动测试工具表
上图中现有的开源自动测试工具涵盖了不少重要的测试对象,如覆盖率,测试序列长度,执行测试时间,可读性和可复制性,然而,没有人同时优化这些竞争目标,也没有提供一套像Sapienz这样的最优权衡解决方案。此外,上图中的大多数应用都需要应用的详细信息,如源码,UI模型或者接口和activity的转换模型。尽管任何此类附加信息都有助于指导测试数据的生成,但这种附加信息需求可能会阻碍简单且广泛适用的自动化。考虑到全自动Android测试的迫切需要,我们设计了sapienz方法,只需要二进制可执行文件。
图2 Sapienz工作流程
当app的源码可以拿到时,Sapienz在Statement-Level(白色框)上使用细粒度检测。相比之下,如果结果是只有二进制APK文件可用,则Sapienz使用取消绑定和重新打包在方法级别(灰色框)对应用程序进行检测。但是,如果开发人员不允许重新打包(商业应用程序中很常见),Sapienz使用一种非侵入性activity级别的“skin”覆盖,它可以随时测量(黑色框)。
sapienz通过对APK进行反编译来提取静态定义的字符串常量。这些字符串被用作在应用程序中植入真实字符串的输入,这样可以提高基于搜索的软件测试技术在基于Web的测试中的性能。测试序列由Motifcore组件生成和执行,Motifcore组件结合随机模糊和系统探索,对应两种类型的基因:低水平atomic基因和高水平Motif基因。
Sapienz的多目标搜索算法通过Motifcore的测试生成器初始化初始总体。在遗传进化过程中,遗传个体在评价个体匹配度时被分配到Test Replayer。单个测试脚本通过基因解释器进一步解码为可执行的Android事件,该解释器通过Android调试桥(ADB)与Android设备通信。状态记录器监视被测应用程序(AUT)的执行状态(如覆盖的活动、崩溃),并生成适合度提取程序的测量数据,以计算适合度。在搜索结束时生成一组帕累托最优解和测试 告。
图3 Sapienz 算法
这是Sapienz中最重要的一个算法,通过基于帕累托最优搜索的方法(Pareto-optimal Search Based Software Engineering ),Sapienz优化了三个对象:代码覆盖率,测试序列长度,以及程序崩溃的数量。
每一个执行测试组x都称为一个解决方案,根据适应度计算函数f()确定一个执行组xa是否由另外一个执行测试组xb决定。当且仅当满足下列要求时xa服从xb。
图4 执行测试组xa服从xb的充要条件
下面是帕累托最优解集xt的定义:
图5 帕累托最优解集xt
Sapienz基于搜索的方法使用NSGA-II建立连续改进的帕累托最优集,寻找新的主要测试向量。NSGA-II是一种广泛应用的多目标进化搜索算法,在SBSE研究中得到广泛应用。
在搜索结束时,测试人员可以从sapienz生成的pareto最优集中选择任何感兴趣的测试套件。除了帕累托最优解决方案外,Sapienz还为每个崩溃场景生成了一个包含一组视频的全崩溃测试套件。这个崩溃测试套件是由一个存档操作程序生成的,它存储在搜索过程中发现的任何崩溃。
Sapienz的探索化策略
Android应用程序可以在用户界面触发的事件之间进行复杂的交互。在手动测试中,测试人员的可以思考出一些复杂的交互方式,然而对于自动化测试而言,一些处理复杂的交互模式的方法必须找到。简单的Android自动化测试的方法是使用原子事件。尽管有这些事件的组合,缺乏状态信息和上下文环境使得探索复杂交互方式变得困难。这也可能是为什么许多搜索工具没有Monkey表现好的一个原因。
为了解决这个问题,Sapienz使用motif pattern,它可以收集许多的低级事件,他们对于提高测试覆盖率有着巨大作用。Motif genes是基于当前视图可获得的UI信息,他是基于Android组件的。Motif genes可以模拟用户行为模式,填充当前视图的所有输入域并且提交。
图6 Sapienz的探索策略
这是通过预先定义模式来获取测试人员与应用程序进行复杂交互的经验来实现的。motif gene的灵感是来自于motif DNA工作:DNA基序是一种具有生物学功能的短序列模式。Motifs是由原子序列组成的,他们可以展现所有DNA的功能。在我们的例子中motif genes试图去实现高级功能,并使用atomic genes实现更高的测试覆盖率。
静态和动态分析:
Sapienz有两种类型的分析策略:对字符串种子使用静态分析,对于高级测试使用动态分析。这两个特征为Sapienz产生真实测试输入提供了重要的信息,并且以高测试覆盖率产生最优的测试方案。
String Seeding:为了显著提取已经定义的字符串。Sapienz首先反编译APK文件,它从反编译的XML文件中获取一系列的全局应用字符串。通过MotifCore组件将这些字符串随机作为文本输入。我们发现当app需要大量用户产生的数据时这种方法非常有用。
Multi-level instrumentation for skeleton and skin coverage:对于无法反编译的APK,Sapienz使用多级仪表在一个或者三个等级粒度上对app进行测试。这种测试方式是可行的,它是听过activity或者screen的交互来实现黑河测试(也是我们所说的’skin coverage’),因为它只和UI进行交互。在一些例子中,即便app的源码不可获取,一个细粒度的在方法级别上的测试方案也是可行的。我么通过插入探针然后重新打包二进制文件的方式来实现。
实验结果:我们在两组开源的真实的Android App上进行的测试。第一组,我们使用来自Android benchmark的68个apps,第二组我们使用来自F-Droid的随机10个app。无论是哪一组Sapienz都表现的比Dynodroid和Monkey好。
现在Sapienz作为一个Android测试工具,已经开源使用。在Google Play中排名前1000的应用中,Sapienz发现了558个程序崩溃。并且这些程序崩溃现象已经在真机上得到证实。
致谢
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!