三次元美少女rmvb:Android平台测试介绍及monkey使用

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 01:00:02
Android平台测试介绍(一)
前言:该文档针对新入职员工及首次接触Android测试平台测试着,对Android系统、测试工具进行简单介绍。
作者:严君
Android系统介绍
Android一词本意是指“机器人”,当然现在大家都知道它是Google推出的开源手机操作系统。Android基于Linux平台,有操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。
Android系统具有5个特点:
开放性。Google与开放手机联盟合作开发了Android,Google通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望通过建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。
应用程序无限性。Android上的应用程序可以通过标准API访问核心移动设备功能。通过互联网,应用程式可以声明它们的功能可供其他应用程序使用。
应用程序是在平等条件下创建的。移动设备上的应用程序可以被替代或扩展,即使是拨号程序或主屏幕这样的核心组件。
应用程序可以轻松的嵌入网络。应用程序可以轻松的嵌入HTML、JavaScript和样式表,还可以通过WebView显示网络内容。
应用程序可以并行运行。Android是一种完整的多任务环境,应用程序可以在其中并行运行。在后台运行时,应用程序可以生成通知以引起注意。
通过上述内容的介绍,我们对Android的特点有了初步的了解。下面将讨论Android的系统架构,先让我们看看Android的体系结构,如图1—1所示。

从图1—1中可以看出Android分为4层,从高到低分别是应用层、应用框架层、系统运行层和Linux内核层。下面将对这4层进行简单的分析和介绍。
应用层
应用层是指用Java语言编写的运行在虚拟机的程序,如图1—1中最上层部分所示。其实,Google最开始就在Android系统中捆绑了一些核心应用,比如E-mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序等。
应用框架层
这一层是编写Google发布的核心应用是所使用的API框架,开发人员同样可以使用这些框架来开发自己的应用,在使用时必须遵守其框架的规则。
从图1—1中可以看出,Android提供了如下一些组件。
View(可扩展的视图):可以用来构建应用程序,它包括List、Grid、Text Box、Button,以及可以嵌入的Web浏览器。
ContentProviders(内容提供器):它可以让一个应用访问另一个应用的数据或共享它们自己的数据库。
ResourceManager(资源管理器):提供非代码资源的访问,如本地字符串、图形和布局文件。
NotificationManager(通知管理器):应用可以在状态栏中显示自定义的提示信息。
ActivityManager(活动管理器):用来管理应用程序生命周期并提示常用的导航退回功能。
WindowManager(窗口管理器):管理所有的窗口程序。
PackageManager(包管理器):Android系统内的程序管制。
系统运行库(C/C++库以及Android运行库)层
当使用Android应用框架时,Android系统会通过一些C/C++库来支持我们使用的各个组件,使其更好的为我们服务。
Bionic系统C库:C语言标注库,系统最底层的库,C库通过Linux来调用。
MediaFramework(多媒体库):Android系统多媒体库,基于PacketVideo OpenCORE,该库支持多种常见格式的音频、视频的回放和录制,以及图片。
SGL:2D图形引擎库。
SSL:位于TCP/IP协议与各种应用层协议之间,为数据通信提供支持。
OpenGL:3D效果的支持。
SQLite:关系数据库。
Webkit:Web浏览器引擎。
FreeType:位图和矢量图。
每个Java程序都运行在Dalvik虚拟机上。每一个Android程序都有自己的进程,Dalvik虚拟机只执行.dex的可执行文件。当Java程序通过编译,最后还需要通过SDK中的dx工具转化成.dex格式才能正常在虚拟机上运行。
Linux内核层
Android的核心系统服务于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖与该内核。Linux内核同时也作为硬件和软件之间的轴向层。
Android更多的是需要一些与移动设备相关的驱动程序,主要的驱动如下所示。
DisplayDriver(显示驱动):基于Linux的Frame Buffer(帧缓冲)驱动。
KeyBoardDriver(键盘驱动):作为输入设备的键盘驱动。
FlashMemory Driver(Flash内存驱动):基于MTD的Flash驱动程序。
CameraDriver(照相机驱动):常用的基于Linux的v412(Videofor Linux)驱动。
AudioDriver(音频驱动):常用的基于ALSA(AdvancedLinux Sound Architecture)的高级Linux声音体系驱动。
BluetoothDriver(蓝牙驱动):基于IEEE802.15.1标准的无线传输技术。
BinderIPC驱动:Android的一个特殊驱动,具有单独的设备节点,提供进程间通信的功能。
PowerManagement(电源管理):电池电量等。
对Android的系统架构进行剖析后,我们知道Android分为应用层、应用框架层、系统运行库层和Linux内核。在开发应用时都是通过框架来与Android底层进行交互,接触最多的就是应用框架层了。
Android提供给应用开发者的本身就是一个框架,所有应用开发都必须遵守这个框架的原则。开发应用时就是在这个框架上进行扩展,下面介绍Android的这个框架提供了哪些功能。
android.app:提供高层的程序模型和基本运行环境。
android.content:包含对各种设备上的数据进行访问和发布。
android.databses:通过内容提供者浏览和操作数据库。
android.graphics:底层的图形库,包含画布、颜色过滤、点、矩形、,可以将它们直接绘制到屏幕上。
android.location:定位和相关服务的类。
android.media:提供一些类管理多种音频、视频的媒体接口。
android.net:提供帮助网络访问的类,超过常用的java.net.*接口。
android.os:提供了系统服务、消息传输和IPC机制。
android.opengl:提供OpenGL工具。
android.provider:提供访问Android内容提供者的类。
android.telephony:提供与拨打电话相关的API操作。
android.view:提供基础的用户界面接口框架。
android.util:涉及工具性的方法,例如时间日期的操作。
android.webkit:默认浏览器操作接口。
android.widget:包含各种UI元素在应用程序的布局中。
Android系统基于Linux,做Android测试,掌握一定的 Linux知识是必要的。下面我们就对Linux进行简单的介绍。从最简单的文件系统开始介绍(该部分是Linux的基础,更深远的只是在该文档中不做介绍,有兴趣的朋友可以自己查阅)。
Linux文件系统结构
用户空间和内核中与文件系统相关的主要组件之间的关系,如图1—2所示。

