APP下载

面向安卓手机App功能测试技术的方法

2018-03-19程宝雷査伟忠杨季文

计算机工程与设计 2018年3期
关键词:测试工具功能测试测试用例

张 明,程宝雷,2,査伟忠,杨季文,2

(1.苏州大学 计算机科学与技术学院,江苏 苏州 215006;2.苏州大学 江苏省计算机信息处理技术重点实验室,江苏 苏州 215006)

0 引 言

目前业界普遍使用的Android手机App自动化功能测试工具按其工作方法可以划分为基于录制回放方法的测试工具、基于控件查找方法的测试工具、基于图像模糊查找的测试工具和基于模型驱动的随机操作的测试工具等几大类[1-6]。这些工具普遍存在功能测试不全面、测试用例复用性差以及需要大量手工操作等问题。

为了解决这些问题,常见的方法是采用控件遍历的方式来进行功能测试。例如,Tanzirul Azim等[7]提出的模拟用户和Android应用的交互而实现控件遍历的方法,该方法能够动态检测应用程序界面,并识别界面中的控件进行遍历,具有较高的界面覆盖率和方法覆盖率,进而提高测试的覆盖率,但是该方法需要在源码的基础上进行静态分析,因此存在一定的局限性;文献[8]中提出了在Robo-tium 框架基础上遍历App控件的方法,该方法能够增强测试用例复用性并提高了测试效率,但是同样要有源码的支持,并且需要用户自己编写测试脚本,这就要求测试人员有一定的编程基础,而且手工编写测试脚本出错的概率也比较高;百度公司的移动云测试中心[9]和东软公司的易测云[10]测试平台均提供了针对Android应用程序无源码的遍历测试功能,能够自动遍历应用程序中的控件,在遍历过程中保留访问到的界面截图并记录操作路径,这种方法能够对每个控件进行遍历,提高了功能测试的覆盖率,但是就目前的测试结果来看,自动遍历控件的效率较低,而且该平台的工具并不开源,不能为其它测试人员的研究提供帮助。

针对以上问题,本文提出了一种在标准路径引导下基于控件遍历的App功能测试方法。该方法以标准路径作为引导,采用基于深度优先搜索原理自动遍历控件得到测试用例,并使用测试用例进行功能测试。该方法在其它控件遍历方法的基础上,做了如下改进:①测试在无源码条件下进行,增强了方法的适用性。②采用标准路径作为引导,提高了测试效率。

相比一般的测试方法,该方法有以下几点优势:①生成的测试用例中包含多条测试路径,提高了测试的覆盖率;②采用不同的测试数据对测试用例进行驱动,增强了测试用例的可复用性;③提高了自动化测试程度,减少了人工干预,降低了测试过程的复杂性。文中对框架设计、脚本生成技术以及自动生成测试用例等关键技术进行了详细说明,并通过实验验证了其可行性和有效性。

1 技术分析

1.1 测试方法概述

在自动化测试[11]中,测试效率是自动化测试工具的重要指标。本文从提高功能测试的全面性和测试用例复用性方面来提高测试效率,其中测试的全面性可以通过测试路径覆盖来实现。在白盒测试中,测试路径覆盖是指选取足够多的测试数据,使程序的每条分支路径至少执行一次。在本文中,由于无法获取源程序中的分支路径,所以测试路径覆盖可看成是在测试过程中出现了多条分支路径,这些路径可以作为不同的测试方式和测试场景来对程序进行测试,帮助更好地检测出问题。

1.2 基于深度优先搜索算法的测试用例生成方法

深度优先搜索算法属于图算法的一种,其过程简要来说是对每一个可能的分支路径深入遍历到不能再深入为止,实现了图中的每一条路径的覆盖。在Android应用程序中,界面功能可以抽象成控件关系图G=(V,E,s,e)。 这里,界面中的控件集合表示为图中的节点V;控件间的执行顺序代表图中的边,其集合表示为E;s和e分别表示功能测试的开始点和结束点,同时也是界面中的控件,属于集合V。因此,对应用程序的功能测试可以看成是对图的遍历。

