· Monkey简介

Monkey 就是SDK中附带的一个工具。Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等)模拟对app的的操作,实现对正在开发的应用程序app进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。

Monkey稳定性测试完成后,开发人员可以结合monkey 打印的日志和系统打印的日志,分析测试中的问题。

 

· Monkey 测试的特点

Monkey 测试,所有的事件都是随机产生的,不带任何人的主观性;

测试的对象仅为应用程序包,有一定的局限性;

Monkey测试使用的事件数据流是随机的,不能进行自定义;

可对MonkeyTest的对象,事件数量,类型,频率等进行设置;

Monkey虽然可以根据一个指定的命令脚本发送按键消息,但其不支持条件判断,也不支持读取待测界面的值来执行验证操作。

 

· 什么时候开始跑Monkey

App功能基本稳定,没有严重bug时,才能够开始通过跑monkey进行稳定性测试。

 

· Monkey测试过程

1.启动一个Android手机或模拟器

2.查看设备连接情况  adb devices

3.在有设备连接的前提下,在命令行中输入:adb shell 进入shell界面

4.查看data/data文件夹下的应用程序包。

注:我们能测试的应用程序包都在这个目录下面

adb shell ls data/data

以任意一个包作为对象进行Monkey测试

monkey -p 包名 -v 500

-p:package,表示对象包

-v 表示日志反馈信息级别运行过程中,安卓设备中的应用程序在不断地切换画面。

 

在windows cmd模式下执行如下命令

adb shell monkey -p im.tower.plus.android -s 1 --pct-touch 30 --pct-motion 20 --throttle 500 --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v 100> D:\log.txt

 

· 停止Mokey脚本运行

手动关闭

1、先输入adb shell ps |grep monkey 查看monkey的pid值

2、再输入 kill -9 2353即可关闭进程(2353这是PID值)。

自动关闭

Monkey Test执行过程中在下列三种情况下会自动停止

1、如果限定了Monkey运行在指定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。

2、如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错

3、如果应用程序产生了应用程序不响应(application not responding)的错误,或者崩溃(crash),Monkey将会停止并报错。

4、通过多次并且不同设定下的Monkey测试才算它是一个稳定性足够的程序。

 

Monkey的一些参数

-P

用于约束限制,用此参数指定一个或多个包(Package,即App)。指定包之后,monkey将只允许系统启动指定的APP,如果不指定包,将允许系统启动设备中的所有APP.,就等于对整机进行测试;如果需要对多个包进行稳定性测试,需要使用多个-p参数。

指定一个包

adb shell monkey -p im.tower.plus.android  10

指定多个包

adb shell monkey -p com.tencent.mobileqq –p com.tencent.mm -p com.android.camera 100

不指定包

adb shell monkey 100

不指定包名的情况下,是对整个手机做稳定性测试

-v

用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:

日志级别Level 0

adb shell monkey -p im.tower.plus.android -v 100

跑monkey时,如果不给出参数V,默认日志级别为 Level0 ,Level0 表示仅提供启动提示、测试完成和最终结果等少量信息

日志级别Level 1

adb shell monkey -p im.tower.plus.android -v -v 100

日志级别Level 1,提供较为详细的日志,包括每个发送到Activity的事件信息

日志级别Level 2

adb shell monkey -p im.tower.plus.android  -v -v -v 100

日志级别Level 2,输出最详细的日志,包括了测试中选中/未选中的Activity信息

-s

用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。

第一次(找出BUG所用)

Monkey 测试1:adb shell monkey -p im.tower.plus.android -v 100

第二次(回归测试所用)

Monkey 测试2:adb shell monkey -p im.tower.plus.android -v -s 1608580990329 100

两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。

 

--throttle<毫秒>

用于指定用户操作(即事件)间的固定时延,单位是毫秒

adb shell monkey -p im.tower.plus.android --throttle 5000 100

throttle:延迟

--randomize-throttle

随机延迟时间为0到--throttle设置的值

adb shell monkey -p  im.tower.plus.android --throttle 500 --randomize-throttle -v -v 100

randomize:随机

--ignore-crashes

ignore 忽略 ,crashes崩溃