图1—2
用户空间包含一些应用程序和GUNC库。它们为文件系统调用提供用户接口。VFS是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode和dentry)。它们缓存最近使用过的文件系统对象。每个个体文件系统实现导出一组通用接口,供VFS使用。缓冲区缓存会缓存文件系统和和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。
Linux文件系统采用阶层式树状目录结构,最上层是“/”,然后在下边创建其他的目录,如表1—1所示。
/
Linux系统根目录
/bin
Binary的缩写,基础系统所需要的命令位于此目录,也是最小系统所需要的命令。功能和/usr/bin类似,这个目录中的文件都是可执行文件,是普通用户可以使用的命令。
/boot
包含vmlinuz,initrd.img等启动文件,在一般情况下,GRUB和LILO系统引导管理器也位于这个目录。
/dev
设备接口文件目录。
/etc
系统配置文件目录。
/home
一般的用户主目录。
/lib
库文件存放目录。
/mnt
各项配置的文件加载点。
/opt
表示可选择的意思,一些软件也会安装在这里,也就是自定义软件包,供大的且固定的应用存储文件用
/proc
系统运行时进程信息及内核信息存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统。
/root
管理员的主目录
/sbin
大多数涉及系统管理的命令的存放地,也就是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令。
/tmp
存在临时文件的目录。
/usr
这事系统存放程序的目录。
/var
该目录下存放的文件时经常变动的。如/var下有/var/log,是用来存放系统日志的目录。/var/www目录是定义Apache服务器站点的存放目录。
表1—1
此外,下面补充一下一些比较重要的字目录的用途。
/etc/init.d
这个目录用来存放系统或服务器以System V模式启动的脚本,这在以System V模式启动或初始化的系统中常见。比如Fedora/RedHat。
/etc/initx.d
如果服务器是通过xinetd模式运行的,它的脚本要放在这个目录下。有些系统没有这个目录,比如Slackware,有些老的版本也没有。
/etc/rc.d
这事Slackware发行版本的一个目录,是BSD方式启动脚本的存放地。比如定义网卡,服务器开启脚本等。
/etc/X11
这事X-Windows相关的配置文件存放地。
/usr/bin
这个目录是可执行程序的目录,普通用户就有权限执行。
/usr/sbin
这个目录也是可执行程序的目录,但大多数情况下存放涉及系统管理的命令。
/usr/local
这个目录通常用来存放用户自编译安装软件。
/usr/lib
库文件存储目录
/usr/share
系统共用的东西存放地,如/usr/share/fonts是字体目录,是用户都共用的。
/usr/src
这事内核源码存放的目录。
/var/adm
比如软件包安装信息、日志、管理信息等。某些操作系统中没有这个目录。
/var/log
系统日志存放,分析日志要看这个目录的东西。
/var/spool
打印机、邮件、代理服务器等假脱机目录。
介绍完Linux文件系统后,让我们来看看Android的文件系统是什么样的。如图1—3所示。

