Monkey工具详解

Posted wazixuetang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Monkey工具详解相关的知识,希望对你有一定的参考价值。

【Monkey简介】

1.Monkey 是什么

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

Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar。Monkey.jar程序是由一个名为“monkey”的shell脚本来启动执行,shell脚本在Android文件系统中的存放路是:/system/bin/monkey;

这样就可以通过在CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试了。

打开CMD窗口,输入adb shell ls /system/framework,可以查看到monkey.jar;同理,可查看monkey。

技术图片

 

2.Monkey测试的特点

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

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

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

 

3.Monkey的基本用法

1)Monkey测试准备

在执行Monkey测试之前,我们需要下载ADB工具,并安装JDK v1.5以上的版本。

ADB工具是谷歌提供的Android调试工具,可以通过linux命令行访问手机。

安装好JDK环境,下载adbtools之后,我们需要配置一下环境变量,把adbtools的存放路径添加到path中,我们可以开始进行Monkey测试。

注:需要root权限。

2)基本语法如下:

$ adb devices
这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示。

$adb install
adb install <apk文件路径> :这个命令将指定的apk文件安装到设备上
adb install  -r <apk文件路径> :如果加-r参数会覆盖原来安装的软件并保留数据
注意:apk文件名不要使用中文且不要有空格号

$ adb shell monkey [options]

如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500 个伪随机事件:

$ adb shell monkey -p your.package.name -v 500

 

4.monkey测试的相关的原理

monkey测试的原理就是利用socket通讯的方式来模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常。当Monkey程序在模拟器或设备运行的时候,如果用户触发了比如点击,触摸,手势或一些系统级别的事件的时候,它就会产生随机脉冲,所以可以用Monkey用随机重复的方法去负荷测试你开发的软件。

 

5.monkey实例

1)启动Android模拟器

2)在命令行中输入:adb devices查看设备连接情况

技术图片

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

技术图片

4)查看data/data文件夹下的应用程序包。注:我们能测试的应用程序包都在这个目录下面

技术图片

5)以com.tencent.mobileqq为对象,进行monkey test

monkey -p com.tencent.mobileqq -v 500

技术图片

6)另一种执行方法

adb shell monkey -p com.tencent.mobileqq -v 500>E:\\monkey\\test.log

技术图片

 

6.Monkey测试的停止条件

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

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

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

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

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

工作中为了保证测试数量的完整进行,我们一般不会在发生错误时立刻退出压力测试。monkey 测试命令如下:

adb shell monkey -p com.xy.android.junit -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 10000 > E:\\monkey\\log.txt

Monkey测试是Android自动化测试里面使用比较简单的方法,可以很大程度检验我们的程序是否稳定,能否经得起压力测试,可以根据实际情况调整测试的强度和测试重点。

Monkey测试只是一个模拟测试,很多时候跟实际情况时有差别的,所以这个只能是其中一个辅助测试

 

【Monkey命令详解】

四大类—— 常用选项、事件选项、约束选项、调试选项

1、常用选项

--help:打印帮助信息

-v:指定打印信息的详细级别,一个-v增加一个级别 ,默认级别为 0 。用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别。

日志级别 Level 0

缺省值,仅提供启动提示、测试完成和最终结果等少量信息

日志级别 Level 1

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

日志级别 Level 2

最详细的日志,包括了测试中选中/未选中的Activity信息

 

2、事件选项

-s:指定产生随机事件种子值,相同的种子值产生相同的事件序列。如: -s 200

--throttle:每个事件结束后的间隔时间——降低系统的压力(如不指定,系统会尽快的发送事件序列)。如:--throttle 100

--pct-touch:指定触摸事件的百分比,如:--pct-touch 5% , 相关的还有以下option:

--pct-motion <percent> (滑动事件)、 --pct-trackball <percent> (轨迹球事件) 、 --pct-nav<percent> (导航事件 up/down/left/right)、 --pct-majornav<percent> (主要导航事件 back key 、 menu key)、 --pct-syskeys<percent> (系统按键事件 Home 、Back 、startCall 、 endCall 、 volumeControl)、 --pct-appswitch<percent> (activity之间的切换)、 --pct-anyevent<percent>(任意事件)

 

3、约束选项

-p:指定有效的package(如不指定,则对系统中所有package有效),一个-p 对应一个有效package, 如:-p com.ckt -p com.ckt.asura;