在自动遍历控件时,首先由人工录制一段测试脚本,并从测试脚本中提取有响应事件的控件作为标准路径,然后基于标准路径遍历界面中的控件,实现自动测试。标准路径作为图G中的一个分支路径,包括了G的开始点s和结束点e,其中结束点是标准路径中设定的验证点,目的是检测控件在自动遍历过程中是否达到预定的效果。图1展示了一个功能测试时的控件关系图。其中,s、V1、V2和e表示标准路径中的控件,V3、V4、V5、V6表示标准路径之外的有响应事件的控件。V3、V4在执行过后又能回到标准路径中去,在测试过程中是有效的测试路径,而V5和V6在执行到没有下一个控件可执行的时候仍然没有回到标准路径中去,属于无效的测试路径。采用深度优先搜索原理遍历控件,目的就是为了找到App功能测试中所有可能经过的路径,因为这些路径会对功能测试的结果产生影响,方法的执行流程如图2所示,步骤描述如下。

图2 自动遍历控件流程

(1)访问标准路径中的s点,并对其进行标记,记录对s的访问次数、操作类型等;接着获取当前界面中的控件信息并保存到xml文件中,其格式举例如下:

(2)验证是否包含e点。e点为满足功能测试的验证点,验证方法是判断当前界面中是否包含e点。例如,对登录功能进行测试,测试结束后会在界面中显示登录成功或者登录失败等文字,这些文字可看成是界面中View类型的控件,同时也是我们设定的e点。功能测试结束后,如果界面中包含验证点e,则验证通过,功能测试结束,否则转到步骤(3)。

(3)判断页面是否发生变化。在App功能测试中,对控件进行操作后可能会引起界面的变化。如果未发生界面变化,则从当前界面中选取下一个可执行控件,作为图中下一个可访问的节点s并重复步骤(1);如果界面发生变化则转到步骤(4)。

(4)当检测到有界面变化时,首先验证自动遍历控件是否偏离标准路径。本文中针对偏离标准路径的定义是指在自动遍历控件过程中出现两次界面变化,且界面中均不包含标准路径中的控件。遍历标准路径被认为与测试的功能点相差甚远,其测试结果对功能点影响不大。测试中,如果没有偏离标准路径,则获取界面中第一个可执行控件,作为图中下一个可访问的节点s并重复步骤(1);如果偏离了标准路径,则转到步骤(5)。

(5)当自动遍历控件偏离了标准路径时,就要执行页面返回操作,并保存测试路径;然后从页面中查找出最近访问的标准路径中的控件;最后从该控件开始选择下一个未访问的控件,作为图中下一个可访问的节点s并重复步骤(1)。

采用以上方法可以使程序在满足验证点前遍历出多条测试路径,每一条测试路径都表示了一个基于控件访问顺序的事件结点序列,该序列就是我们需要的测试用例。

2 设计与实现

本文首先设计一种针对Android手机App功能测试的自动化测试框架,然后在该框架的基础上实现了自动化测试工具。其主要功能包括录制脚本、生成测试用例和执行测试用例等,并满足如下特点:

(1)测试用例能够针对一个功能采用多种测试路径进行测试,实现功能测试的覆盖。

(2)测试用例能够针对不同的测试场景或不同的测试设备进行测试,增强了测试用例的复用性。

(3)从测试效果来看,在很大程度上采用自动化测试代替了功能测试中大量和重复的人工测试,提高了测试效率。

2.1 框架设计

框架设计如图3所示,它由两部分组成,分别为PC端和手机端。这两部分通过Socket和Adb进行通信。

图3 测试框架

PC端作为Socket客户端,主要功能包括:①向手机端发送指令,如“开始录制”指令,手机端在接收到指令后会开启监听input event事件功能,开始记录操作事件。②获取手机端的操作事件流,并将其转化为基于控件的脚本;③自动遍历控件生成测试用例,并根据测试用例执行功能测试。