图1—3
图1—3列出了Android的文件目录,下面简单阐述一些目录的功能。
cache : 是缓存临时文件夹,据说是除了T-mobile的OTA更新外,别无用处。
sdcard:是SD卡中的FAT32文件系统挂载的目录。
etc  :指向 /system/etc ,众所周知的配置文件存放目录。
proc :/proc 文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。
sys :用于挂载 sysfs文件系统。 在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象的反应到用户空间中.用户空间可以修改sysfs中的文件属性来修改设备的属性值。
sbin: 只放了一个用于调试的adbd程序。
data :存放用户安装的软件以及各种数据。
root :什么都没有。
dev :不用多说了,设备节点文件的存放地。
system : /system目录是在Android文件系统占有及其重要的位置,基本上所有的工具和应用程序都在这个目录下。在Android手机中存放在nandflash的mtd3中,是一个yaffs2文件系统,在启动时被挂载在root的/system目录下。以下是目录结构,如图1—4所示:

图1—4
bin:该目录下放了很多系统管理工具,这些工具不是到toolbox的链接,每个都是可执行程序。如果你看到这些命令你会发现他们根本不常用,他们都是为系统管理员准备的,是一些系统管理和配置工具。这个文件夹的作用相当于标准Linux文件系统中的/sbin。
framework:JAVA平台的一些核心文件,属于JAVA平台系统框架文件。里面的文件都是.jar和.odex文件。
fonts:字体库文件的存放目录。
etc :这里存放了系统中几乎所有的配置文件,根目录下的/etc就链接于此。
build.prop :是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似于/etc中的文件。
media:里面主要是存放了系统的铃声的,分为 notifications(通知)、ui(界面)、alarms(警告)和ringtones(铃声),里面都是.ogg音频文件。
bin:存放用户常用的工具程序的,其中大部分是到toolbox的链接
usr:用户的配置文件,如键盘布局、共享、时区文件等等。您可以cat 来看看。
app:顾名思义,存放的是Android系统自带的JAVA应用程序。
lost+found:yaffs文件系统固有的,类似回收站的文件夹,只有是yaffs文件系统都会有。
lib:存放几乎所有的共享库(.so)文件。
init.rc:一个初始化脚本,用于将/system/modules和/system/xbin挂载为cramfs,避免系统被无意破坏。
在其他Android版本中,/system目录下可能还存在如sd、modules等目录,再次不做解释。在根目录下还有一些非目录的文件,例如,init.trout.rc,init.rc,init.goldfish.rc 是初始化文件.。init是系统启动到文件系统的时候第一个运行的程序。
测试
Android系统测试平台搭建
AndroidSDK贯穿于Android测试的整个测试过程。该工具可以从Android官网上下载(地址http://developer.android.com/sdk/index.html)。
下载完成后,解压该zip包,解压后生成的目录如图1—5所示:

图1—5
使用该工具之前,先将环境变量配置好,配置方法如下所示。
“鼠标右键”我的电脑,点击“属性”,打开系统属性对话框后,选择“高级”标签页,点击“环境变量”,系统变量的“Path”中添加参数,该参数=android SDK所在目录。如sdk在D:\,这里就可以写成D:\android sdk\tools。
配置好环境变量后,第一次启动SDk,可以双击“SDK Manager.exe”。首次启动SDK Manager需要下载SDK platform,可能需要下载一段时间。
创建Android模拟器很简单,在这里不做说明。
在AndroidSDk目录下有一个tools目录,该目录下存放了许多工具,如图1—6所示。

图1—6
其中有几个必要常用的工具adb.exe、sqlite.exe、ddms.bat。
abd.exe
该工具的功能强大,如向存取文件、安装或删除应用等。如果在下载SDK且解压后发现tools目录中没有adb.exe,难么将\ platform-tools目录下的adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll三个文件复制到tolls目录下,然后重启adb即可。
该工具在DOS下使用,点击“开始”后点击“运行”,输入“cmd”进入DOS,在命令行中输入“abd”显示所有abd命令,如图1—7所示。

图1—7
其中比较常有的有,adb push、adb pull、adb install、adb uninstall、adb remount、adb shell等。(命令较多在这里不做解释,如有兴趣可自行查看)
例:
将PCC:下的aaa文件放入手机sd卡中,用命令adb push C:\aaa /mntsdcard。
将手机/data目录下的aaa文件取出到PC D:,用命令adb pull /data/aaa D:\。
安装一个aaa应用,用命令adb install C:\aaa.apk。
进入shell,输入adb shell。
如果在shell中,发现root用户无法删除某个文件,可以退出shell,再输入adb remount,重新进入shell后即可删除。
Sqlite.exe
Sqlite是android的关系数据库,可以在shell使用,也可以将数据库文件取出后使用sqlite.exe打开。
在shell中使用,只需要找到该数据库文件的路劲后输入sqlite 数据库路径。在sqlite.exe中使用,可以将该文件从手机去取出,取出方法上文已说明,用命令adb pull ,然后打开sqlite.exe将文件拖入,回车即可。
Sqlie数据库设置可在数据库中输入.help查看。该工具的语法和基本采用sql语法,在此不做说明。
ddms
这个工具主要用途是可以获取手机运行日志,双击ddms,打开该工具
,如图1—8所示。

图1—8
手机运行的日志在“log”区域,在“name”加载了该手机各运行模块和已启动的服务。
该工具还可以模拟电话、短信事件。选择Emulator Control标签页,在Telephony Actions区域中Incoming number输入框中输入号码,Voice和Sms按钮,如选择Voice,然后点击Call,模拟器将收到模拟的电话事件,如输入选择Sms,可在其后的文本框中输入短信内容,然后点击call,模拟器将模拟手机短息事件。
其他工具的使用方法在这里不做说明,读者可自行查阅。
busybox工具
该工具是Linux常用命令集,集成Linux常用操作命令,很方便的一个工具。Android自身也有一个命令集工具toolbox,不过该工具比较简陋,不建议使用。
Busybox工具可在网上获得,可直接使用成品,或下载该工具的源码,自行编译后使用,建议初学者使用成平 。
下载该文件后,将该文件push进手机中,不要将该工具push进sd卡,那样将无法使用该工具,应为用户和组权限非用户权限且不可修改。
busybox放进手机/data目录以后需要修改用户权限,组权限无需修改,如图1—9所示。

图1—9
我们可以看到,push进手机后该文件的权限是“-rw-rw-rw-”,第一个“-”说
明该文件的类型,此处是执行文件;后面依次三个字符一组,对应的权限为当
前用户、用户组、其他用户,我们只需要给当权用户赋予执行权限即可。用命
令chmod 766 busybox后即可使用busybox,busybox的用法举例,如果需要显
示当前目录下的文件,使用命令busybox ls –al;如果需要常看当前网卡信息可
以用busybox ifconfig等。当然在使用之前需要修改环境变量,可以用以下方法
修改,如export PATH=$PATH:/data(busybox在/data目录)。
当然你也可以先建立busybox的链接,不同的链接名完成不同的功能。
#ln -sbusybox ls
#ln -sbusybox rm
#ln -sbusybox mkdir
然后分别运行这三个链接
#./ls
#./rm
#./mkdir
就可以分别完成了ls rm 和mkdir命令的功能.虽然他们都指向同一个busybox
但是只要链接名不同,完成的功能就不同。
当然也可以将busybox作为脚本写入/system/xbin当中(具体方法这里不做讨论),此过程需要重新挂载手机文件系统,初学者慎用。方法如下:
将busybox传入手机的SD卡,可以使用下面的命令或自己想其他办法。打开terminal(Linux,Mac)或cmd(Windows)输入命令:
adb push ~/Desktop/busybox /mnt/sdcard
输入以下命令,为了在/system目录写入文件
adb shell
su
mount -o remount,rwx -t yaffs2 /dev/block/mtdblock3 /system
使用 ls 检查一下 /system 里是否有 xbin 目录,没有的话输入 mkdir xbin 创建,因为本示例是要把busybox安装到 /system/xbin 。
复制 busybox 文件到 /system/xbin,并为其分配“可执行”的权限
cp /mnt/sdcard/busybox /system/xbin
chmod 766 busybox
这时就可以使用 busybox 的命令了,例如以前没有清屏的clear命令,现在只需输入 busybox clear 就可以实现清屏功能,使用完整版的 ls 只需输入 busybox ls 。但是每次前面都加上个busybox太麻烦了,所以我们还要继续完成安装。在 /system/xbin 下输入busybox --install如果想安装到别的目录,则把点替换成别的路径。
tcpdump
tcpdump是一个命令行方式的嗅探工具。它诞生的时候较早,是许多图形化嗅探工具的雏形。主要作用是截获制定接口或所有接口的数据包,且能按照一定规则过滤截获的数据包,以此满足使用者分析其内容的目的。
在一些Linux发行版本中,tcpdump通常作为标准的软件包被默认安装,当然Android也不例外。执行“tcpdump”命令可以确定是否已安装了tcpdump。如果未安装,可以去http://www.tcpdump.org下载最新的tcpdump源码包。在编译之前,应先确定pcap库(libpcap)已经安装完毕。这个库是编译tcpdump时所必需的。如果该库已经安装,就可以执行下面的命令来编译安装tcpdump:
cptcpdump-x.x.x.tar.gz /usr/local/src/
cd/usr/loacal/src/
tar xzvftcpdump tcpdump-x.x.x.tar.gz
./configure
make
makeinstall
编译完成后会生成tcpdump的执行文件。
tcpdump的用法其实很简单,不需要太多的关注,直接输入tcpdump命令可产看详细用法。

上图列出了tcpdump详细的用法,我们常用的方法是使用:
tcpdump –i interface –ssnaplen –w file
i参数的作用是指定需要抓哪个网卡的数据,关于网卡,我们可以用ifconfig查出当前的网卡。在命令行输入“ifconfig”即可。
-s参数指定是否需要分割数据包,一般用0
-w捕获的数据包的存储路径。
关于数据包的查看方法我们可以直接用strings命令来查看数据包,如在/sdcard目录下有一个数据包aa.cap,我们要查看他可以用strings /sdcard/aa.cap进行查看,也可以用strings /sdcard/aa.cap > /data/aa.txt命令,将数据包已字符串形式输入aa.txt文档后再使用命令cat –bn/data/aa.txt查看,当然还可以将数据包取出,放入PC机查看。
至此该文档已结束,希望对阅读者有一定的帮助。
Android自动化测试框架Robotium学习笔记
刚好前段时间也研究了一下Android的自动化测试框架。感觉用起来还是比较方便的。
几点体会也一起和大家交流下,有一些内容还在慢慢学习中:
1.Java5(2004-10)开始推出了Instrumentation,这是一个可以在main之前Java虚拟机加载类时改变Java类字 节码或类classpath等内容的工具,同时JDK1.6还提供了运行过程中的动态改变,如在方法执行前后加入度量时间的代码,使Java代码可度量就 是一个很典型的应用。不过这需要涉及到Java字节码有较深入的理解进行字节码直接编辑改写,或者需要借助开源字节码项目如bcel,ASM或 javassist等,以简化对字节码的操作。
2.Instrumentation与Btrace。Btrace是基于Instrumentation和ASM的,只要理解了Instrumentation的原理和ASM对字节码的操作原理,了解Btrace就不困难了。
3.Android的 测试框架robotium框架,使用的类也是Instrumentation,其原理应该也类似。为某工程新建了一个测试工程,在安装原有工程项目时,也将测试的工程项目安装到AVD(模拟器)上面,同时通过测试的工程项目来与运行时的项目交互,触发其组件的动作等。这种方法的缺点是要求两个项目同时安装到AVD上面。Google将会考虑采取Remote Control的方式实现自动化测试框架,类似于selenium的Remote Control,即在AVD上运行一个监控程序,而测试项目只需要连接这个监控程序,并发送相应的指令即可与程序进行交互,进行测试。希望早日实现这种方式~,目前的自动化测试使用前种方法也可。Robotium其底层仍是采用Android的Instrumentation!
4.Android的Instrumentation对某个监控程序进行交互时,其大致采用如下步骤:
1)启动时将项目配置文件AndroidManifest.xml文件中的instrumentation标签中的内容进行初始化,其中标明了所使用的测试运行类,目标项目的包名等
2)执行测试时(可用adb命令触发),将启动目标应用的Activity,同时将待测试ActivityThread作为一个引用进行初始化,如果找不到目标应用则会报错
3)在测试时测试项目的任何对目标项目进行的操作,都会用异步的方式,将消息体放在目标程序的MessageQueue里面,这样目标程序在看到自己的MessageQueue里有内容时,就会执行之。
整个初始化过程还有待研究,关键应该是在于AndroidManifest.xml文件中内容的标识
Android自动化测试工具-Monkey
前言:
最近开始研究Android自动化测试方法,整理了一些工具、方法和框架,其中包括android测试框架,CTS、Monkey、Monkeyrunner、benchmark,以及其它test tool等等。
一、  什么是Monkey
Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。
Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。
二、 Monkey的特征
1、 测试的对象仅为应用程序包,有一定的局限性。
2、 Monky测试使用的事件流数据流是随机的,不能进行自定义。
3、 可对MonkeyTest的对象,事件数量,类型,频率等进行设置。
三、Monkey的基本用法
基本语法如下:
$ adb shell monkey[options]
options选项(adb -d shell monkey):
view plainprint?
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
[--ignore-crashes] [--ignore-timeouts]
[--ignore-security-exceptions]
[--monitor-native-crashes] [--ignore-native-crashes]
[--kill-process-after-error] [--hprof]
[--pct-touch PERCENT] [--pct-motion PERCENT]
[--pct-trackball PERCENT] [--pct-syskeys PERCENT]
[--pct-nav PERCENT] [--pct-majornav PERCENT]
[--pct-appswitch PERCENT] [--pct-flip PERCENT]
[--pct-anyevent PERCENT]
[--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
[--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
[--wait-dbg] [--dbg-no-events]
[--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
[--port port]
[-s SEED] [-v [-v] ...]
[--throttle MILLISEC] [--randomize-throttle]
COUNT
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送9999个伪随机事件:
$ adbshell monkey -p your.package.name -v 9999
四、Monkey测试的一个实例
通过这个实例,我们能理解Monkey测试的步骤以及如何知道哪些应用程序能够用Monkey进行测试。
Windows下(注:2—4步是为了查看我们可以测试哪些应用程序包,可省略):
1、 通过eclipse启动一个Android的emulator
2、 在命令行中输入:adb devices查看设备连接情况
C:\Documents andSettings\Administrator>adb devices
List of devicesattached
emulator-5554device
emulator-5556device
015ED9A50C00A01Adevice
3、 在有设备连接的前提下,在命令行中输入:adb shell 进入shell界面
C:\Documents andSettings\Administrator>adb shell
4、 查看data/data文件夹下的应用程序包。注:我们能测试的应用程序包都在这个目录下面
C:\Documents andSettings\Administrator>adb shell
# ls data/data
ls data/data
com.google.android.btrouter
com.android.providers.telephony
com.android.mms
com.android.providers.downloads
com.android.deskclock
com.android.email
com.android.browser
com.android.calculator2
....
5、 以com.android.calculator2作为对象进行MonkeyTest
#monkey-p com.android.calculator2 -v 9999
其中:
-p表示对象包
–v 表示事件数量
运行过程中,Emulator中的应用程序在不断地切换画面。
按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。
注:具体参数的设定可参考:
http://developer.android.com/guide/developing/tools/monkey.html
五、关于Monkey测试的停止条件
Monkey Test执行过程中在下列三种情况下会自动停止:
1、如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
2、如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
3、如果应用程序产生了应用程序不响应(application notresponding)的错误,Monkey将会停止并报错。
通过多次并且不同设定下的Monkey测试才算它是一个稳定性足够的程序。
Monkey测试简介[附示例]
一、Monkey测试简介
Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。
二、Monkey程序介绍
1) Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;
2) Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径 是:/system/bin/monkey;这样就可以通过在CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试了。
三、Monkey命令的简单帮助
要获取Monkey命令自带的简单帮助,在CMD中执行命令:
adb shell monkey –help
四、Monkey命令参数介绍
1) 参数:  -p
参数-p用于约束限制,用此参数指定一个或多个包(Package,即App)。指定
包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。
* 指定一个包: adb shell monkey -pcom.htc.Weather  100
说明:com.htc.Weather为包名,100是事件计数(即让Monkey程序模拟100次随机用户事件)。
* 指定多个包:adb shell monkey -pcom.htc.Weather –p com.htc.pdfreader  -p com.htc.photo.widgets 100
* 不指定包:adb shell monkey 100
说明:Monkey随机启动APP并发送100个随机事件。
* 要查看设备中所有的包,在CMD窗口中执行以下命令:
>adb shell
#cd data/data
#ls
2) 参数:  -v
用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:
日志级别 Level 0
示例 adb shell monkey -pcom.htc.Weather –v 100
说明 缺省值,仅提供启动提示、测试完成和最终结果等少量信息
日志级别 Level 1
示例 adb shell monkey -pcom.htc.Weather –v -v 100
说明  提供较为详细的日志,包括每个发送到Activity的事件信息
日志级别 Level 2
示例 adb shell monkey -pcom.htc.Weather –v -v –v 100
说明  最详细的日志,包括了测试中选中/未选中的Activity信息
3)参数:  -s
用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。
* 示例:
Monkey测试1:adb shell monkey -p com.htc.Weather –s10 100
Monkey 测试2:adb shell monkey -pcom.htc.Weather –s 10 100
两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽   然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的;
4) 参数:  --throttle <毫秒>
用于指定用户操作(即事件)间的时延,单位是毫秒;
* 示例:adbshell monkey -p com.htc.Weather --throttle 3000 100
5) 参数:  --ignore-crashes
用于指定当应用程序崩溃时(Force & Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。
* 示例1:adb shell monkey -p com.htc.Weather --ignore-crashes 1000
测试过程中即使Weather程序崩溃,Monkey依然会继续发送事件直到事件数目达到1000为止;
* 示例2:adb shell monkey -p com.htc.Weather 1000
测试过程中,如果Weather程序崩溃,Monkey将会停止运行。
6) 参数:  --ignore-timeouts
用于指定当应用程序发生ANR(Application NoResponding)错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。
7) 参数:  --ignore-security-exceptions
用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。
8) 参数:  --kill-process-after-error
用于指定当应用程序发生错误时,是否停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。
9) 参数:  --monitor-native-crashes
用于指定是否监视并报告应用程序发生崩溃的本地代码。
10) 参数:  --pct-{+事件类别} {+事件类别百分比}
用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比)
参数:
使用说明:
示例:
--pct-touch {+百分比}
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)
adb shell monkey -p com.htc.Weather --pct-touch 10 1000
--pct-motion {+百分比}
调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)
adb shellmonkey -p com.htc.Weather --pct-motion 20 1000
--pct-trackball {+百分比}
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)
adb shellmonkey -p com.htc.Weather--pct-trackball 30 1000
--pct-nav {+百分比}
调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)
adb shellmonkey -p com.htc.Weather --pct-nav 40 1000
--pct-majornav {+百分比}
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)
adb shellmonkey -p com.htc.Weather--pct-majornav 50 1000
--pct-syskeys {+百分比}
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、EndCall及音量控制键)
adb shellmonkey -p com.htc.Weather --pct-syskeys 60 1000
--pct-appswitch {+百分比}
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法
adb shellmonkey -p com.htc.Weather --pct-appswitch 70 1000
--pct-anyevent {+百分比}
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等
adb shellmonkey -p com.htc.Weather
--pct -anyevent 100 1000* 指定多个类型事件的百分比:
adb shellmonkey -p com.htc.Weather --pct-anyevent 50 --pct-appswitch 50 1000
注意:各事件类型的百分比总数不能超过100%;
monkey测试工具
当Monkey程序在模拟器或设备运行的时候,如果用户出发了比如点击,触摸,手势或一些系统级别的事件的时候,它就会
产生随机脉冲,所以可以用Monkey用随机重复的方法去负荷测试你开发的软件.
最简单的方法就是用用下面的命令来使用Monkey,这个命令将会启动你的软件并且触发500个事件.
$ adb shell monkey -v -pyour.package.name 500更多的关于命令Monkey的命令的信息,可以查看UI/Application
Exerciser Monkey documentationpage.
com.android.stk
com.android.htmlviewer
com.android.globalsearch
com.android.gpstest
com.android.googlesearch
wnc.w88.engineermode
com.android.calculator2
com.android.inputmethod.latin
com.svox.pico
com.android.soundrecorder
com.android.packageinstaller
android.tts
com.android.spare_parts
com.android.globaltime
com.android.sdksetup
com.quicinc.bluetooth
com.android.email
com.qualcomm.qx.neocore
com.android.development
com.android.term
com.android.server.vpn
com.android.contacts
com.android.camera
wnc.w88.factorymode
com.android.providers.applicati
com.android.providers.settings
com.android.voicedialer
com.android.phone
com.android.providers.contacts
com.android.launcher
com.android.mms
com.android.providers.telephony
com.android.providers.userdicti
com.android.providers.media
com.android.providers.calendar
com.android.calendar
com.android.providers.drm
com.android.providers.downloads
com.android.alarmclock
com.android.settings
com.android.qualcomm
com.android.browser
com.android.music
Monkey是一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应
用程序进行压力测试。Monkey包括许多选项,它们大致分为四大类:
· 基本配置选项,如设置尝试的事件数量。
· 运行约束选项,如设置只对单独的一个包进行测试。
· 事件类型和频率。
· 调试选项。
在Monkey运行的时候,它生成事件,并把它们发给系统。同时,Monkey还对测试中的系统进行监测,对下列三种情况进
行特殊处理:
· 如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
· 如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
· 如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。
Monkey基本用法
可以通过开发机器上的命令行或脚本来启动Monkey。由于Monkey运行在模拟器/设备环境中,所以必须用其环境中的shell
来进行启动。可以通过在每条命令前加上adb shell来达到目的,也可以进入Shell后直接输入Monkey命令。基本语法如下:
$ adb shell monkey [options]
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典
型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:
$ adb shell monkey -pyour.package.name -v 500
命令选项参考
下表中列出了Monkey命令行可用的全部选项。
类别
选项
说明
常规
--help
列出简单的用法。
-v
命令行的每一个-v将增加反馈信息的级别。Level 0(缺省值)除启动提示、测试完成和最终结果之外,提供较少信息。Level
1提供较为详细的测试信息,如逐个发送到Activity的事件。Level2提供更加详细的设置信息,如测试中被选中的或未被选
中的Activity。
事件
-s
伪随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件序列。
--throttle
在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件
将尽可能快地被产成。
--pct-touch
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)。
--pct-motion
调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)。
--pct-trackball
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)。
--pct-nav
调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)。
--pct-majornav
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按
键)
--pct-syskeys
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。
--pct-appswitch
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的
一种方法。
--pct-anyevent
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。
约束限制
-p
如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity。如果你的应用程序还需要访问其它包
里的Activity(如选择取一个联系人),那些包也需要在此同时指定。如果不指定任何包,Monkey将允许系统启动全部包里
的Activity。要指定多个包,需要使用多个 -p选项,每个-p选项只能用于一个包。
-c
如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任
何类别,Monkey将选 择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要
指定多个类别,需要使用多个-c选项,每个-c选 项只能用于一个类别。
调试
--dbg-no-events
设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不会再进一步生成事件。为了得到最佳结果,把它
与-v、一个或几个包约 束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视
应用程序所调用的包之间的转换。
--hprof
设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要
小心使用它。
--ignore-crashes
通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,
直到计数完成。
--ignore-timeouts
通常,当应用程序发生任何超时错误(如“Application Not Responding”对话框)时,Monkey将停止运行。如果设置此选项
,Monkey将继续向系统发送事件,直到计数完成。
--ignore-security-exceptions
通常,当应用程序发生许可错误(如启动一个需要某些许可的Activity)时,Monkey将停止运行。如果设置了此选项,
Monkey将继续向系统发送事件,直到计数完成。
--kill-process-after-error
通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发
生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状
态。
--monitor-native-crashes
监视并报告Android系统中本地代码的崩溃事件。如果设置了--kill-process-after-error,系统将停止运行。
--wait-dbg
停止执行中的Monkey,直到有调试器和它相连接。
monkey [-p ALLOWED_PACKAGE [-pALLOWED_PACKAGE] ...]
[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
[--ignore-crashes] [--ignore-timeouts]
[--ignore-security-exceptions] [--monitor-native-crashes]
[--kill-process-after-error] [--hprof]
[--pct-touch PERCENT] [--pct-motion PERCENT]
[--pct-trackball PERCENT] [--pct-syskeys PERCENT]
[--pct-nav PERCENT] [--pct-majornav PERCENT]
[--pct-appswitch PERCENT] [--pct-flip PERCENT]
[--pct-anyevent PERCENT]
[--wait-dbg] [--dbg-no-events] [-f scriptfile]
[--port port]
[-s SEED] [-v [-v] ...] [--throttle MILLISEC]
COUNT
讲了这么多,好像很枯燥,很难懂,即使看完了选项也不知道如何使用
首先我们应该明白我们不可能使用monkey来制定做一样测试,重复做很多次,因为monkey是伪随机的,就是说虽然有一
定规律可循,但是并不是我们就可以指定动作,但是我们可以通过添加命令选项来将操作限制在一定的范围内。
monkey -v -pcom.android.camera --throttle 5000 --pct-anyevent 100 500
这条命令的解释是:-v显示默认程度的信息;-p com.android.camera是指定测试的程序,
// Allowing start of Intent {act=android.intent.action.MAIN cat=[android.in
tent.category.LAUNCHER]cmp=com.android.camera/.Camera } in package com.android.
camera
这是开始测试的camera的内容
--throttle 5000 设定延时
--pct-anyevent 100设定启动activity的百分比为100%
如果没有指定,我们可以看到在开始执行的时候8个事件(上面的选项中有介绍)的百分比如下:
# monkey -v -pcom.android.camera --throttle 5000 500
monkey -v -pcom.android.camera --throttle 5000 500
:Monkey: seed=0 count=500
:AllowPackage:com.android.camera
:IncludeCategory:android.intent.category.LAUNCHER
:IncludeCategory:android.intent.category.MONKEY
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 15.0%
//   3: 25.0%
//   4: 15.0%
//   5: 2.0%
//   6: 2.0%
//   7: 1.0%
//   8: 15.0%
指定事件之后
# monkey -v -p com.android.camera--throttle 5000 --pct-anyevent 100 500
monkey -v -pcom.android.camera --throttle 5000 --pct-anyevent 100 500
:Monkey: seed=0 count=500
:AllowPackage:com.android.camera
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory:android.intent.category.MONKEY
// Event percentages:
//   0: 0.0%
//   1: 0.0%
//   2: 0.0%
//   3: 0.0%
//   4: 0.0%
//   5: 0.0%
//   6: 0.0%
//   7: 0.0%
//   8: 100.0%
最后count就是事件数设定为500