一种安卓应用的相关手势投放测试框架的制作方法

文档序号:12120588阅读:250来源:国知局
一种安卓应用的相关手势投放测试框架的制作方法与工艺

本发明涉及一种测试框架,特别是一种安卓应用的相关手势投放测试框架。



背景技术:

安卓是一个开放源代码的移动操作系统平台,近年来它占据了移动设备市场的极大份额,应用开发者发布了数量巨大的安卓应用。不同于桌面应用,安卓应用往往是触控手势驱动的。开发者在一个应用中的不同控件上接受并处理特定的手势,从而实现特定的功能。例如,对于一个浏览图片的应用,在图片列表上长按可能会呼出上下文菜单,从而对图片进行编辑等操作,而在图片浏览界面上进行滑动则可能产生切换图片的效果。

这些触控手势的存在使得彻底且高效的安卓应用自动化测试变得困难。事实上,传统工作大多不能分析一个安卓应用可能接受的手势(相关手势)。部分工作在测试时仅考虑最简单的点击手势,显然这样的工作会漏掉相当多的有意义的手势,从而降低测试的覆盖率。部分工作设计了手势库,在测试时随机从手势库中选择手势,投放在安卓应用上,这样的测试方法是不彻底的,因为漏掉有意义的手势的问题同样因为随机性而存在。部分工作则选择枚举手势库中的全部手势,逐个投放在安卓应用上,这样的测试是低效的,因为它会尝试过多的没有意义的手势,使得测试耗费过长的时间。为了达到对安卓应用的彻底而高效的测试,实现对安卓应用的相关手势投放迫在眉睫。



技术实现要素:

本发明所要解决的技术问题是提供一种能够进行高效测试的安卓应用的相关手势投放测试框架。

为解决上述技术问题,本发明所采用的技术方案是:

一种安卓应用的相关手势投放测试框架,其特征在于:包含静态分析模块和运行时手势投放模块,静态分析模块用于分析出一个原始安卓应用的各个控件的相关手势信息,运行时手势投放模块基于相关手势信息,将手势库中的部分手势投放在安卓应用上展开测试。

进一步地,所述运行时手势投放模块提供一个手势库,与相关手势信息共同服务于手势投放算法以确定下一个投放的手势是什么,手势投放算法服务于应用遍历算法,应用遍历算法可以适配到任何的自动化测试工具中,展开测试,并获取测试的结果。

进一步地,所述静态分析模块的工作流程为,对于一个原始安卓应用,静态分析模块分析出原始安卓应用的四种手势识别代码的相关手势信息,若应用中找不到其中任何一种代码,则表明这个应用没有复杂的手势交互,测试时刻只尝试简单的点击操作;若找到一种代码,则按照手势识别代码的类型,分别处理。

进一步地,所述四种手势识别代码包含基于安卓手势识别库、基于开发者自行识别手势、基于安卓手势保存及加载库和基于安卓特定控件的手势识别代码;其具体操作过程为:

当手势识别代码为基于安卓手势识别库的手势识别代码时,静态分析模块通过可达性分析技术,分析出一个控件与它的手势识别类的被覆盖方法的对应关系,从而获取这个控件的相关手势;

当手势识别代码为基于开发者自行识别手势的手势识别代码时,静态分析模块扫描敏感API,若发现敏感API被调用,则表明多点触控手势为相关手势;

当手势识别代码为基于安卓手势保存及加载库的手势识别代码时,静态分析模块直接假定多点触控手势为相关手势;

当手势识别代码为基于安卓特定控件的手势识别代码时,静态分析模块设计一个数据库,提前存储特定控件与相关手势的映射关系,从而直接获取某个控件的相关手势。

进一步地,所述运行时手势投放模块的工作流程为,构建手势库,把它与相关手势信息结合,共同服务于手势投放算法,从而产生下一个将要被投放的手势;测试人员把应用遍历算法集成到底层自动化测试工具中;将要被投放的手势服务于应用遍历算法,应用遍历算法又借助底层测试工具的执行力,真正地开展测试,完成测试,最终得到测试结果。

进一步地,所述手势库包含简单点击手势、常用的规则手势和不常用的多指手势,常用的规则手势主要包含长按、双击、滑动、滚动、放缩,不常用的多指手势主要包含多指滑动、多指放缩、以及无规则多指手势。

进一步地,所述运行时手势投放模块内设置有录制-回放工具,对于不常用的多指手势,预先录制好一些不常用的多指手势,在测试时刻只需进行回放即可。

进一步地,所述手势投放算法的流程为,将手势库与相关手势信息结合得到投放相关手势全集,将相关手势全集内的相关手势逐一进行投放并记录投放到第几个,避免重复。

进一步地,所述应用遍历算法流程为,维护一个全局的集合为S,表明已访问过的状态的集合;一次执行中,初始状态为u,二元组为π,首先调用手势投放算法,获取下一个将被投放的手势g,若g为空则表明此状态下测试完全,直接返回,否则将下一个手势实际投放给被测试的安卓应用;投放后,获取新的状态v,若则设置S=S∪{g},并以参数v,π.append(<g,v>)递归调用本算法;否则先判断v是否等于u,若等于,则直接尝试下一个手势,否则需要回溯至状态u以尝试下一个手势。

