Keyword:Android,Robotium,自动化测试,黑盒测试,已知id如何模拟按键
1. 需要设置的环境变量
ANDROID_HOME=D:\Android\android-sdks
ANDROID_SDK_HOME=D:\Android\avd
JAVA_HOME= C:\Program Files\Java\jdk1.7.0_05
CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;
PATH=...;(追加)%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%JAVA_HOME%\bin;%CLASSPATH%
注意,环境设置后重启电脑才生效。
如果知道环境变量是否生效?例如查看ANDROID_HOME环境变量的设置,开始->运行->cmd,在cmd下面输入echo % ANDROID_HOME%,如果与我们预期的一致就说明生效了。如果原样输出% ANDROID_HOME%就说明环境变量未生效,需要重启操作系统。
详细说明如下
1.1
ANDROID_HOME= D:\Android\android-sdks,指定sdk包含的位置,什么是sdk?网上去搜,简单点说就是里面要包含AVD Manager和SDK Manager:
同时,eclipse也要设置SDK的位置,最好和ANDROID_HOME设置一样,如下
1.2
ANDROID_SDK_HOME设置的是avd的路径,一般默认在用户路径下,例如C:\Users\tanggod\.android, SD卡的空间都是从这里分配的。可以挪到其他目录下,需要在环境变量里面设置如下:
ANDROID_SDK_HOME=D:\Android\avd
如此设置后(重启电脑让环境变量生效 ),以后创建的AVD就会在我们指定的目录下了:
JDK,JAVA_HOME必须设置jdk安装的目录,例如:
C:\Program Files\Java\jdk1.7.0_05
查看JDK版本号?在cmd下面输入:Java -version
PS:1.7的jdk似乎还很不稳定,有问题,建议用1.6的。
jdk下载位置:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
classpath环境变量,是当我们在开发java程序时需要引用别人写好的类时,要让java解释器知道到哪里去找这个类。通常,sun为我们提供了一些额外的丰富的类包,一个是dt.jar,一个是tools.jar,这两个jar包都位于C:\jdk1.6.0\lib目录下,所以通常我们都会把这两个jar包加到我们的classpath环境变量中set classpath=.;C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar。在系统环境变量那一栏中点->新建classpath
1.5 PATH
环境变量PATH设置的时候,注意是追加,不能将已有的内容清空了。
PATH = %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%JAVA_HOME%\bin;%CLASSPATH%
主要设置的是adb.exe和emulator的位置(在tools或者platform-tools目录中),已经jdk工具的路径等等。
2. 如何签名Sign
Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!
为了方便我们开发调试程序,ADT会自动的使用debug密钥为应用程序签名。debug密钥?它在哪?debug密钥是一个名为debug.keystore的文件,它的位置: Ubuntu: ~/.android/debug.keystore
用Robotium做黑盒测试的时候,需要对待测试的apk去除签名,然后自己再签名。google网站上有个签名工具叫做re-sign.jar,比较傻瓜化,直接将apk拖入到re-sign.jar中后自动去除签名,重新再签名;很多人都建议用这个工具。我刚开始也用这个,可是发现用这个工具处理后,无论是android模拟器还是真机,都装不上,提示没有签名。
我将apk解开看,确实是有签名的。
查看签名:
jarsigner -verify -verbose -certs D:\Android\apk\02-AndroidCalculator-sign.apk
所以后来,我就手工用命令行来签名。手工签名之前,首先需要去除原来签名的信息,去除方法很简单。就是将apk文件后缀改为.zip,然后从winrar中删除META-INF文件夹,删除后重新将文件名改成apk的后缀,这样就去除签名了。然后用下面的命令进行签名。
注意下面黄色高亮和灰色高亮的字,需要根据自己的debug.keystore的位置,和待签名apk的位置进行设置。
签名AndroidCalculator
> jarsigner -keystore D:\Android\avd\.android\debug.keystore -storepass android -keypass android D:\Android\apk\02-AndroidCalculator-unsign.apk androiddebugkey
> zipalign 4 D:\Android\apk\02-AndroidCalculator-unsign.apk D:\Android\apk\02-AndroidCalculator-sign.apk
例如签名Plingm
>jarsigner -keystore D:\Android\avd\.android\debug.keystore -storepass android -keypass android D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkandroiddebugkey
> zipalign 4 D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkD:\Android\apk\plingm\com.freephoo.android_1180-sign.apk
>jarsigner
> zipalign 4
签名后如何安装到模拟器中?命令如下
>emulator -avd android4.1
>adb install D:\Android\apk\plingm\com.freephoo.android_1180-sign.apk
在进行黑盒测试之前,需要知道待测试apk的包及activity信息。查看某个apk的package name,可以用aapt看:
在platform-tools目录下使用如下命令:aapt dump badging XXX.apk
aapt dump badgingD:\Android\apk\plingm\com.freephoo.android_1180-sign.apk
3. 真机调试
-
设置android手机为USB调试模式。步骤: menu---> 设置 ---> 应用程序 ---> 开发 , 选择【USB调试】 -
用USB连接手机和电脑,并确保成功。步骤: 在windows下执行c:/adb devices, 查看手机是否已经连接成功。
连接不成功:
-
设置应用程序为调试模式 ( 这个似乎不要也可以 ) 。操作: 编辑 AndroidManifest.xml 增加调试参数 android:debuggable="true", 如下:
-
查看具体异常信息:
执行:./adb logcat 可以查看到更多的系统异常消息。在这些消息中要注意查看Caused by:打 头的行,这些行指明了在哪行代码出的错误
4. 已知控件id,如何模拟按键
我们知道,android每个控件都有一个类似R.id.xxxx字符串id。在做白盒测试的时候,将被测试的代码包import一下,直接调用R.id.xxxx就可以了。
但是在黑盒测试的时候,我们只有apk,没有源代码,怎么获取控件的id呢?
java已经给我们提供了这个工具。只需要在cmd下面输入hierarchyviewer即可调出控件查看工具(如果cmd不认识你的hierarchyviewer,说明你的环境变量没有配置正确):
选中需要查看的应用,点击:"Load View Hierarchy":
如下id/后面的"Button01"即为button的id。
1. 根据button上面的文字。这个很简单,直接solo.clickOnButton("Multiply");即可。
2. 根据控件的坐标。hierarchyviewer是可以查看每个点的坐标的。但是使用起来不是很直观,尤其是对不同分辨率屏幕的手机时,使用起来可能还存在兼容性问题。
如果控件上没有文字,clickOnButton就用不了,例如很多应用用图片作为button的说明,clickOnButton就不奏效。用坐标又很麻烦不直观。可否用控件的id呢?
怎么用id,我也纠缠这个问题好几天,网上中文资料搜不到,搜英文,英文搜不到换关键字搜,始终找不到一个比较完整的使用说明。我只好自己一个个命令的试,搞了2天总算找到一个方法,这个方法对于java高手可能不值一提,但对我从未用过java的人来说,确实费了不少周折。
我的方法如下,先获取到控件的view:
solo.getCurrentActivity().getResources().getIdentifier,
然后再用solo.clickOnView即可。
我在使用的时候,简单的封装了下,封装函数如下:
private int clickCtrlById(String s, int t ){
}
例如已知某个控件的id(字符串格式)为"btn_dialpad_5",调用方法如下:
clickCtrlById("btn_dialpad_5",400);