一种基于依赖注入的安卓应用半自动化测试方法与流程

文档序号:11729279阅读:388来源:国知局
一种基于依赖注入的安卓应用半自动化测试方法与流程

本发明涉及移动应用测试领域,具体涉及的是一种基于依赖注入的安卓应用半自动化测试方法。



背景技术:

随着智能手机的流行,移动app逐渐成为我们日常生活的一部分,安卓系统由于其系统和设备的碎片化,导致目前很多app无法做到充分测试,我们可以从安卓市场的差评中看出很多应用存在缺陷。目前移动测试技术主要分为人工测试和自动测试,通常认为人工测试耗时耗力且容易出错,不过人类是智能的,能够产生有价值的测试用例,提升测试效果。安卓由于其开源特性以及巨大的市场份额吸引了一批研究者们研究并开发出了很多自动化测试工具,其中monkey是安卓框架实现的随机测试工具,通过大量随机事件进行尝试,擅长发现普通操作下无法发现的错误,但效率不高,需要大量运行。

目前已有的测试工具主要聚焦于通过不同的测试策略探索应用功能并产生测试事件,但我们发现这些测试工具在一些特定的安卓应用下效果不尽如人意,其主要原因在于没有将测试依赖的问题考虑进去。安卓应用要正确运行需要很多的外部依赖,比如音乐播放器需要音乐文件才能播放,邮件客户端需要用户提供可用的邮箱账户才能访问其主要功能,如果不提供这些依赖,自动测试工具很难通过产生事件的方式到达真实用户可以轻易到达的应用状态,因而测试这些应用的主要功能也变得几乎不可能。



技术实现要素:

针对现有技术存在的问题,本发明提供了一种基于依赖注入的安卓应用半自动化测试方法,能够结合人工测试和随机测试的优点,在测试的过程中提供应用正确运行所需要的各种依赖,提高测试覆盖率以及高效检测bug。

本发明的技术解决方案是:一种基于依赖注入的安卓应用半自动化测试方法,所述方法包括以下步骤:

a.首先对目标应用进行插装,在对目标程序代码插装时,执行如下操作:

a1.通过xposed框架持续对android系统载入的包进行检测,在检测到待测试应用程序的包被加载后,xdroid模块开始进行代码插装操作。

a2.根据应用被批准的权限列表,使用xposed提供的钩子函数进行依赖相关api的处

理函数注册,防止不必要的处理消耗。

a3.在应用的application.oncreate方法被调用后,创建随机测试线程xmonkey。

b.在对应用进行随机测试过程时,执行如下操作:

b1.在activity.onresume方法被调用后,测试线程被激活,开始产生事件,若测试线程长时间没有遍历到新的activity则由通知模块发出通知,请求用户干预。在设备界面上提供可以随时切换人工和测试模式的悬浮窗,并在测试过程中收集activity覆盖率和缺陷信息。

b2.在activity.onpause方法被调用后,应用界面暂停,测试线程停止产生事件,等待下一次app处于前台的时刻。

b3.在应用被销毁后,应用进程被销毁,则处于应用进程中的测试线程也随之销毁

c.当应用执行依赖相关函数时,执行依赖注入。在依赖注入过程中,执行如下操作:

c1.如果依赖没有缺失,则不做任何操作。

c2.如果被调用函数为内容型依赖,由注入模块进行自动依赖注入。通过xposed框架提供的钩子函数,判断其请求的内容和结果,如果内容缺失则生成相关资源。

c3.如果被调用函数依赖需要用户进行干预,由通知模块通知用户进行手动依赖注入。

进一步的,步骤a1中,所述xposed框架为安卓系统中一款可以在不修改apk的情况下影响程序运行(修改系统)的框架服务,安装该框架需要取得安卓系统的root权限。该框架通过文件管理器将安卓系统的zygote程序进行替换,对生成的新进程进行反射拦截,为特定的函数注入新的代码。

所述xdroid模块为根据本发明所开发的xposed模块,可运行在xposed框架中,提供依赖注入以及自动化测试的功能,安装该模块后需要在xposed框架中选中启用该模块并重启手机激活。

进一步的,步骤a2中所述依赖相关api包括但不限于列表中标识出的依赖相关接口:

所述钩子函数为xposed框架提供的用于对特定函数添加代码的辅助函数:

publicfindandhookmethod(stringclassname,classloaderclassloader,stringmethodname,object...parametertypesandcallback);

其中classname为函数所在类名,classloader为指定的类加载器,methodname为待替换函数名,parametertypesandcallback为参数类型列表和hook回调。

进一步的,步骤b1中所述产生的事件为仿照monkey测试工具生成的点击,按键,滑动,跟踪球,导航,主要导航,系统以及两指缩小事件,其生成比率分别是点击20%,按键13%,滑动10%,跟踪球15%,导航25%,主要导航15%,系统事件1%,两指缩小2%。

所述悬浮窗是指使用android提供的windowsmanager开发的系统窗口,该窗口中含有可以切换人工测试和自动测试的开关,并且该窗口一经打开可以在设备界面中一直存在并且随时访问。