进一步地,所述回溯至状态u,应用遍历算法首先尝试点击物理Back键,获取新的状态k,若存在<gi,si>∈π且si==k,则投放gi+1,gi+2,…g|π|;若不存在,则重启应用,从头开始投放全部gi,实现回溯至状态u。

本发明与现有技术相比,具有以下优点和效果:本发明对一个将要被测试的安卓应用首先进行静态分析,获取这个安卓应用的每个控件可能接受的手势,然后在实际测试过程中,对于每个控件,只投放与之相关的手势,本发明对于安卓应用的静态分析与动态测试都是自动的,对于底层测试工具的依赖性是低的,使用方式是易学的。本发明自动对一个安卓应用进行静态分析以提取这个应用每个控件可能接受的手势,然后把这部分信息提供给运行时手势投放模块,该模块可以适配到当前绝大多数安卓应用的自动化测试工具中,换言之,它与自动化测试工具是松耦合的,兼容性较好。最终通过相关手势的投放,提高整个测试的覆盖率以及效率。

附图说明

图1是本发明的一种安卓应用的相关手势投放测试框架的结构图。

图2是本发明的静态分析模块的流程图。

图3是本发明的运行时手势投放模块的流程图。

图4是本发明的手势库的结构图。

图5是本发明的手势投放算法的流程图。

图6是本发明的应用遍历算法的流程图。

具体实施方式

为了更清楚的对发明进行说明,首先,对一些用词进行解释。

所述安卓应用是指一个可以在安卓移动设备上安装并运行的应用,当明确对之进行操作时特指这个应用的安装包文件,扩展名为apk。

所述安卓应用的字节码是安卓应用的本质,它由若干个类文件组成,这些类中各自包含若干方法,这些类中的方法通过合作,共同实现特定的功能。

所述相关手势是指一个控件上可能接受并处理的手势,这样的手势往往是由开发者指定并编程识别并处理的,也是所述静态分析模块需要分析出的。

所述手势投放是指在测试时刻利用各种途径生成特定的手势,然后把这样的手势操作在当前的界面的某个控件上。

所述静态分析模块是指对安卓应用的apk文件进行字节码分析,获取这个应用的各个控件的相关手势。

所述运行时手势投放模块是指在某个自动化测试工具的支持下,实现对安卓应用的各个状态的遍历的逻辑,以及在这个过程中投放相关手势的策略,它不依赖于任何一个特定的自动化测试工具。它由手势库、应用遍历算法和手势投放算法组成。

所述手势库是指所有可能的手势的集合,在动态测试时所有的手势都来源于此。

所述应用遍历算法是指根据一定的规则,向安卓应用上实施特定的操作,使得尽可能多地访问安卓应用的不同状态。

所述手势投放算法,是指从手势库中根据特定的策略选择将要被投放的手势。

下面结合附图并通过实施例对本发明作进一步的详细说明,以下实施例是对本发明的解释而本发明并不局限于以下实施例。

如图1所示,本发明实施例提供的针对安卓应用的相关手势投放的测试框架,由一套静态分析模块和一套运行时手势投放模块构成。对于一个原始安卓应用,首先通过静态分析模块,分析出它的各个控件的相关手势信息。然后,在运行时手势投放模块中,提供一个手势库,与相关手势信息共同服务于手势投放算法,以确定下一个投放的手势是什么,此算法又服务于应用遍历算法。应用遍历算法可以适配到任何的自动化测试工具中,展开测试,并获取测试的结果。

本测试框架与底层的自动化测试工具是低耦合的,因为静态分析模块是一个独立的模块,不依赖于任何别的工具,一旦获取了相关手势信息,那么后续工作无需静态分析模块的参与。而运行时手势投放模块,其核心主要是一整套投放策略,投放策略又独立于真正投放的操作。事实上,运行时手势投放模块对于底层自动化测试工具的最低要求仅有一点:能够获取当前应用的布局信息以及各个控件信息,从而可以获取当前应用的状态信息。而真正的手势投放,既可以由底层自动化测试工具实现,也可以使用本测试框架的默认实现(基于Uiautomator等安卓SDK提供的工具)。此外,还需要一个比较好的录制-回放工具,测试人员可以自行选用以实现多点非常规手势。

图2描述了静态分析模块工作的流程图。对于一个原始安卓应用,本模块可以分析出它的四种手势识别代码的相关手势信息。如果这个应用中找不到任何一种这样的代码,则表明这个应用可能没有复杂的手势交互,因此测试时刻只会尝试简单的点击操作。否则,按照手势识别代码的类型,分别处理。

如果是基于安卓手势识别库的,那么开发者会通过覆盖方法(override method)的方式表明对某些手势感兴趣,加以监听,实现特定的处理方法。因此,本模块通过可达性分析技术,分析出一个控件与它的手势识别类的被覆盖方法的对应关系,从而获取这个控件的相关手势。

