Android稳定性之Monkey测试
1. Monkey是什么
Monkey是一个运行在模拟器或者Android设备中可以产生类似用户点击、触摸、手势以及一些系统级的伪随机事件流的程序。我们可以通过命令让monkey向模拟器或者Android设备发送伪随机事件流来对我们开发的App进行压力测试。
1.1. Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是: /system/framework/monkey.jar,包名:com.android.commands.monkey.Monkey;
1.2. Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中 的存放路径是:/system/bin/monkey;
内容为:
# Script to start "monkey" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/monkey.jar
trap "" HUP
exec app_process $base/bin com.android.commands.monkey.Monkey $*
app_process是Android的系统启动进程,用于启动zygote和其他java进程:
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
} else if (className) {
runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
}
1.3. Monkey 命令启动方式:
a. 可以通过PC机CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试
b. 在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数} 来进行Monkey测试
2. 环境搭建
下载Android SDK并配置adb环境变量;
打开Android设备开发者选项中的USB调试。
3. Monkey 架构
Monkey 运行在设备或模拟器上面,可以脱离PC运行(普遍做法是将monkey作为一个向待测应用发送随机按键消息的测试工具,验证待测应用在这些随机性的输入面前是否会闪退或者崩溃)
4. Monkey 参数大全
5. Monkey 命令基本参数介绍
Monkey基本用法:
adb shell monkey [options] <event-count>
Category | Option | Description |
通用 | --help | 打印帮助 |
-v | 命令行中的每个-v都将增加测试信息的详细级别 | |
事件 | -s <seed> | 伪随机数生成器的种子值,如果用相同的种子值再次运行monkey,将生成相同的事件序列。(该种子值对于Bug复现至关重要) |
--throttle <milliseconds> | 在事件之间插入特定的延时时间(单位毫秒),这样做可以延缓monkey执行事件的速度,默认没有延时,monkey会以最快速度将指定的事件个数执行完。 | |
--pct-touch <percent> | 指定touch(触摸)事件的百分比,touch事件是由一个DOWN和一个UP组成,按下并抬起即是一个touch事件 | |
--pct-motion <percent> | 指定motion(手势)事件百分比,motion事件是由屏幕上某处一个down事件、一系列伪随机的移动事件和一个up事件组成 | |
--pct-pinchzoom <percent> | 缩放事件百分比 | |
--pct-trackball <percent> | 指定trackball(轨迹球)事件的百分比,滚动球事件由一个或多个随机的移动事件组成,有时会伴随着点击事件 | |
--pct-rotation <percent> | 屏幕旋转事件百分比 | |
--pct-nav <percent> | 指定基本的导航事件百分比。导航事件由方向输入设备的上下左右按键所触发的事件组成,即四个方向键 | |
--pct-majornav <percent> | 指定主导航事件百分比。这些导航事件通常会导致UI界面发生变化,如5-way键盘的中间键,返回按键、菜单按键 | |
--pct-syskeys <percent> | 指定系统事件百分比。这些按键通常由系统保留使用,如Home、Back、Start Call、End Call、音量调节 | |
--pct-appswitch <percent> | 指定Activity启动的百分比。在随机的时间间隔中,monkey执行startActivity()方法,最大程度地覆盖应用中全部的Activity | |
--pct-flip <percent> | 键盘翻转事件百分比 | |
--pct-anyevent <percent> | 指定其他事件的百分比。包含所有其他事件,如按键、其他在设备上不常用的按钮等 |
约束 | -p <allowed-package-name> | 约束只对某个应用进行测试,your.package.name是你要进行测试的应用包名,如果要对多个应用进行测试可以使用多个-p |
-c <main-category> | 如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选 择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选 项只能用于一个类别。 | |
--pkg-whitelist-file <whitelist file> | 只执行在白名单中的apk。 | |
--pkg-blacklist-file <blacklist file> | 系统将执行除了黑名单中以外的apk。 |
调试 | --dbg-no-events | 设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。 |
--hprof | 设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要小心使用它。 | |
--ignore-crashes | 用于指定当应用程序崩溃时(Force & Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。 | |
--ignore-timeouts | 用于指定当应用程序发生ANR(Application Not Responding)错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。 | |
--ignore-security-exceptions | 用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。 | |
--kill-process-after-error | 通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。 | |
--monitor-native-crashes | 监视并报告Android系统中本地代码的崩溃事件。如果设置了--kill-process-after-error,系统将停止运行。 | |
--wait-dbg | 停止执行中的Monkey,直到有调试器和它相连接。 |
6. Monkey实例
(1) 使用命令行执行
以 xxx app为例,其包名为com.xxx.office.oa,PC连上Android设备后
a. 手机上创建Monkeylog文件夹:adb shell mk /sdcard/Monkeylog
b. 挂起logcat:adb shell "logcat -v time >/sdcard/Monkeylog/Logcat.log 2>&1"
c. 对该APP执行monkey测试:adb shell "monkey -c android.intent.category.LAUNCHER -c android.intent.category.MONKEY -c android.intent.category.DEFAULT -c android.intent.category.BROWSABLE -c android.intent.category.HOME -c android.intent.category.TEST --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -s 1423 -v -v -v --throttle 1000 -p com.xxx.office.oa 190000 >/sdcard/Monkeylog/MonkeyScreenLog.log 2>&1"
注:180000大致跑12小时,应用验收时一般要求12小时无异常
(2) 使用MoonLight执行
MoonLight为科大讯飞研发的一款插件化的手机应用调试工具,可用作Monkey自动化测试。
以xxx app为例,
a. config\task.xml配置项中的指令自动运行monkey,拉起被测试的app,支持中断恢复和定时停止。具体配置如下所示:
<TASK>
<CLASSNAME>iflytek.testTech.moonlight.task.monkey.Task_Monkey</CLASSNAME>
<TAGNAME>monkey</TAGNAME>
<Time_Minute>999</Time_Minute>
<NoMonkey>false</NoMonkey>
<MonkeyCommand>monkey -p com.xxx.office.oa --pct-syskeys 0 --ignore-crashes --ignore-native-crashes --ignore-timeouts --ignore-security-exceptions --throttle 1000 190000 </MonkeyCommand>
</TASK>
<!-- iTestMini配置项, 间隔, 包名(多个包名需英文逗号隔开)。默认监控cpu, pss内存, 系统总cpu, 系统剩余pss内存 -->
<TASK>
<CLASSNAME>iflytek.testTech.moonlight.task.itestmini.TH_iTestMini </CLASSNAME>
<TAGNAME>iTestMini</TAGNAME>
<AUTOSTART>false</AUTOSTART>
<interval>5</interval>
<pkg>com.xxx.office.oa</pkg>
<serverEnable>false</serverEnable>
<serverUrl>http:/itest.iflytek.com:2017/iTestServer/</serverUrl>
<serverUser>**</serverUser>
<serverPasswd>**</serverPasswd>
b. Android设备连上PC,点击批处理start.bat开始测试
7. Monkey测试结果分析
(1) Monkey finished
打开monkey log,查看log的最下端,是否有类似以下字段:
## Network stats: elapsed time=5123ms (5123ms mobile, 0ms wifi, 0ms not connected)
// Monkey finished
这个字段表明本次的Monkey测试完成。
(2) CRASH
同样,在得到monkey log后,搜索”CRASH”字段,如果搜索到有结果,则表明有进程出现问题,测试不通过,需要结合logcat和dropbox(/data/system/dropbox/)日志分析出错原因。
// CRASH: com.onekchi.downloadmanager (pid 12919)
(3) ANR
在monkey log中搜索该字段,如果有搜索有结果,则表示测试过程中,测试对象出现了无响应的现象,因此测试不通过,需要结合logcat和tombstone(/data/tombstones)日志分析出错原因。
(4) Exception
在monkey log中搜索该字段,如果有搜索有结果,则表示测试过程中,测试对象出现了异常,因而测试不通过,需要结合logcat日志分析出错原因。