蔡维婷 黎伟健 范 敏
(中移互联网有限公司品质管理部 广东 广州 510640)
由于产品敏捷开发和版本快速迭代的需要,在移动互联网应用的开发过程中,必然存在大量重复的测试工作。目前,已有多种支持产品开发的测试工具,但存在测试流程不够连贯、测试工具不相关联的问题。因此,有必要在产品持续集成的基础上实施进一步的自动化措施,以系统化方式管理产品开发过程,提高产品开发质量和效率。本文以Android客户端开发为例,阐述一种产品开发过程中“一键式”自动化测试工具链的设计和解决方案。
与产品开发相关的测试一般包括单元测试、代码规范检查和功能测试等[1-2]。在持续集成的开发环境中,部署自动化测试流程是保障开发质量和效率的重要措施[3-4]。对于Android应用开发,业界已有开源的持续集成平台[5-6]、开发构建工具[7]和自动化测试框架[8-10]。开发人员可基于JUnit单元测试框架验证代码内部逻辑[11-12],使用Findbugs、Checkstyle、PMD等代码规范检查工具评审代码质量[13],运用自动化测试框架对产品功能进行黑盒测试[14-15]。
开发过程需要经过反复的测试验证。然而,目前所使用的测试工具之间相互独立,测试环节仍然需要由开发人员控制操作,对开发效率而言存在一定的局限性;并且,代码质量由开发人员自行把控,代码提交前没有经过统一、规范的自动化检测流程,不利于版本的稳定迭代。为此,本文提出一种应用于开发过程的自动化测试工具链,便于开发人员在开发过程中实现多项测试需求。开发人员只需一键触发即可在持续集成的开发环境下,完成项目构建、单元测试、静态代码检查、功能测试、版本管理等功能。
本文提出的测试工具链系统主要由以下各部分构成:
(1) 持续集成平台(Jenkins):系统核心,控制自动化流程的执行;
(2) 构建工具(Ant):在Jenkins平台执行Ant指令集,调用代码编译、单元测试、代码规范检查、功能测试等构建任务脚本;
(3) 单元测试框架(JUnit):源代码中嵌入的测试用例,被Ant构建工具调用;
(4) 代码规范检查插件(Fingbugs/Findsecbugs、Checkstyle、PMD):被Ant构建工具调用,以检查源代码与设定代码规范间的差异;
(5) 自动化测试框架(Robotium):使用其Solo类创建的自动化测试应用,被Ant指令调用执行;
(6) 版本管理工具(SVN):包括SVN服务器VisualSVN Server,用于分配版本仓库和配置用户权限;以及SVN客户端TortoiseSVN,用于开发版本的更新和同步。
系统架构如图1所示。
图1 产品开发过程自动化测试系统架构
当Android开发人员将代码提交至SVN服务器,系统即以自动化方式执行测试流程:SVN服务器即时远程触发Jenkins持续集成平台对开发项目的构建;通过调用Ant工具进行项目代码编译,生成开发应用;调用JUnit单元测试及Fingbugs/Checkstyle/PMD代码规范检查工具,生成检测报告;构建成功后,平台将开发代码及代码检测结果增量提交至SVN服务器,并将被测应用部署在测试环境;同时激活已开启的手机模拟器或测试终端,启动关键功能的Robotium自动化测试,并将测试代码及功能测试结果增量提交至SVN服务器。
自动化流程以任务流方式部署在Jenkins平台,分别完成代码检测及其结果入库、功能测试及其结果入库四项任务,流程如图2所示。其中:将代码检测结果提交任务和功能测试任务设定为代码检测项目的下游任务,即当代码检测任务成功完成后,将并行触发代码检测结果提交和功能测试;将功能测试结果提交任务设定为功能测试任务的下游任务。
图2 自动化测试工具链流程
(1) 代码检测任务:当开发人员提交代码更新,代码检测任务被远程触发。首先检测流程状态标识,若该流程当前有被其他开发人员提交的任务在运行,则将新触发的任务置于等待状态,以避免运行相同的流程造成Jenkins工作空间冲突。当轮询检测到流程处于可执行状态时立即依次执行代码构建、单元测试和代码扫描。如果构建失败,Jenkins系统发送邮件通知开发人员,流程结束;如果构建成功,将触发代码检测结果提交入库,并触发自动化测试任务。代码检测任务使用参数方式将构建号分别传递给代码检测提交和功能测试任务,以便为代码检测任务的构建日志入库做准备。
(2) 代码检测结果提交:当代码检测任务完成后,开发代码及其检测结果将被提交入库。根据Jenkins日志存储路径以及从上游代码检测任务传递的构建号参数作为子目录,获取任务构建日志。将工作空间中的代码、生成的报告、构建日志等内容增量提交至SVN,以开发项目名称及构建号作为提交备注。
(3) 功能测试任务:当代码检测任务完成后,与代码检测结果提交任务并行的功能测试任务被触发。启动Android测试设备或模拟器,安装被测应用,开始自动化功能测试。若检测到测试设备未能正常连接,Jenkins系统发送功能测试失败的邮件通知,流程结束。功能测试任务使用参数方式将构建号传递给功能测试结果提交任务,以便为功能测试任务的构建日志入库做准备。
(4) 功能测试结果提交:当功能测试任务完成后,测试结果被提交入库。根据Jenkins日志存储路径以及从上游功能测试任务传递的构建号参数作为子目录,获取任务执行日志。将工作空间中的功能测试代码、生成的测试报告、运行日志等内容增量提交至SVN服务器,以自动化测试项目名称及构建号作为提交备注。将流程状态标识设置为结束状态,流程结束。系统最后将流程结束邮件发送给开发人员。
本方案的自动化测试工具链系统实现Jenkins+ SVN+Ant+JUnit+Fingbugs(Findsecbugs)/Checkstyle/PMD+Robotium测试平台和工具的连接,连接图如图3所示。工具链经部署连接后,将在服务器后台运行,无需人工干预。开发人员可通过Jenkins平台实时查看流程运行状态,也可在收到系统发出的测试结束邮件通知后查看测试结果。
图3 工具链连接图
开发人员通过TortoiseSVN客户端,将本地开发项目的远程路径定位至VisualSVN服务器,用于开发代码的同步和提交。
在SVN服务器的开发项目存储库上配置post-commit钩子脚本,指明当有代码提交时将发起Jenkins平台上工具链项目对应链接的访问,如http://Jenkins_IP_Address:Port/job/Project/build?token=token_id。在Jenkins平台的工具链项目配置中,设定以远程触发作为项目构建条件,设置身份验证令牌,使SVN服务器的钩子脚本可以访问Jenkins平台工具链项目的构建执行页面,以启动对代码提交任务的自动化测试流程。
Jenkins平台对自动化流程中各任务的执行主要以批处理命令的方式调用Ant指令集脚本。一般情况下,构建脚本文件build.xml位于开发项目的根目录,为了使自动化流程覆盖代码检测功能,对Jenkins平台以及Android SDK安装路径下的build.xml文件作以下改动:
(1) 在Jenkins平台项目路径下部署开发项目的构建文件(命名为build_android.xml),作为通用的项目构建脚本文件。在build_android.xml文件初始的项目定义部分,声明项目在Jenkins平台工作空间路径basedir及Android SDK的安装路径sdk.dir。
(2) 在Android SDK安装目录下的Ant构建文件 oolsantuild_ant.xml中,在输入、输出路径部分各子目录前添加basedir,使Ant构建脚本能自动适配到需要执行构建的项目路径,即:
补充为:
(3) 在Jenkins控制台任务脚本的Ant命令行中,添加构建文件参数“-buildfile”及构建文件所在路径,使Ant工具调用指定的脚本文件执行构建。
在构建脚本文件build_android.xml中,增加对JUnit单元测试子任务junit的定义,说明Android SDK中JUnit插件的路径,指定所生成检测报告的文件类型。Jenkins控制台在完成项目编译后,通过使用Ant工具执行“ant junit”命令,即可执行代码单元测试,并生成测试报告。截取部分代码如下:
location="${sdk.dir} oolslibjunit.jar"/>
将代码规范检查插件Findbugs(Findsecbugs)、Checkstyle和PMD置于Jenkins平台Ant工具库目录下。在构建脚本文件build_android.xml中,分别添加各代码规范检查插件对应子任务findbugs(包括fingsecbugs)、checkstyle和pmd的定义,说明插件的路径及其classname、代码规范集文件路径以及需要生成测试报告的文件类型。Jenkins控制台在完成项目编译后,通过使用Ant工具执行“ant findbugs checkstyle pmd”命令,即可执行代码规范检查,并生成相应的测试报告。截取部分代码如下:
dir= "${ant.library.dir}/findbugs-3.0.1/lib">
classname="edu.umd.cs.findbugs.anttask.FindBugsTask"/> outputFile="${findbugs_result_folder}/findbugs_result.xml"/> path="${sdk.dir}platformsandroid-21android.jar"/> classpathref="checkstyle.path" classname="com.puppycrawl.tools.checkstyle.ant.CheckstyleAntTask"/> dir="${ant.library.dir}/pmd-bin-4.2.6/lib"/> classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath"/> 当完成代码构建和代码规范检测任务后,工具链进入自动化功能测试环节。测试程序由基于Robotium框架的测试项目产生。采用Robotium的主要原因是相比其他测试框架,Robotium在调用过程中,包括启动和运行可以完全不用人工干预,有利于在自动化工具链中使用。Jenkins控制台通过“adb devices”命令验证存在已连接的测试手机或模拟器,对其发送keyevent指令进行测试终端的解锁激活。为了获取在终端上运行的测试日志和结果,Jenkins控制台通过执行“adb logcat-d”指令,使运行在终端上的测试数据同步传输到Jenkins平台上。以Robotium测试项目设定的关键字作为筛选条件,对数据作过滤处理,将测试日志和结果在Jenkins平台上予以展示和保存。 在Robotium测试代码构建文件build_robotium.xml初始的项目定义部分,声明项目在Jenkins平台工作空间路径basedir以及Android SDK的安装路径sdk.dir,使构建脚本通用于开发项目不同开发人员的使用。测试代码编译后生成Test.apk。Jenkins控制台使用Ant工具运行“ant uninstall installd”,将被测应用App.apk重新安装在真机或模拟器上。在Jenkins控制台运行Ant工具命令“ant uninstall clean debug install test”,依次生成和安装Test.apk,并运行Robotium自动化测试。 测试任务执行完毕后,Jenkins平台向SVN服务器发起对增量代码、日志和测试结果的提交。Jenkins平台首先调用“svn update”命令使项目空间与SVN服务器同步;调用“svn delete”和“svn add”命令发现在工具链运行过程中产生的文件变动;通过“svn status”命令检测提交状态,如有代码冲突,由Jenkins平台中断自动化流程,系统发出告警邮件;调用“svn commit”命令进行代码提交,使用“-m”参数注明提交备注。 在已部署自动化测试工具链的系统上,对一个Android开发应用的开发过程实施自动化测试流程。经实践验证,当开发人员向SVN服务器提交代码更新,立即触发Jenkins平台运行自动化测试,包括代码构建、单元测试、代码规范检查、功能测试和版本控制,并输出运行日志和测试报告。Jenkins平台按任务脚本设定,在流程运行过程中实时显示和记录自动化测试的运行信息。截取部分运行结果如下: Total time: 30 seconds [CHECKSTYLE] checkstyle_report.xml with 117 unique warnings and 0 duplicates. [FINDBUGS] findbugs_result.xml with 8 unique warnings and 0 duplicates. [PMD] pmd_result.xml with 2 unique warnings and 0 duplicates. Triggering a new build of robotiumTest Email was triggered for: Always Finished: SUCCESS 当工具链运行出现异常情况,如测试终端未连接、代码编译构建失败、代码提交发现冲突等,系统向开发人员发送运行失败通知邮件,提供错误日志信息。当测试任务遇到异常超时,系统中的超时保护机制能中止当前流程,并由Jenkins平台发送告警邮件通知开发人员,提供出错信息。当测试正常运行结束后,系统向开发人员发送邮件,说明工具链对应的开发项目名称、系统链接、本次测试序号和最终运行结果。 最终生成的测试报告,含文本和XML格式,包括JUnit单元检测报告、Fingbugs(Findsecbugs)、Checkstyle、PMD静态代码扫描检测报告以及自动化功能测试报告。其中,XML格式的代码检测报告可在Jenkins平台以图表方式展示,包含代码缺陷描述、代码行定位和代码更替参考。截取Checkstyle检测报告如图4所示。 图4 Checkstyle检测报告 对于流程主要环节,工具链的测试结果提交子任务将自动保存测试运行日志,以便追溯版本测试信息。日志提交结果截图如图5所示。 图5 测试日志提交记录 为避免因项目并发提交造成的冲突,自动化流程中设置的运行状态保护机制能使被触发的测试任务根据流程当前的状态被启动运行或被置于队列中等待。因此,部署的工具链系统可用于开发团队的开发人员共同使用。同样,工具链也可用于多个开发项目的自动化测试,只要SVN服务器上的开发项目和Jenkins平台上部署的自动化流程对应,以便调用相应的工具链。 本文提出了一种Android应用开发中自动化测试工具链的解决方案。运用自动化流程实现产品持续集成过程中所执行的代码构建、单元测试、代码规范检查和功能测试,并配备版本控制、日志管理等功能,有助于系统管理开发过程,规范代码质量,提高产品开发和测试效率。3.6 Jenkins平台与Robotium测试框架间的连接
3.7 Ant构建与Robotium自动化测试框架间的连接
3.8 Jenkins平台向SVN服务器发起提交的连接
4 实施验证
5 结 语