如果是基于开发者自行识别手势的,那么开发者其实是分析触控屏幕的原始数据,然后通过阈值检查、数据挖掘等方法确定要识别的手势,并加以处理。在此情况下,不可能精确分析出相关的手势。但是实验发现,当开发者调用某些敏感API(如findPointerIndex(int),getPointerCount()等)时,往往表明开发者希望处理的是一个多点手势。因此,本模块扫描敏感API,如果发现这样的API被调用,则表明多点触控手势为相关手势。

如果是基于安卓手势保存及加载库的,那么开发者可能手工绘制某个手势,保存下来,当应用启动后,再次绘制,通过与保存下来的手势进行比较,从而识别这个手势。可见这样的手势不是安卓系统预设的,因此也几乎不可能分析出。在此情况下,本静态分析模块直接假定多点触控手势为相关手势。

如果是基于安卓特定控件的,那么当开发者使用这样的控件的时候,就直接表明了某些手势是相关的。比如ViewPager,Gallery等控件,直接与左右滑动手势是相关的。因此,本静态模块设计了一个数据库,提前存储了特定控件与相关手势的映射关系,从而可以直接获取某个控件的相关手势。

图3描述了运行时手势投放模块的结构。首先,基于一定的方法,构建手势库,把它与相关手势信息结合,共同服务于手势投放算法,从而产生下一个将要被投放的手势。测试人员需要把应用遍历算法集成到某个底层自动化测试工具中,对于不同的底层测试工具,可能要求对原始安卓应用进行插桩等预处理(以统计代码覆盖率等)。将要被投放的手势服务于应用遍历算法,应用遍历算法又借助底层测试工具的执行力,真正地开展测试,完成测试,最终得到测试结果。

图4描述了手势库的结构。在本测试框架中,主要包括三类手势。首先是最简单的点击手势,几乎所有安卓自动化测试工具都应该可以生成这样的手势。其次是常用的规则手势,例如长按、双击、滑动、滚动、放缩等,这样的手势也是开发者使用最多的。当前比较流行的安卓自动化测试工具,例如安卓SDK中提供的Uiautomator可以产生这样的手势。最后就是一些不常用的多指手势,这里主要包括了多指滑动、多指放缩、以及无规则多指手势。事实上,开发者往往会假定使用者使用双指完成放缩等手势,那么进行多指手势的测试可能会暴露应用的缺陷,对于测试是有益的。然而这样的手势难以直接用原始触控数据表示,因此本测试框架基于录制-回放工具,预先录制好一些不常用手势,这样在测试时刻只需回放这样的手势即可。

图5描述了手势投放算法的流程。投放什么手势取决于两个因素:手势库、投放策略。前者表明了可能投放的手势的全集,后者则是从全集中选出一个真子集进行投放。这里投放策略主要是用于效果的对比。最简单的策略是仅点击,在此情况下,投放的手势只有点击操作。另一个简单的测试是选择全部,在此情况下,投放的手势包括手势库中的全部手势。本投放算法会记录某个状态下已经投放到了第几个,从而可以避免重复。以上两个策略都是与具体的安卓应用无关的,前者覆盖率较低,后者效率较低。本测试框架的默认策略是投放相关手势,即结合了相关手势信息,只投放相关的手势,同样它避免了重复的问题。实验表明,它可以在比较高效的情况下,达到比较高的覆盖率。

图6描述了应用遍历算法的流程。此算法的亮点在于结合了手势信息,同时比较好的解决了安卓应用测试中的回溯问题。为了解决回溯问题,这个算法的参数包括当前的状态,以及之前的<操作,状态>二元组的列表。为了全局去重,需要维护一个全局的集合S,表明已访问过的状态的集合。

某次执行中,初始状态为u,二元组为π,首先调用手势投放算法,获取下一个将被投放的手势g,如果没有则表明此状态下测试完全,直接返回,否则将下一个手势实际投放给被测试的安卓应用。投放后,获取新的状态v。如果则表明这是一个新的状态,是有意义的,因此需要进一步遍历,从而设置S=S∪{g},并以参数v,π.append(<g,v>)递归调用本算法。否则先判断v是否等于u,如果等于,则表明本次操作是无意义的,没有改变状态,因此可以直接尝试下一个手势。否则需要回溯至状态u以尝试下一个手势。

对于回溯至状态u,本算法首先尝试点击物理Back键,获取新的状态k。如果存在<gi,si>∈π且si==k,则表明点击Back后的状态是之前访问过的,那么为了回溯到状态u,其实只需要投放gi+1,gi+2,…g|π|即可。如果不存在,则采取保守策略,重启应用,从头开始投放全部gi,也就实现回溯到了状态u。事实上,借助二元组列表,绝大多数情况下,点击Back都是回到了之前遍历过的某个状态,因此相比传统工作的从头开始,可以大大提高效率。

本说明书中所描述的以上内容仅仅是对本发明所作的举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种修改或补充或采用类似的方式替代,只要不偏离本发明说明书的内容或者超越本权利要求书所定义的范围,均应属于本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1