手机端作为Socket服务端,主要提供录制脚本、获取控件信息和执行测试脚本功能,其中执行测试脚本功能是由PC端通过Adb向手机端发送可执行命令来实现。这里,Adb是直接操作和管理Android手机设备的必备工具,存在于Android的SDK当中。

2.2 标准路径生成模块设计

标准路径作为自动遍历控件中的引导路径,在生成测试用例过程中起到关键作用。标准路径是由录制脚本中的控件组成的,作用是减少无效的测试路径,其质量能够影响测试用例的好坏以及测试用例的全面性等。标准路径的质量是由测试人员录制的脚本所决定的,为了保证标准路径的质量,标准路径的生成应遵循以下几个特点:①测试人员录制的脚本要保证能覆盖所有的功能点。②录制的脚本能够正确执行,功能点得到正确的验证。③标准路径应能够根据测试用例的覆盖情况,增加或删除控件以保证测试用例的全面性。

2.3 基于控件的脚本生成技术

基于控件的脚本生成技术是指测试脚本中的元素主要是控件信息,这不仅能够提高脚本的灵活性,还能参数化脚本中的数据。本文提供了一种基于控件的脚本生成方法,并采用该方法录制测试脚本,流程如图4所示。

图4 基于控件的脚本生成流程

(1)测试人员操作手机屏幕。

(2)获取操作过程中input event事件,每次操作都会有一个对应的input event事件,事件内容如图5所示。其中ABS_MT_POSITION_X和ABS_MT_POSITION_Y分别为操作点的中心坐标,其对应的值为一个十六进制的数。测试过程中通过JNI接口调用本地native方法可获得每次触摸屏幕的事件,从事件中获取触摸点的中心坐标。

图5 事件内容

(3)通过Android辅助服务类AccessibilityService获取界面中的控件信息,包括控件的名称、类型、位置、控件坐标范围等,将步骤(2)中的坐标与控件坐标范围进行匹配即可获得操作对应的控件。

(4)对每一次操作都将其操作点的坐标转化为对应的控件,最后保存成基于控件的测试脚本。

2.4 控件自动遍历技术实现

控件的自动遍历技术是指不需要人工干预测试工具就能够自动遍历被测试程序中的所有控件。在本文实现的自动化测试工具中,我们以栈的形式存储深度优先遍历过程中访问的控件,实现方法如下:

(1)获取界面中的控件列表并将控件按照顺序保存到栈中,其中先执行的控件放在栈顶。栈中的控件的数据结构包括对应控件的名称、类型、坐标、访问次数以及是否为标准路径中的控件等。

(2)程序执行的时候首先执行出栈操作,获取栈顶控件的类型并执行相应的操作,如控件类型为Button,则执行click操作,控件类型为EditText则执行input操作;然后判断界面是否发生变化,如果界面发生变化,则获取新界面中的控件并保存到栈中并重复步骤(2),如果界面没有发生变化,则继续执行出栈操作并执行控件。

(3)当偏离标准路径时,首先执行界面返回操作,直到当前界面中的控件出现在标准路径中;然后执行出栈操作,直到出栈的控件满足存在于当前界面中且为标准路径中的控件;最后选择该控件之后的一个未执行控件并执行。当出栈控件满足验证点时,遍历结束。

2.5 测试用例生成模块设计

测试用例生成是测试工具的重要功能之一,一个好的测试用例能够帮助测试人员有效发现应用程序中的问题。本文测试用例满足以下两个条件:①满足对功能进行全面的测试。②增强可复用性。

图6中给出了生成测试用例的流程:

首先,根据测试环境,由测试人员录制测试脚本,提取脚本中的控件信息形成标准路径。

其次,以标准路径作为引导路径,采用深度优先搜索算法自动遍历控件,将控件的遍历顺序保存为测试路径。

最后,根据控件的信息,分析控件的类型并给出针对控件的测试数据,结合测试路径和测试人员设定的验证结果最终生成测试用例。

图6 测试用例生成

3 实验及结果分析

为了验证方法的可行性和有效性,本文采用基于方法实现的测试工具对一款常用的Android应用“微信”进行了功能测试,主要测试其“登录”、“发送消息”和“退出”等功能。

