Android自动化测试
——Monkey与MonkeyRunner
作者:王进勇
2012.8.29
一、自动化测试概述
通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时 间或硬件资源,提高测试效率,便引入了自动化测试的概念。自动化测试就是把以人为驱动的测试行为转化为机器执行的一种过程。在Android测试中常用的测试包括:Monkey和MonkeyRunner以及robotium,本文中主要介绍下Monkey和MonkeyRunner自动化测试。
二、Monkey测试与MonkeyRunner测试比较
2.1、Monkey
Monkey是一个命令行工具,可以运行在模拟器里或实际设备中,它是一种轻量级的性能测试工具。它向系统发送伪随机的事件流,实现对正在运行的应用程序进行压力测试。Monkey包括许多选项,它们大致分为四类:
1)基本配置选项,如设置尝试的事件数量。
2)运行约束选项,如设置只对单独的一个包进行测试
3)事件类型和频率
4)调试选项
在Monkey运行的时候,它生成事件,并把它们发给系统。同时,Monkey还对测试中的系统进行监测,对下列三种情况进行特殊处理:
2) 如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
3) 如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。
2.2、MonkeyRunner
MonkeyRunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过MonkeyRunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。MonkeyRunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。MonkeyRunner能够实现的功能包括:
1)多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。您可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。您也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。
2)功能测试: monkeyrunner可以为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。
3)回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。
4)可扩展的自动化:由于monkeyrunner是一个API工具包,您可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunner API之外,您还可以使用标准的Python os和subprocess模块来调用Android Debug Bridge这样的Android工具。
2.3、Monkey与MonkeyRunner的区别
Monkey:
Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。
MonkeyRunner:
MonkeyRunner工具则是在工作站上通过API定义的特定命令和事件控制设备或模拟器。
三、测试环境的搭建
见:
http://wenku.baidu.com/view/6f8d631e227916888486d75e
或者
http://blog.sina.com.cn/s/blog_a289fd65010155w5.html
四、Monkey与MonkeyRunner测试工具启动
4.1、Monkey的启动
可以通过开发机器上的命令行或脚本来启动Monkey。由于Monkey运行在模拟器/设备环境中,所以必须用其环境中的shell来进行启动。可以通过在每条命令前加上adb shell来达到目的,也可以进入Shell后直接输入Monkey命令。基本语法如下:
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:
$ adb shell monkey -p your.package.name -v 500
启动Monkey步骤:
启动CMD→输入adb shell所在位置(例如下:
E:\Program Files (x86)\Android\android-sdk-windows\platform-tools)→键入adb shell
如下图1所示,则启动成功。
图1 启动adb工具
(注:命令可以直接输入,也可以通过编写脚运行,脚本文档可以是.text)
4.2MonkeyRunner工具的启动
CMD→键入MonkeyRunner位置→输入MonkeyRunner,如图2所示:
图2 启动MonkeyRunner
(注:运行MonkeyRunner时可以在以上状态下输入指令,也可以通过monkeyrunner命令运行Python脚本,其后缀为.py)
五、Monkey与MonkeyRunner命令介绍
5.1Monkey命令介绍
下表中列出了Monkey命令行可用的全部选项。
类别
常规
2、-v
事件
3、 -s <seed>
4、–throttle <milliseconds>
5、–pct-touch <percent>
6、–pct-motion <percent>
7、–pct-trackball <percent>
8、–pct-nav <percent>
9、–pct-majornav <percent>
10、–pct-syskeys <percent>
11、–pct-appswitch <percent>
12、–pct-anyevent <percent>
约束限制
14、-c <main-category>
调试
15、 –dbg-no-events
16、–hprof
17、–ignore-crashes
18、–ignore-timeouts
19、–ignore-security-exceptions
20、–kill-process-after-error
21、–monitor-native-crashes
22、–wait-dbg
5.2MonkeyRunner方法介绍
MonkeyRunner帮助
1、com.android.monkeyrunner.MonkeyRunner.alert
消息 – 消息显示在对话框。
2、com.android.monkeyrunner.MonkeyDevice.broadcastIntent
3、com.android.monkeyrunner.MonkeyRunner.choice
4、com.android.monkeyrunner.MonkeyImage.convertToBytes
5、com.android.monkeyrunner.MonkeyDevice.drag
6、com.android.monkeyrunner.MonkeyView.getAccessibilityIds
7、com.android.monkeyrunner.MonkeyRect.getCenter
8、com.android.monkeyrunner.MonkeyView.getChecked
9、com.android.monkeyrunner.MonkeyView.getChildren
10、com.android.monkeyrunner.MonkeyView.getEnabled
11、com.android.monkeyrunner.MonkeyView.getFocused
12、com.android.monkeyrunner.MonkeyRect.getHeight
13、com.android.monkeyrunner.MonkeyDevice.getHierarchyViewer
14、com.android.monkeyrunner.MonkeyView.getLocation
15、com.android.monkeyrunner.MonkeyView.getParent
16、com.android.monkeyrunner.MonkeyDevice.getProperty
关键 – 变量的名称。可用的名称在
http://developer.android.com/guide/topics/testing/monkeyrunner.html上市。
17、com.android.monkeyrunner.MonkeyDevice.getPropertyList
18、com.android.monkeyrunner.MonkeyImage.getRawPixel
19、com.android.monkeyrunner.MonkeyImage.getRawPixelInt
20、com.android.monkeyrunner.MonkeyDevice.getRootView
21、com.android.monkeyrunner.MonkeyView.getSelected
22、com.android.monkeyrunner.MonkeyImage.getSubImage
23、com.android.monkeyrunner.MonkeyDevice.getSystemProperty
24、com.android.monkeyrunner.MonkeyView.getText
25、com.android.monkeyrunner.MonkeyDevice.getViewByAccessibilityId
26、com.android.monkeyrunner.MonkeyDevice.getViewById
27、com.android.monkeyrunner.MonkeyView.getViewClass
28、com.android.monkeyrunner.MonkeyDevice.getViewIdList
29、com.android.monkeyrunner.MonkeyDevice.getViewsByText
30、com.android.monkeyrunner.MonkeyRect.getWidth
31、com.android.monkeyrunner.MonkeyRunner.help
32、com.android.monkeyrunner.MonkeyRunner.input
33、com.android.monkeyrunner.MonkeyDevice.installPackage
34、com.android.monkeyrunner.MonkeyDevice.instrument
35、com.android.monkeyrunner.MonkeyRunner.loadImageFromFile
36、com.android.monkeyrunner.MonkeyDevice.press
37、com.android.monkeyrunner.MonkeyDevice.reboot
38、com.android.monkeyrunner.MonkeyDevice.removePackage
39、com.android.monkeyrunner.MonkeyImage.sameAs
40、com.android.monkeyrunner.MonkeyView.setFocused
41、com.android.monkeyrunner.MonkeyView.setSelected
42、com.android.monkeyrunner.MonkeyDevice.shell
43、com.android.monkeyrunner.MonkeyRunner.sleep
44、com.android.monkeyrunner.MonkeyDevice.startActivity
45、com.android.monkeyrunner.MonkeyDevice.takeSnapshot
46、com.android.monkeyrunner.MonkeyDevice.touch
47、com.android.monkeyrunner.MonkeyDevice.type
48、com.android.monkeyrunner.MonkeyRunner.waitForConnection
49、com.android.monkeyrunner.MonkeyDevice.wake
50、com.android.monkeyrunner.MonkeyImage.writeToFile
六、MonkeyRunner测试程序的编写示例
6.1MonkeyRunner坐标记录程序的编写
#This Python file uses the following encoding: utf-8
#!/usr/bin/env monkeyrunner
# Copyright 2010, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the “License”);
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an “AS IS” BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder
#连接设备
device = mr.waitForConnection()
mr.sleep(10)
#安装应用程序
#device.installPackage(“安装包路径+名字“)
#启动Android应用程序
#device.startActivity(component=”程序启动的首个Activity名“)
#启动录制程序
recorder.start(device)
6.2MonnkeyRunner测试程序的编写
# 导入此程序所需的monkeyrunner模块
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
# 连接当前设备,返回一个MonkeyDevice对象
device= MonkeyRunner.waitForConnection()
# 安装Android 包,注意,此方法返回的返回值为boolean ,由此您可以判
#断安装过程是否正常
device.installPackage (‘安装路径‘)
# 运行此应用中的一个活动
device.startActivity (component=’com.example.android.myapplication.MainActivity’)
# 按下菜单按键
device.press(‘KEYCODE_MENU’,‘DOWN_AND_UP’ )
# 截取屏幕截图
result = device.takeSnapShot
#将截图保存至文件
result.writeToFile(‘myproject/shot1.png’ ,‘png’ )