杜巍
摘要:基于软件自动化测试框架的思想以及软件测试项目的实际需求,为提高Android移动应用软件自动化测试的高效性及灵活性,提出了一种高可复用的自动化混合测试框架。该框架利用uiautomator工具,基于Java反射机制,结合模块化思想和测试库思想,以数据驱动和关键字驱动为核心,使测试用例与测试代码相关联,并将业务逻辑、测试数据与测试代码相隔离。该框架可做到测试执行与开发松耦合、自动化程度高,便于快速有效地开展Android移动应用软件的测试。
关键词:Android应用软件 自动化测试 混合测试框架 Java反射机制
1 引言
伴随着移动互联网的飞速发展以及智能手机的普及应用,移动应用程序(APP)层出不穷。移动APP具有种类多、更新快、升级频繁、应用环境多样化、稳定性要求高及并发量大等特点,如何开展高质量的测试来保证移动APP的质量从而提升用户体验越来越受到业界的关注。
传统的手工移动APP测试工作量大、重复性工作多,将耗费大量人力和时间,效率低下且纯手工测试无法完成高精度的压力测试、并发测试、负载测试及稳定性测试等。自动化测试可以有效地提高测试执行效率并控制测试成本开销,但一个设计不够科学合理的自动化测试框架,不仅不能提高效率,反而会增加构建成本,同时带来无休止的维护工作。为了提升测试执行的有效性同时避免测试项目中编写大量的重复代码,如何构建一个强鲁棒性、便于维护、高度可扩展的移动APP自动化测试框架是本文主要研究的内容。
2 自动化测试框架的思想研究
自动化测试框架指测试对象的识别方法,基本界面元素的封装,测试环境的初始化及清理,错误的捕获和处理恢复,还包含测试脚本的组织和管理[1]。为解决一般自动化测试过程中遇到的模块耦合度高、可复用性差、可配置化低等问题,本文结合以下几种自动化测试框架的思想,设计出一套混合模型的自动化测试框架。
本文涉及到的自动化测试框架思想主要有以下内容:
(1)模块化思想
模块化思想利用抽象和封装将测试代码的操作隐藏,只对外提供一个接口用来执行测试,从而框架的设计不必关注具体的应用和相关细节,同时可避免其他模块代码的变更对测试项目的执行产生不利干扰[3]。本文运用模块化思想将测试功能点中不同测试点加以拆分,并将拆分后的测试点的测试步骤进行封装,形成测试模块[2]。
(2)测试库思想
本文利用测试库思想为应用程序的测试创建了包含一系列函数集合的库文件[11]。将APP测试常用操作以组件的形式进行封装,结合模块化思想,可通过接口去传递参数,实现模块之间的交互。
(3)数据驱动思想
数据驱动思想体系如图1所示,其核心就是把执行测试所需的数据从测试脚本中抽象出来,存储在外部数据文件中,例如XML文件、数据库、文本文档、Excel表格等[5]。这种思想规避了脚本代码和数据的高耦合性,大大提高了测试脚本的可复用性。
本文利用数据库驱动思想,通过不同的数据驱动结果,用同一个测试过程对不同的输入和输出组合进行测试。测试输入数据和预期输出结果构成一张表,表中的每一行代表着每一个测试步骤,进而构建一个自动化测试过程。
(4)关键字驱动思想
关键字驱动将实际的测试用例与程序编码分离,在对测试用例进行修改时,无需进行代码维护,该思想不仅把测试数据从软件测试脚本代码中抽离出来,也可分离测试逻辑和测试脚本代码,使测试设计和策略体现在测试数据中,而非脚本代码中。利用本文设计的自动化测试框架,测试人员通过使用关键字就可以构建测试用例,提高了自动化测试的可复用性和灵活性,不同的关键字指令可以驱动不同的测试流向与测试结果[6]。
综上所述,为达到理想的自动化测试要求,本文设计的自动化混合测试框架既包含了脚本模块化和测试库思想的设计,又有数据驱动和关键字驱动的能力,发挥各种思想的优势,使得测试框架可达到高可用性、高复用性和灵活性。
3 基于Java反射的混合测试框架的设计
与实现
本文提出的混合测试框架采用uiautomator工具,基于Java反射机制,以模块化思想和测试库思想封装高可复用的对象和操作,以数据驱动思想作为测试代码的输入,用关键字驱动思想来处理测试逻辑流程。本章节将以Android系统的“移动营业厅”APP软件测试为例,详细阐述测试框架的设计与实现。
如图2所示,该测试框架采用分层原則,分为数据与关键字层、执行接入层、基础组件层三个层次。
基础组件层利用模块化思想对测试基础组件进行高度抽象,采用测试库思想对基础组件进行封装,如APP中的控件类(如按钮、输入框等)通过uiautomator获取,同时通过访问uiautomator的API库,实现对各个控件的操作,如单击、输入文本、滚动等,最后将这些操作及操作的组合封装成一个基础组件。利用uiautomator封装基础组件,可降低编写代码成本、代码复用率高、提高测试准确率。
执行接入层主要采用Java反射技术,该层是数据与关键字层和基础组件层的中介,主要是通过XML解析器读入配置数据,如关键字、执行参数和执行步骤等,利用Java反射机制动态调用基础组件层的组件执行测试。Java反射机制能在程序运行时通过配置文件(如XML文件)动态地加载类并调用类方法以及使用类成员变量。将该机制运用到框架中,可增加程序灵活性,避免代码写死在程序中,使该框架可以灵活地运用在多种APP的测试中。
在数据与关键字层中,数据表与关键字以XML的方式配置,该层以数据驱动为核心,为自动化测试代码提供参数化的测试数据输入,实现测试代码与数据的分离。以关键字驱动为核心,实现测试代码与用例的关联,关键字层次结构如图3所示。
关键字层次结构分为测试步骤层、测试用例层和测试用例集层。关键字的定义与测试用例集的结构密不可分,一套测试用例集包含了一系列测试用例,测试用例是由各个测试步骤组合构成的。各层次结构具体说明如下:
(1)测试用例集层:一套测试用例集代表一个被测业务的所有功能点,可以包含多个独立的功能点的测试。测试项目记作集合B,测试用例集记作集合R,则:
(1)
以“移动营业厅”测试项目为例,对该测试项目划分为多个用例集,如“首页”、“商城”、“服务”、“积分”等测试用例集。各用例集包含该功能点下的所有用例的集合,由一系列XML文件组成。
(2)测试用例层:为实现特定测试功能点的独立测试用例,在用例中包括测试输入所需的数据、执行逻辑、预期输出的处理等。用T来代表测试用例集合,则:
(2)
在示例测试项目中,将独立的测试用例编写成XML文件,保存在相应的用例集中。以“首页”测试用例集为例,该用例集中包含我的账单、套餐余量、已订业务等测试用例。
(3)测试步骤层:将测试用例拆分成一系列操作步骤,编写测试用例就是将测试步骤按执行顺序进行逻辑上的连接。用S代表测试步骤集合,则:
Ti=(s1, s2, …, sn), si∈P (3)
以“登录”测试为例,测试步骤包括输入手机号、输入密码、确认登录等。每个操作步骤中均由步骤ID、测试组件单元、参数、下一步操作ID以及抛错处理等组成。
测试组件单元即关键字操作指令,是基础组件层可复用的代码组件与具体的业务没有关系,可被任何测试步骤使用。用u代表组件单元,用U代表组件单元集合,则:
(4)
下面举例说明移动营业厅测试项目的测试组件单元,具体如表1所示:
表1中,testInputTextByResourceId为通过文本框的ResourceId在文本框中输入文本的组件;testFlingVerticalByResourceId为通过ResourceId来实现横向快速滑动的组件,通过参数method选择向前还是向后滚动,通过times指定滚动次数。
根据测试用例集、测试用例,测试步骤进行层次的划分,可提高自动化测试代码的可复用性。整个框架基于以上思想和设计将测试数据与测试代码进行了封装。采用uiautomator工具,对基础控件进一步封装、验证,通过Java反射机制实现测试数据与测试代码之间的隔离。
4 APP自动化混合测试框架的实际应用
本章将阐述该APP自动化混合测试框架在“移动营业厅”实际项目中的应用,通过比较测试过程及结果输出分析该框架在测试效率、质量及代码开发等方面的优势。
4.1 测试组件库开发
根据测试动作与控件属性信息相结合的特点,对uiautomator的方法进行进一步封装,提炼出一套通用测试组件,如图4所示。
每类测试动作根据不同属性可定义一个或多个组件,每个组件对应一个关键字,如根据Text属性的点击事件的关键字为testClickByText,测试人员使用该关键字即可调用该组件执行相应的测试动作。
将上述组件库打包为testApp.jar,为测试人员执行测试用例使用。后续测试人员只需编写XML测试用例调用组件库完成测试执行即可。如图5所示,本文提出的方式在组件库丰富之后不会因为测试用例的增加而增加代码,而采用传统的编写自动化测试脚本的方式代码量会随着用例数量的增加而不断增加,导致测试代码难以维护并增加调试的成本,会大大降低自动化测试的效率和质量。
4.2 自动化测试用例编写
测试人员通过编写XML文档来完成用例的编写,一个XML文档为一个用例,每个用例下包含若干步骤。其内容格式为两级结构,其中父节点用于定义当前用例的相关信息,如下所示:
其中,startid表示当前用例开始执行步骤的id编号,nextDoc表示当前用例执行通过时下一个用例的文档名,errNextDoc表示当前用例不通过时下一个用例的文档名(-1表示中断执行),className表示引用的组件库名称。
子节点表示用例中的各操作步骤,其格式定义如下:
其中,id表示当前步骤的编号,type表示引用组件的关键字,typeValue为传递的数据参数,next用于连接当前步骤执行通过时要执行的下一步骤,errnext用于连接当前步骤执行不通过时要执行的下一步骤(-1表示中断当前用例的执行),errlog用于控制日志输出。
以上编写测试用例的方法易于上手,降低了对测试人员编码能力的要求,且测试步骤清晰明了,易于测试过程的调试,方便用例的定位和维护。
4.3 自动化测试用例执行
测试用例自动化执行的流程如图6所示,将写好的测试用例和测试组件库上传到手机,下发任务执行测试用例,输出日志及报错截图,测试人员可通过查看日志及截图定位分析问题。
对比实际手工执行“移动营业厅”的168个功能测试用例,从表2中可以看出,采用本文提出的自动化测试框架进行测试可在很大程度上节约资源,提高效率,特别是在多部手机并发测试的情况下优势更为明显。
5 结束语
本文提出了一个健壮的、易维护的、易扩展的自动化混合测试框架,运用该框架降低了测试执行与开发的耦合度,将业务逻辑、测试数据与测试代码分离,能有效降低移动APP自动化测试成本,提高测试执行的有效性。本文阐述了该自动化测试框架在实际测试项目中的应用,并驗证了其在效率、质量、操作及扩展维护等方面的优势,可为APP自动化测试项目提供有力支撑。
参考文献:
[1] 常征. 功能测试中自动化测试框架的分析与应用[D]. 北京: 北京林业大学, 2007.
[2] 徐骋. Android应用软件自动化测试框架的研究[D]. 大连: 大连海事大学, 2015.
[3] 路静,王琪. 一种基于功能测试的自动化测试框架[J]. 内蒙古科技与经济, 2005(23): 25-26.
[4] 曾北溟. 自动化测试框架的研究与实现[D]. 武汉: 武汉大学, 2004.
[5] 步倩倩. 面向GUI软件的自动化测试框架的研究与应用[D]. 成都: 电子科技大学, 2010.
[6] 郝义鹏. 基于关键字驱动自动化测试平台的设计与实现[D]. 哈尔滨: 哈尔滨工业大学, 2007.
[7] 侯菊敏. 基于Android的关键字驱动自动化测试框架研究[D]. 广州: 中山大学, 2012.
[8] 区立斌. 基于层次关键字驱动的自动化测试框架设计与应用[D]. 广州: 中山大学, 2012.
[9] 郝晓晓,张卫丰. 基于XML的SDK自动化测试框架的设计与实现[J]. 计算机技术与发展, 2010(4): 101-104.
[10] 谢文哲. 基于模块化测试框架的单元自动化测试框架的设计与实现[D]. 武汉: 华中科技大学, 2007.
[11] 陈健. 基于模型的数据处理系统的自动化测试框架[D]. 北京: 中国科学院大学(工程管理与信息技术学院), 2013.★