用于指定当应用程序崩溃时(Force& Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。

adb shell monkey -p im.tower.plus.android --ignore-crashes -v 1000

测试过程中即使程序崩溃,Monkey依然会继续发送事件直到事件数目达到1000为止

--ignore-timeouts

用于指定当应用程序发生ANR(Application No Responding)错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。

timeouts:超时

adb shell monkey -p im.tower.plus.android --ignore-timeouts 1000

--ignore-security-exceptions

用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。

adb shell monkey -p  im.tower.plus.android --ignore-security-exceptions 1000

--kill-process-after-error

process 进程

用于指定当应用程序发生错误时,是否停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态

Injection Failed:注入失败,意思是通过monkey向app发送模拟事件失败。

注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程

adb shell monkey -p  im.tower.plus.android --kill-process-after-error 1000

--monitor-native-crashes

monitor:监控

native:本地的  

crashes:崩溃

用于指定是否监视并报告应用程序发生崩溃的本地代码。

adb shell monkey -p  im.tower.plus.android --monitor-native-crashes 1000

--pct-{+事件类别}{+事件类别百分比}

pct:percent 百分比

用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比)

--pct-touch{+百分比}

调整触摸事件的百分比,是在屏幕某处按下并抬起的操作,

adb shell monkey -p im.tower.plus.android --pct-touch 10 1000

--pct-motion{+百分比}

调整滑动事件的百分比,滑动事件是指在屏幕某处的按下、随机移动、抬起的操作,即直线滑动操作。

adb shell monkey -p im.tower.plus.android --pct-motion 20 1000

--pct-trackball{+百分比}

调整轨迹球事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)

轨迹球事件,一般用来模拟一个或者多个曲线滑动动作。

adb shell monkey -p im.tower.plus.android --pct-trackball 30 1000

--pct-nav{+百分比}

调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)

adb shell monkey -p im.tower.plus.android --pct-nav 40 1000

--pct-majornav{+百分比}

调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:手机键盘的中间按键、回退按键、菜单按键)

adb shell monkey -p im.tower.plus.android --pct-majornav 50 1000

--pct-syskeys{+百分比}

调整系统事件百分比。(这些按键通常由系统保留使用,如Home、Back、Start Call、

End Call、音量调节),不常用

adb shell monkey -p im.tower.plus.android --pct-syskeys 100 1000

--pct-appswitch{+百分比}

调整Activity启动的百分比。(在随机的时间间隔中,Monkey 将执行一个 startActivity() 调用)

adb shell monkey -p im.tower.plus.android --pct-appswitch 100 1000

--pct-anyevent{+百分比}

调整其他事件的百分比。(这包含所有其他事件,如按键、其他在设备上不常用的按钮等)

adb shell monkey -p im.tower.plus.android --pct-anyevent 100 1000

--pct-flip{+百分比}

调整键盘事件主要是指一些与键盘相关的操作。如点击输入框、键盘弹起、点击输入框以外区域、键盘收回等

adb shell monkey -p im.tower.plus.android --pct-flip 100 1000

--pct-pinchzoom{+百分比}

缩放事件是指在屏幕上的两处同时按下,并同时移动,最后同时抬起。就是平时我们使用时的放大缩小操作。

adb shell monkey -p im.tower.plus.android --pct-pinchzoom 100 1000

 

· Monkey 日志

退出shell或者执行命令时先不要进shell

C:\>adb shell monkey -p 包名  -v 300  >e:\text.txt

adb shell monkey -p im.tower.plus.android -v 1000 > C:\Users\Simon\Desktop\test.txt

 

· Monkey测试结果分析

1)、ANR问题(程序无响应):在日志中搜索“ANR"(application no response)

2)、闪退问题:在日志中搜索"crash"

3)、异常:搜索"exception"

4)、强制退出:搜索"force closed"

5)、失败信息:搜索“fail”

6)、常规错误:搜索“error”

7)、空指针: 搜索“nullpoint”

Nullpoint-空指针 ,就是java的引用,java空指针异常就是引用本身为空,却调用了方法,一般指的是字符串变量未初始化、接口类型的对象没有用具体的类初始化。

8)内存不足:搜索“OOM”

OOM错误,即Out Of Memory,内存不足

OOM错误它来源于java抛出的java.lang.OutOfMemoryError异常。

OOM错误产生的原因:

主要包括两个方面:

自身原因:比如虚拟机本身可使用的内存太少;

外在原因:如应用使用的太多,且用完没释放,浪费了内存。此时就会造成内存泄露或者内存溢出。