实验在电脑端和手机端同时进行,其中电脑端采用Windows 7操作系统,硬件平台为Intel Core2 i5-4570 3.20GHz、4G RAM;手机端采用Android 4.4操作系统,硬件平台为联发科MT6595 1.7GHz、2G RAM。实验过程如下:

(1)连接手机和电脑。打开手机wifi,让手机和电脑处于同一个局域网中,从而进行Socket通信。

(2)录制脚本。首先,电脑端向手机发送“开始录制”指令。接着,由测试人员依次完成“登录”、“发送消息”和“退出”等操作,操作过程会记录到电脑端并保存为基于控件的脚本。

(3)生成测试用例。提取(2)中录制脚本中的控件形成标准路径。通过电脑端向手机端发送“自动遍历”指令,测试工具会沿着标准路径进行控件自动遍历。当程序满足验证点的时候遍历结束生成测试用例。

(4)根据测试用例进行测试。测试分为两种情况,第一种情况是对功能进行全面测试,测试结果见表1;第二种情况对登录功能采用不同的测试数据进行测试,测试结果见表2。

表1 第一种情况测试结果

表2 第二种情况测试结果

表1的主要字段中,测试路径数表示在测试中能够有多少路径进行测试。界面覆盖数是指对功能测试过程中所访问的界面个数,其能够反映功能测试的深度。控件覆盖率是指对界面中控件的访问情况,用公式表示为

η=m/n

(1)

其中,η表示控件覆盖率,m表示测试中访问的控件数量,n表示测试中所经过的页面中的控件的总数量。控件覆盖率的提高能够反映功能测试的全面性,因为在功能测试过程中,对界面中的每一个控件访问后都有可能影响功能测试的结果。本文中控件覆盖率的测试充分性是指对界面中的每一个控件进行遍历。但是在访问控件过程中,可能会出现界面跳转,所以很难对界面中的控件全部访问,只能通过多条测试路径,尽可能地对控件进行访问。为了进一步验证本文测试工具提高了控件覆盖率,文中在相同实验条件下对比了一款基于MonkeyRunner的录制回放工具AutoTest[12]。其中MonkeyRunner是Android SDK中自带的测试工具,目前常用于自动化测试工具中,测试结果见表3。

表3 AutoTest测试结果

从表3的测试结果可以看出,AutoTest工具在测试过程中,其测试路径数满足功能测试的最低要求,即只访问能够展示功能效果的一些控件。这样一来就降低了控件覆盖率、减少了界面覆盖数,同时也降低了功能测试的全面性。采用AutoTest工具测试时,可以通过测试人员录制多条测试路径来提高控件覆盖率,但是这样会增加测试的工作量,提高测试成本。为了降低测试成本,还可以采用分析被测App代码中的逻辑结构来编写测试脚本,实现路径分支的覆盖,并提高控件覆盖率。但是这种做法需要有源码的支持,增加了测试的局限性,而且需要测试人员有一定的脚本编写能力。

从表1和表3的测试结果可以看出,本文测试用例中包含了多条测试路径,这些测试路径又能够覆盖更多的界面和界面中的控件。所以采用文本方法生成的测试用例能够有效提高功能测试的覆盖率,保证了测试的全面性。

表2中针对登录功能的测试给出了不同的输入数据。其中每一条输入数据可以由多个测试数据组成,每个测试数据都表示对控件的一次操作。当正确的输入数据出现正确的结果,不正确的输入数据出现错误的结果时,才能证明功能是好的。从表2的测试结果中可以看出,相同的测试脚本可以采用不同的测试数据进行测试,测试用例在测试过程中只需要获取App中的控件信息即可。这也保证了其在不同测试平台或设备上的通用性,验证了测试用例的可复用性。

4 结束语