所述activity覆盖率是指测试工具在测试期间遍历到的activity的数量对activity总量之间的比率。遍历到的activity可以通过勾住android.app.activity.oncreate函数进行收集,总的activity可以通过packagemanager的getpackageinfo方法获取。

所述缺陷是指应用在被测试过程中产生的错误,包括应用崩溃和应用无响应两种情况。应用崩溃可以通过勾住com.android.server.am.activitymanagerservice.handleapplicationcrash函数获取崩溃信息。应用无响应可以通过勾住com.android.server.am.activitymanagerservice.appnotresponding获取无响应错误的相关信息。

进一步的,步骤c中,所述依赖包括内容,权限,设备能力,用户干预和其他依赖。内容是指android设备中可以存储的通用数据,包括联系人信息,日程事件,媒体文件等。权限是指安卓应用在使用相关系统数据和特性前需要向用户申请的系统权限,包括所有在androidmanifest文件中可以列出来的所有权限,比如读取联系人和信息等权限。设备能力是指安卓设备提供的各种设备能力,包括gps,网络,摄像头,蓝牙等。用户干预是指用户提供的有价值的数据和操作,包括打开wifi开关,用户名密码等。其他的依赖是指应用在运行过程中可能依赖的各种特殊资源,比如其他要连接的设备等。

进一步的,步骤c2中内容型依赖是指可以通过程序自动自动产生的数据以及媒体文件,比如gps位置和音乐文件等。对于内容型依赖自动注入生成的数据以及将存储在xdroid中的媒体文件写入到系统中供调用。

进一步的,步骤c3中用户进行干预是指必须通过用户手动注入的依赖,包括连接网络,输入用户名密码等。对对于用户型依赖通知用户进行介入并提供与依赖相关的信息,包括该依赖所要求的人工处理方式以及与该依赖相关的参数信息,如需要打开wifi开关,后台服务器地址等。

有益效果:与现有技术相比,本发明具有以下优点:

(1)本发明结合了人工测试和随机测试的优点,在应用测试的过程中用户能随时停止自动测试过程,提供人工交互,发挥了人工方式能够解决复杂交互和提供用户依赖的优势和随机测试能够发现意想不到的缺陷的特点,提高了代码的覆盖率以及有效寻找到应用的bug。

(2)本发明以一种轻量的方式自动检测在应用测试过程中的依赖请求,并自动提供资源型依赖,对于用户依赖,提供了方便的方式进行人工干预,解决了在自动测试过程中依赖缺失的问题,提高了自动化测试的效率和质量。在测试过程中人工参与时间逐渐减少,一般不超过总测试时间的10%。

(3)本发明中的测试自动化工具不需要任何pc机连接,完全使用智能手机的处理能力,可以在任何时间任何地点同时在多台手机上进行测试,大大减少了器材的消耗,并提供了并行测试的能力。

(4)本发明的基于依赖注入的安卓应用半自动化测试方法,能够结合人工测试和随机测试的优点,通过利用xposed框架,获取应用调用相关的系统依赖请求,在测试的过程中提供应用正确运行所需要的各种依赖,提高测试覆盖率以及高效检测bug。

附图说明

图1为本发明的实施例流程图。

图2为本发明的系统架构示意图。

图3为本发明的测试工具生命周期图。

图4为本发明的悬浮窗示意图。

具体实施方式

下面对本发明技术方案结合附图进行详细说明,但是本发明的保护范围不局限于所述实施例。

本发明提供一种基于依赖注入的安卓半自动化测试方法,使得应用在被测试期间能够自动检测相关依赖并提供资源,使得测试程序能够更好的探索应用功能,提高测试效率。

在android测试技术中,由于被测试应用没有被提供所依赖的资源,导致一些用户很容易进入的状态在自动化测试过程无法被覆盖。

xposed框架是一款可以在不修改android安装包(apk)的情况下影响程序运行的框架服务,基本原理是通过修改系统来影响程序运行。xdroid是根据本发明提供的方法开发的基于xposed框架的依赖注入以及自动测试模块,xdroid模块(202)中包括方法钩子,注入模块以及通知模块。

本发明所提供的基于依赖注入的半自动测试方法包括目标程序代码插装过程,随机测试过程,依赖注入过程,具体步骤如下:

a.在安卓设备上运行选定要测试的应用,该android程序作为待测试的目标程序,通过xposed框架进行依赖相关代码(203)的插装,添加钩子函数;对目标程序进行插装时,执行如下操作:

a1.持续对android系统载入的包进行检测,在检测到待测试应用程序的包被加载后,开始代码插装操作。

a2.根据应用被批准的权限列表进行相应类型的依赖处理函数注册,防止不必要的处理消耗,被注册的依赖处理函数类型包括设备内容,蓝牙,位置,网络等。