参数-p用于约束限制,用此参数指定一个或多个包(Package,即App)。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。

-c:activity必须至少包含一个指定的category,才能被启动,否则启动不了。

 

4、调试选项

--dbg-no-events:初始化启动的activity,但是不产生任何事件。

--hprof:指定该项后在事件序列发送前后会立即生成分析报告  —— 一般建议指定该项。

--ignore-crashes:忽略崩溃

--ignore-timeouts:忽略超时

--ignore-security-exceptions:忽略安全异常

--kill-process-after-error:发生错误后直接杀掉进程

--monitor-native-crashes:跟踪本地方法的崩溃问题

--wait-dbg:知道连接了调试器才执行monkey测试。

 

5、一个简单的monkey命令:

adb shell monkey -p com.xy.android.junit -s 500 -v 10000

但是,工作中为了保证测试数量的完整进行,我们一般不会在发生错误时立刻退出压力测试。monkey 测试命令如下

adb shell monkey -p com.xy.android.junit -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 10000 > E:\\monkey_log\\java_monkey_log.txt

 

6、monkey作用的包:com.ckt.android.junit

产生时间序列的种子值:500

忽略程序崩溃 、 忽略超时 、 监视本地程序崩溃 、 详细信息级别为2 , 产生 10000个事件 。

 

【Monkey日志分析】

一、初步分析方法:
Monkey测试出现错误后,一般的差错步骤为以下几步:
1、找到是monkey里面的哪个地方出错
2、查看Monkey里面出错前的一些事件动作,并手动执行该动作
3、若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样


一般的测试结果分析:
1、ANR问题:在日志中搜索“ANR”
2、崩溃问题:在日志中搜索“Exception”


二、详细分析monkey日志:
首先我们需要查看Monkey测试中是否出现了ANR或者异常,具体方法如上述。将执行Monkey生成的log,从手机中导出并打开查看该log;在log的最开始都会显示Monkey执行的seed值、执行次数和测试的包名。具体方法如上述。

然后我们要分析log中的具体信息,方法如下:
查看log中第一个Switch,主要是查看Monkey执行的是那一个Activity,譬如下面的log中,执行的是com.tencent.smtt.SplashActivity,在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。

:Switch:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.tencent.smtt/.SplashActivity;end
  // Allowing start of Intent act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]cmp=com.tencent.smtt/.SplashActivity in package com.tencent.smtt

在下面的log中,Sending Pointer ACTION_DOWN和Sending Pointer ACTION_UP代表当前执行了一个单击的操作;

Sleeping for 500 milliseconds这句log是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。

SendKey(ACTION_DOWN) //KEYCODE_DPAD_DOWN 代表当前执行了一个点击下导航键的操作;

Sending Pointer ACTION_MOVE 代表当前执行了一个滑动界面的操作。
:Sending Pointer ACTION_DOWN x=47.0 y=438.0
:Sending Pointer ACTION_UP x=47.0 y=438.0
Sleeping for 500 milliseconds
:SendKey (ACTION_DOWN): 20 //KEYCODE_DPAD_DOWN
:SendKey (ACTION_UP): 20 //KEYCODE_DPAD_DOWN
Sleeping for 500 milliseconds
:Sending Pointer ACTION_MOVE x=-2.0 y=3.0
:Sending Pointer ACTION_MOVE x=4.0 y=-3.0
:Sending Pointer ACTION_MOVE x=-5.0 y=-3.0
:Sending Pointer ACTION_MOVE x=3.0 y=4.0
:Sending Pointer ACTION_MOVE x=-4.0 y=1.0
:Sending Pointer ACTION_MOVE x=-1.0 y=-1.0
:Sending Pointer ACTION_MOVE x=-2.0 y=-4.0

如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间;// Monkey finished代表执行完成。Monkey执行中断,在log的最后也能查看到当前已执行的次数。Monkey执行完成的log具体如下:
Events injected: 6000
:Dropped: keys=0 pointers=9 trackballs=0 flips=0
## Network stats: elapsed time=808384ms (0ms mobile, 808384ms wifi, 0msnot connected)
// Monkey finished

以上是关于Monkey工具详解的主要内容,如果未能解决你的问题,请参考以下文章

Monkey工具详解

monkey命令详解

android压力测试命令monkey详解

Android命令Monkey压力测试,详解

Android命令Monkey压力测试,详解

android压力测试命令monkey详解