本文提出了一种在标准路径引导下基于控件遍历的App功能测试方法,实现了基于深度优先搜索算法来自动生成测试用例。根据该方法实现了一个测试工具,并在实际环境中进行实验。实验结果表明,采用该方法能够提高功能测试的覆盖率以及增强测试用例的复用性,这也验证了本文方法的可行性和有效性。目前,基于本文提出的方法已基本完成了针对Android原生App的功能测试,对控件之间逻辑关系简单的界面取得了良好的测试效果。未来工作计划主要包括两方面:一方面继续优化本文提出的方法,对一些特殊和复杂的界面设计更加智能的控件遍历方法;另一方面,我们将在本文方法的基础上实现对包含HTML5界面的App进行功能测试。

[1]Lin Y,Rojas JF,Chu ET,et al.On the accuracy efficiency and reusability of automated test oracles for Android devices[J].IEEE Transactions on Software Engineering,2014,40(10):957-970.

[2]YANG Yijun,HUANG Daqing.Research and development of automated performance test tool for Android smartphone[J].Journal of Computer Applications,2012,32(2):554-556(in Chinese).[杨怡君,黄大庆.Android手机自动化性能测试工具的研究与开发[J].计算机应用,2012,32(2):554-556.]

[3]PENG Shunshun.The research and design of software component testing framework based on date-driver[D].Shenyang:Shenyang Normal University,2014:1-32(in Chinese).[彭顺顺.基于数据驱动的软件组件测试框架的研究与设计[D].沈阳:沈阳师范大学,2014:1-32.]

[4]Anbunathan R,Basu A.Data driven architecture based automated test generation for Android mobile[C]//IEEE International Conference on Computational Intelligence and Computing Research.Piscataway:IEEE,2015:1-5.

[5]ZHAO Yaozong,CHENG Shaoyin,JIANG Fan.Automatic method for GUI traversal in Android applications[J].Computer Systems & Application,2015,24(9):219-224(in Chinese).[赵耀宗,程绍银,蒋凡.Android应用程序GUI遍历的自动化方法[J].计算机系统应用,2015,24(9):219-224.]

[6]ZHONG Shucheng.The design and implementation of Android GUI automated testing tool based on recording and playback method[D].Beijing:University of Chinese Academy of Sciences,2015:9-24(in Chinese).[钟书成.基于录制回放的Android GUI自动化测试工具的设计与实现[D].北京:中国科学院大学,2015:9-24.]

[7]Azim T,Neamtiu I.Targeted and depth-first exploration for systematic testing of android apps[J].Acm Sigplan Notices,2013,48(10):641-660.

[8]ZHU Yangyang,HOU Yonghong,WANG Baoliang.Application of automatic test tool Robotium for Android[J].Information Technology,2015,39(10):198-200(in Chinese).[祝阳阳,侯永宏,王宝亮.Android自动化测试工具Robotium的应用与研究[J].信息技术,2015,39(10):198-200.]

[9]Baidu Inc.MTC[EB/OL].[2016-12-11].http://mtc.baidu.com(in Chinese).[百度公司.百度移动云测试中心[EB/OL].[2016-12-11].http://mtc.baidu.com.]

[10]Neusoft.Yiceyun[EB/OL].[2016-12-11].http://www.yiceyun.com(in Chinese).[东软公司.易测云[EB/OL].[2016-12-11].http://www.yiceyun.com.]

[11]HOU Minju.Research on Android-based keyword-driven automated testing framework[D].Guangzhou:Sun Yat-Sen University,2012:6-60(in Chinese).[侯敏菊.基于Android的关键字驱动自动化测试框架研究[D].广州:中山大学,2012:6-60.]

[12]WAN Mulin.Design and implement of functional test software for android cellphone application[D].Suzhou:Soochow University,2015:1-62 (in Chinese).[万木林.面向Android手机应用的功能测试软件[D].苏州:苏州大学,2015:1-62.]

猜你喜欢

测试工具功能测试测试用例
某内花键等速传动轴八功能测试夹具设计
基于SmartUnit的安全通信系统单元测试用例自动生成
Http并发连接测试工具
基于混合遗传算法的回归测试用例集最小化研究
手车式真空断路器回路电阻测试电流线接头研究
福禄克推出先进的连接式测试工具系统
基于依赖结构的测试用例优先级技术
软件回归测试用例选取方法研究