上一篇主要介绍了jenkins:真机换成模拟器,我们将真机换成模拟器,使得操作更简单,进一步完善安卓UI自动化持续集成的自动化。其实做到这里,基本的基于orange的安卓UI自动化工程已经建立完备了,完全可以实现线上监控APP的UI层面的稳定性情况。如果我们不想只是检测已发布的apk的稳定性,而是想在开发过程中实时编译、打包成apk进行UI层面的监控的话,就需要进行本章的进阶jenkins设置了。
关于安卓UI自动化学习,我的学习路线是这样安排的:
(一)本地:能够独立完成一个UI自动化工程的建立
(二)本地:命令行执行UI自动化测试用例
(三)本地:ant打包测试工程apk+执行UI自动化用例一体化
(四)jenkins:持续集成平台成功构建UI自动化工程
(五)jenkins:真机换成模拟器
(六)jenkins:持续集成平台实现被测apk自动打包编译+自动化一体化
(七)UI自动化用例编写语法和规范
本章内容就是第六部分,jenkins:持续集成平台实现被测apk自动打包编译+自动化一体化
一、设置环境变量
我们这里使用ant打包,在jenkins的job配置里,选择构建的选项为Execute Shell,命令框里首先输入对jenkins环境变量的设置。设置ant运行地址并加入path,设置android-sdk安装地址并将tools和platform-tools都加入path。
二、拉取被测APP代码并打包
设置好环境变量后,我们就需要从代码仓库(SVN或者Git)把开发的代码拉取下来并进行打包。
除了配置环境变量的几句指令,关键的指令及其分析如下:
(1)svn co的命令就是从svn地址上把被测试APP的开发代码拉取下来。
(2)接下来的cd命令主要是打开本job所在的本地目录。这里注意windows系统的目录表达方式是用\\分割。通常情况下job的默认存放目录是C:\Users\hzsuixiang.jenkins\workspace\YourJobName目录下,但是这里我设置job存放路径为E盘自己的路径下。如何设置job存放路径,可参考教程。
(3)接下来看起来简单的ant指令其实执行了复杂的打包过程。只不过所有的任务都在build.xml中组织好了。在执行dx命令,将class文件转换成.dex文件时,产生了class.dex和classes2.dex两个文件,还要有一步将classes2.dex文件打到apk里。
(4)最后的aapt命令就是将classes2.dex文件打到apk里。
三、拉取测试工程代码并执行
关键的指令及其分析如下:
(1)svn co的命令就是从svn地址上把被测试工程的代码拉取下来。
(2)接下来的两个cp命令是用被测APP打包时产生的R.java文件和apk文件替换到我们UI工程里。
(3)最后在UI工程目录下执行ant命令执行UI自动化测试脚本。
好了,至此为止,我们就能够实时地将开发代码编译打包并执行UI自动化测试了。
四、打包时遇到的问题分析
因为之前被测APP在开发那边都是用gradle进行打包的,在对被测APP进行ant打包时遇到了包括编译、分包等的若干问题,总结一下:
1.编译时报错
编译时出现的问题首先考虑自己使用的jdk版本是否与开发环境相同,根据报错信息,我的jenkins上指定的jdk版本是1.8,而开发环境使用1.7。于是将Jenkins默认的jdk版本改为1.7,编译通过。
2.release时报错
release时报错apkbuild.bat文件找不到。首先在build.xml文件中找到release的target,确认使用到的执行参数是什么。
我们看到执行的是${apk-builder}这一参数。然后再在build.xml中找出apk-builder参数的设置,查看其真正执行的脚本文件位置。
而${android-tools}参数在之前设置为本地sdk\tools的路径,也就是D:\AppData\Local\Android\sdk\tools(注:这是我的本地sdk路径)。打开这一路径,发现其中真的没有apkbuilder.bat文件,也难怪打包时报错了。sdk更新3.0以后apkbuilder.bat已经被删除了,要想顺利地执行ant打包,可以自己重写一个apkbuilder.bat工具,我是从网上下载了apkbuilder.bat放在D:\AppData\Local\Android\sdk\tools路径下:
这下执行应该没有问题了~
DUANG~报错 “java找不到....”
问题查找了好久,终于确定问题是出在自己的java文件夹命名上了,我的java文件夹命名为java 1.7,就是这个空格成为了找不到java无法顺利进行release的关键原因。这应该也是个小小的坑了,建议以后建立文件夹少写空格中文等这类字符,出错的时候感觉整个世界都不好了~