a3.在应用的application.oncreate方法被调用后,创建随机测试线程xmonkey,我们处于应用进程内部,此时应用已经加载完毕并处于可用状态,此时我们创建随机测试线程,该测试线程通过获得的应用上下文对象获取应用信息。

b.被测应用打开时,在应用进程内部创建随机测试线程(201),开始生成各种随机事件进行测试,在设备界面上提供可以随时切换人工和测试模式的悬浮窗,并在测试过程中收集activity覆盖率和缺陷信息;具体执行如下操作(如图3所示):

b1.在activity.onresume方法被调用后,应用处于前台,测试线程被激活,如果用户打开了悬浮窗中的测试开关,则开始产生事件。

为了提供给用户最快捷的切换人工模式和测试模式的方式,本实施例使用悬浮窗作为切换方式。悬浮窗是指使用android提供的windowsmanager开发的系统窗口,并且该窗口一经打开可以在设备界面中一直存在并且随时访问。在默认模式下(图4)悬浮窗可以被拖动并停靠在设备的边框,当用户点击后悬浮窗展开为一个系统窗口(图4),用户可以在这里开启或关闭测试模式。

本实施例中产生的随机事件为仿照monkey测试工具生成的点击,按键,滑动,跟踪球,导航,主要导航,系统以及两指缩小事件,其生成比率分别是点击20%,按键13%,滑动10%,跟踪球15%,导航25%,主要导航15%,系统事件1%,两指缩小2%。

在原monkey的实现中,其使用iwindowmanager和iactivitymanager实例来注入事件,但这两个实例都是系统对象,在普通应用中无法使用。因此在本实施例中我们使用instrumentation测试框架来替换注入事件的方法,例如使用sendkeydownupsync方法来发送按键事件。

b2.在activity.onpause方法被调用后,应用界面暂停,测试线程停止产生事件,等待下一次app处于前台的时刻。

注意测试线程的启动条件由两个开关组成,只有在应用处于前台并且用户打开了测试开关的情况下测试线程才会产生事件,这样可以避免无意义的性能消耗,提高测试效率。

b3.在应用被销毁后,应用进程被销毁,则处于应用进程中的测试线程也随之销毁。

c.在随机测试过程中,当应用执行依赖相关函数时,进行依赖请求的检测与注入;具体执行如下操作(如图1所示):

c1.如果依赖没有缺失,则不做任何操作。

c2.对于101中内容型依赖缺失,由注入模块进行自动依赖注入。

应用请求设备内容的依赖所调用的函数为contentresolver.query。处理方式为获取该函数调用时的uri,判断其请求的内容的类型,以及请求的结果列表,如果内容缺失则生成相关资源。图1的101部分为具体的内容类型,如图片,联系人,音乐,视频,短信,电话等。

在本实施例中,如102所示,当检测到应用请求图片时,将存储在xdroid中的3张jpg图像和3张png图像添加到系统的图库中去。当检测到应用读取联系人时,生成10个预先设置的联系人信息并插入到系统联系人列表中。当检测到应用读取音乐文件时,将存储在xdroid中的3个mp3文件添加到系统的音乐库中。当检测到应用读取视频文件时,将存储在xdroid的1个mp4文件添加到系统的媒体库中。当检测到应用读取短信息时,生成随机的10条短信息并插入到系统的信息列表中。当检测到应用读取电话记录时,生成随机的10条通话记录并插入到系统的通话记录列表中。

c3.对于103中的用户型依赖缺失,由通知模块通知用户进行手动依赖注入。

应用请求蓝牙设备时调用的函数为bluetoothadapter.getdefaultadapter。处理方式为获取该函数返回的结果即蓝牙适配器,如果该结果为空,则通知模块通知用户设备无蓝牙。如果设备没有被打开,则通知用户打开蓝牙开关。

应用请求当前物理位置时调用的函数为wifimanager.getscanresults,telephonymanager.getcelllocation,locationmanager.requestlocationupdates。处理方式为判断返回的结果列表,如果结果为空则通知用户打开对应的开关,比如wifi,4g网络,gps开关等。如果用户允许生成假的位置信息,则返回随机生成的经度和纬度信息。

应用请求网络访问时调用的函数为url.constructor,httpurlconnection.getresponsecode,androidhttpclient.execute,webview.loadurl。处理方式为在应用访问网络的时候判断网络是否打开以及判断放回结果的返回码是否为400,如果是的话则网络请求失败,通知用户连接网络。

在本实施例中,如104所示,当检测到无法读取gps信息,无法访问网络,无法自动拍摄照片等无法通过程序自动完成的依赖时,通知模块会发送铃声通知以及相应的信息(toast)给用户,让用户帮助程序完成依赖注入。对于权限的赋予,程序无法帮助用户进行授权,需要用户手工打开设备中的权限开关。对于用户名密码等用户数据依赖无法在程序运行过程中自动填入,在应用很长时间后没有探索到新的应用状态时通知用户查看时候有用户数据依赖没有被赋予,在本实施例中我们设定500个事件长度仍无新的activity探索到则发送通知。

需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。

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