Monkey 入门
1.什么是Monkey
Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。
2.Monkey的特征
(1)测试的对象仅为应用程序包,有一定的局限性。
(2) Monky测试使用的事件流数据流是随机的,不能进行自定义。
(3)可对MonkeyTest的对象,事件数量,类型,频率等进行设置。
3.关于Monkey测试的停止条件
Monkey Test执行过程中在下列三种情况下会自动停止:
(1)如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
(2)如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
(3)如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
通过多次并且不同设定下的Monkey测试才算它是一个稳定性足够的程序。
4.Monkey的基本用法
4.1基本语法
(1) $ adb shell monkey [options]
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。
下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:
adb shell monkey -p your.package.name -v 500 。
adb shell monkey -p your.package.name -vvv 500 > monkeytest.txt
-p表示对象包
-v为 verbose的缩写(信息级别就是日志的详细程度),就是详细输出事件等级,这个3个v就是输出等级1至3的所有事件.(使用管道命令将输出结果放到一个文本里面方便查看)。
4.2Monkey命令参数介绍
4.2.1参数 -p
参数-p用于约束限制,用此参数指定一个或多个包(Package,即App)。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。
(1)指定一个包:adb shell monkey -p com.htc.Weather 100
说明:com.htc.Weather为包名,100是事件计数(即让Monkey程序模拟100次随机用户事件)。
(2) 指定多个包:adb shell monkey -p com.htc.Weather –p com.htc.pdfreader-pcom.htc.photo.widgets 100
执行apk集合:
monkey –pkg-blacklist-file /data/blacklist.txt -c <options> -s <seed><限制语句> --throttle <milliseconds> -v 执行次数> C:\blacklist_test.txt //执行黑名单以外的应用
或
monkey –pkg-whitelist-file /data/whitelist.txt -c <options> -s <seed><限制语句> --throttle <milliseconds> -v 执行次数>C:\whitelist_test.txt //执行白名单的应用
(3)不指定包:adb shell monkey 100
说明:Monkey随机启动APP并发送100个随机事件。
4.2.2 参数-v
用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:
(1)日志级别Level 0
示例:
adb shell monkey -p com.htc.Weather –v 100
说明:缺省值,仅提供启动提示、测试完成和最终结果等少量信息。
(2)日志级别Level 1
示例:
adb shell monkey -p com.htc.Weather –v -v 100
说明:提供较为详细的日志,包括每个发送到Activity的事件信息。
(3)日志级别Level 2
示例:
adb shell monkey -p com.htc.Weather –v -v –v 100
说明:最详细的日志,包括了测试中选中/未选中的Activity信息。
4.2.3 参数:-s
用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。
示例:
Monkey测试1:adb shell monkey -pcom.htc.Weather –s 10 100
Monkey测试2:adb shell monkey -pcom.htc.Weather –s 10 100
两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的。
** * PS: 伪随机测试***
Monkey test是伪随机测试,也就是说,操作都是随机产生的。我这次发现了bug,但是我再次运行同样的命令,bug就不再出现了。
这里需要简单的讲一下随机和伪随机。真正的随机,是完全不可重复和定义的。也就是说,从理论上是无法定义下一个随机数到底是什么。那么在计算机里,能不能实现随机数呢? 至少到目前,还不行。那我们用的随机数都是哪里来的呢?我们现在常用的是一种伪随机算法,也就是说无限接近随机,但是没法完全达到随机。
伪随机算法都需要一个种子。一系列的随机数,一般的做法就是把上一个随机数作为下一个随机数的种子。可以这么理解,伪随机数算法相当于是一个函数,入口是一个种子,出口是一个伪随机数。我们可以无限逼真的制造种子,例如种子里面加入当前时间的因子,加入计算机一些硬件编码的因子,以保证伪随机数足够的“随机”,但是,我说的是但是,相同的种子,出来的伪随机数还是相同的。
前面说的一切,重点就是最后一句话:相同的种子,出来的伪随机数还是相同的。
现在,我们再来理解monkey test。测试开始的时候,monkey会根据一个伪随机数种子,后面的序列将根据这个伪随机数种子依次产生。也就是说,第二次操作的种子是第一个操作的伪随机数,第三次操作的种子是第二次操作的伪随机数。也就是说,我们第一个给的种子相同,那么monkey test的操作序列就是一样的。
我们再来看monkey test的运行结果:
** System appears tohave crashed at event 48 of 500 using seed 0
系统在500个操作的第48个操作里出现了异常,用的种子是0。0就是伪随机数的种子。
我们下次想用相同的操作序列再现这个异常,只需要monkey -p com.android.browser -s 0 500
当然,这个操作也是需要相同的起点的。也就是说,第一次monkey test之前,画面是停在空白主页面,第二次monkey test之前,画面停在淘宝网主页,那么即使使用相同的随机数种子,现象还是会不一样的。
如果条件完全相同,随机数种子也给的是相同的,而现象还是不一样,异常还是不一定,那么,找找程序里是不是有什么不定因素。
4.2.4 参数: --throttle <毫秒>
用于指定用户操作(即事件)间的时延,单位是毫秒;
示例:
adb shell monkey -p com.htc.Weather–throttle 3000 100
4.2.5 参数: --ignore-crashes
用于指定当应用程序崩溃时(Force & Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。
示例1:
测试过程中即使Weather程序崩溃,Monkey依然会继续发送事件直到事件数目达到1000为止。
示例2:
adb shell monkey -pcom.htc.Weather 1000
测试过程中,如果Weather程序崩溃,Monkey将会停止运行。
4.2.6 参数: --ignore-timeouts
用于指定当应用程序发生ANR(Application No Responding)错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。
4.2.7 参数: --ignore-security-exceptions
用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。
4.2.8 参数: --kill-process-after-error
用于指定当应用程序发生错误时,是否停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。
4.2.9 参数: --monitor-native-crashes
用于指定是否监视并报告应用程序发生崩溃的本地代码。
4.2.10 参数: --pct-{+事件类别}{+事件类别百分比}
用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比)。
(1)–pct-touch {+百分比}0
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)
示例:adb shell monkey -p com.htc.Weather --pct-touch 10 1000
(2)–pct-motion{+百分比}1
调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)
示例:adb shell monkey -p com.htc.Weather --pct-motion 20 1000
(3)–pct-trackball{+百分比}2
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)
示例:adb shell monkey -p com.htc.Weather --pct-trackball 30 1000
(4)–pct-nav{+百分比}3
调整“基本”导航事件的百分比(导航事件由来自方向输入设备up/down/left/right组成)。
示例:adb shell monkey -p com.htc.Weather --pct-nav 40 1000
(5)–pct-majornav{+百分比}4
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)。
示例:adb shell monkey -p com.htc.Weather --pct-majornav 50 1000
(6)–pct-syskeys{+百分比}5
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。
示例:adb shell monkey -p com.htc.Weather --pct-syskeys 60 1000
(7)–pct-appswitch{+百分比}6
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。
示例:adb shell monkey -p com.htc.Weather --pct-appswitch 70 1000
(8)–pct-flip{+百分比}7
调整“键盘翻转”事件的百分比。
示例:adb shell monkey -p com.htc.Weather --pct-flip 70 1000
(9)–pct-anyevent{+百分比}8
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等
示例:adb shell monkey -p com.htc.Weather–pct -anyevent 100 1000
- 指定多个类型事件的百分比:
adb shell monkey -p com.htc.Weather --pct-anyevent 50
–pct-appswitch 50 1000
注意:各事件类型的百分比总数不能超过100%;
** PS:**绿色的数字对应下面百分比对应的数字。比如下图中0:15.0%,表示分配–pct-touch事件15%。测试100次分配15次测试down-up。
** ##**百分比控制##
如果在monkey参数中不指定上述参数,这些动作都是随机分配的,9个动作其每个动作分配的百分比之和为100%,我们可以通过添加命令选项来控制每个事件的百分比,进而可以将操作限制在一定的范围内。
总结
工作中为了保证测试数量的完整进行,我们一般不会在发生错误时立刻退出压力测试。 Monkey测试命令如下:
adb shell monkey –pcom.xy.android.junit–s 500 –ignore-crashes –ignore-timeouts –monitor-native-crashes–vv 1000 > /sdcard/log.txt
4.2.11参数 黑白名单
黑名单:不测试的应用。
白名单:只测试这部分应用。
不能同时设置黑名单和白名单。
选项说明
–pkg-blacklist-file
PACKAGE_BlACKLIST_FILE
apk黑名单,屏蔽掉黑名单中的apk
–pkg-whitelist-file
PACK_WHITELIST_FILE
apk白名单,只测试包含在白名单中的apk
以黑名单为例,具体的步骤如下:
(1)查找系统的包,并输出到e盘的pkg文档里。adb shell pm listpackage>e:\pkg.txt
(2)将想要加入黑名单的apk的包名放到blacklist.txt里,最后push进设备。adb push e:\blacklist.txt /data/local/tmp/
(3)执行Monkey命令。adb shell monkey --pkg-blacklist-file /data/local/tmp/blacklist.txt–throttle 200 200
5.使用Monkey流程
总的来说使用monkey进行测试是比较简单的,只是需要做一些比较复杂的准备工作。下面详解测试步骤(很简单的哦),所讲内容是建立在已经配置好ADB环境的基础上(如果这部分不清楚请先google一下先配置好环境,这里不做描述)。
1、搭建环境:jdk&SDK for windows(http://blog.csdn.net/u011649536/article/details/36187645)
2、ADB连接Android测试设备。
3、确定你要测试的应用的PackageName。
4、使用Monkey发一条测试命令。
5.1 ADB连接Android测试设备.
5.1.1.使用模拟器
那么启动后通常是已经连在ADB上了。
Adb devices
5.1.2.使用真机
(1)方式一:使用USB把Android设备接到PC上,然后装上驱动(不好找驱动的话就用豌豆荚吧)。
(2)方式二:首先得确保你的Android已经成功root了,那么可以使用wifi无线连接。
①下载一个wifi adb应用装在你的android设备上;
②在android上打开wifi adb;
③在pc上的命令行中输入wifi adb中显示的那部分内容:adb connect 192.168.x.x,命令行中显示connected 192.168.x.x那么说明连接好了。
比较推荐方式二,这样可以不用去下载驱动(主要是驱动很多都不稳定),而且不伤害电池。长时间插在USB上对电池始终是不好的。只不过这种方式设备一旦休眠那么就可能需要重连。
5.2 确定要测试的应用的PackageName。
5.2.1 通用的方法
(1)在android设备上点击一下你要测试的设备,然后就不用操作设备了。
(2)在PC上的命令行输入:adb logcat>D:/log.txt *:I
在这里的D:/log.txt可以改成其他的路径,但是一定要先确保路径下没有这个文件,不然的话以前的文件就被改掉了,一定要小心。且log日志是在保存在手机,而不是PC。
(3)按下Ctrl+c先停掉(为了避免过多的新信息)。打开刚刚的那个文件D:/log.txt。 从文件最下面开始找下面格式的信息。
I/ActivityManager(数字): Displayed 包名/类名: +数字ms
例如信息如下:
I/ActivityManager(272): Displayed com.vane/.act.ActLauncher:+315ms
不过可能会发现有很多这种格式的信息,到底哪个才是你需要的呢,如果严格按照刚刚的步骤做的话,那么很可能是最下面那条信息,即使不是那么也肯定是最下面几条信息中的某一条,这需要你根据应用进行辨别。
(4)记下刚刚得到的包名,例子中的包名为“com.vane”。马上就会用。
5.2.2 root后的设备查找PackageName
Adb shell cd data/data
5.3使用Monkey发一条测试命令。
直接在pc上的命令行输入:adb shell monkey -p com.vane -v 50
备注:上面命令中的com.vane就是之前获得的包名;命令中的参数你可以自己根据需要参考上面的参数文档进行修改。
5.4 观察android设备,直到Monkey停止。
如果应用崩溃的话就好分析一下Monkey中的信息。
5.5 检查测试是否完成
通过info.txt文件,可以查看Monkey是否执行成功。如下图
6 adbserver is out of date的解决办法
6.1出错原因
adb的端口被其他程序的进程占领了,所以要做的就是找到并kill该进程。一般情况下,使用adb的时候最好不要使用各种手机助手、手机管家一类的软件,如果PC上有类似软件,先关闭对应进程,会大大减少这类问题出现。
6.2解决方案
(1)在cmd中执行adbnodaemon server,查看adb的端口号是多少,一般情况下是5037。
(2)再执行netstat -ano |
findstr “5037”(端口号)。
这里稍微解释一下,显示的从左到右的意思分别是,连接类型(TCP)、本地地址和端口、外部地址和端口、连接状态、进程的PID号。这里有两个进程占据着 5037端口,其中一个占据的是本地的5037端口,另外一个占据的是外部的5037端口,要kill的就是那个本地的PID为240的端口。
(3)打开任务管理器。点击进程,现在要找的是PID为240的进程。(有时候可能会发现任务管理器里没有进程PID的信息显示,这时候只要点击任务管理器的查看–>选择列,如下图,然后把PID勾选上即可。)把PID为240的进程kill掉。然后再运行adb命令。