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作为一个向待测应用发送随机按键消息的测试工具,验证待测应用在这些随机性的输入面前是否会闪退或者崩溃)

wps1

4. Monkey 参数大全

wps2

5. Monkey 命令基本参数介绍

Monkey基本用法:

adb shell monkey [options] <event-count>

Category

Option

Description

通用

--help

打印帮助

-v

命令行中的每个-v都将增加测试信息的详细级别
Level 0 (默认)提供了很少的信息除了启动通知,测试完成,和最终结果。-v
Level 1 提供了更详细的测试运行,如个别事件被发送到您的Activity。 -v -v
Level 2 提供了更详细的设置等信息如Activity选中或未选中的测试信息。 -v -v -v
根据你对测试结果要求的详细程度来确定您用几个-v,一般会用-v -v -v 最详细的输出到指定文件中,方便查找bug的原因。

事件

-s <seed>

伪随机数生成器的种子值,如果用相同的种子值再次运行monkey,将生成相同的事件序列。(该种子值对于Bug复现至关重要)
注:如果不指定种子值,系统会随机生成一个种子值,在出现Bug时该种子值会和Bug信息一起被输出,这也是为了便于复现该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日志分析出错原因。

posted on 2019-11-11 18:02  农夫山药  阅读(738)  评论(0编辑  收藏  举报