Monkey

1. Monkey 简介

2. Monkey 使用

3. APK 包名查看

4. Monkey 结果与日志分析

5. Monkey 测试中内存问题分析

6. Monkey 测试的停止条件

7. Monkey Script 脚本制作

 

 

1. Monkey 简介

什么是 Monkey?

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

Monkey 的程序介绍

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

Monkey 命令的几种启动方式:

  1. PC 上直接执行:adb shell monkey {+命令参数} 来进行 Monkey 测试。
  2. PC 上先 adb shell 进入 Android 系统,通过执行:monkey {+命令参数} 来进行 Monkey 测试。
  3. 在 Android 机或者模拟器上直接执行 monkey 命令,可以在 Android 机上安装 Android 终端模拟器。

Monkey 架构

Monkey 运行在设备或模拟器上面,可以脱离 PC 运行(普遍做法是将 Monkey 作为一个向待测应用发送随机按键消息的测试工具,验证待测应用在这些随机性的输入面前是否会闪退或者崩溃)。

优点

  • 一条语句就是一个自动化脚本。
  • 有 log 输出。
  • 可对 MonkeyTest 的对象如事件数量、类型、频率等进行设置。
  • 长时间测试稳定(取决于你的 ADB)。

缺点

  • 测试的对象仅为应用程序包,有一定的局限性。
  • Monkey 测试使用的事件流、数据流是随机的,不能进行自定义。
  • 出错无法回溯 bug 路径。
  • log 信息量巨大,难以排查 bug。

 

2. Monkey 使用

1)基本用法

adb shell monkey [options]

 如果不指定 options,Monkey 将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。

下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送 500 个伪随机事件:

adb shell monkey -p <package name> -v 500

2)Monkey 的压力测试参数

-p <允许的包名列表>

用此参数指定一个或多个包。指定包之后,Monkey 将只允许系统启动指定的 app。如果不指定包,Monkey 将允许系统启动设备中的所有 app。

指定一个包(名为 fishjoy.control.menu):

adb shell monkey -p fishjoy.control.menu 100

-v

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

Level 0 : adb shell monkey -p fishjoy.control.menu -v 100
Level 1 : adb shell monkey -p fishjoy.control.menu -v -v 100
Level 2 : adb shell monkey -p fishjoy.control.menu -v -v -v 100

-s(随机数种子)

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

示例: 

monkey 测试 1:adb shell monkey -p fishjoy.control.menu –s 10 100
monkey 测试 2:adb shell monkey -p fishjoy.control.menu –s 10 100

--throttle <毫秒>

用亍指定用户操作(即事件)间的时延,单位是毫秒;如果没指定这个参数,Monkey 会尽可能快得生成和发送消息。

示例:

adb shell monkey -p fishjoy.control.menu --throttle 3000 100

 

3. APK 包名查看 

方式 1:手机中安装 APK 包名查看器

方式 2:源码下的 AndroidManifest.xml 文件查看

方式 3:aapt 命令查看:如 aapt dump xmltree ColaBox.apk AndroidManifest.xml

方式 4:adb logcat 抓取当前 Android 机运行的 APP 的包名( I/ActivityManager(数字): Displayed 包名/类名: +ms )

  1. 清除 logcat 内容,使用命令 adb logcat -c
  2. 启动 logcat,使用命令 adb logcat ActivityManager:I *:s
  3. 启动要查看的 APP,查看出现的 ActivityManager 信息,其中 cmp=name 的 name 就是所打开的 APP 的 APK 包名:

方式 5:dumpsys 命令

  1. 启动要查看的 APP
  2. 命令行输入:adb shell dumpsys window w |findstr \/ |findstr name=

 

4. Monkey 结果与日志分析

1)Monkey 测试出现错误

出现错误后,一般的分析步骤为以下几种方式:

  1. 看 Moneky 的日志(注意第一个 switch 以及异常信息等)
    1. 程序无响应的问题:在日志中搜索“ANR”
    2. 崩溃问题:在日志中搜索“Exception”
  2. 查看 Monkey 里面出错前的一些事件动作,并手动执行该动作,结合 TT 示波器,快速具体找到崩溃点。
  3. 看 Monkey 日志,结合 TT 示波器,查看最后崩溃时的执行函数。

2)测试通过

如果 Monkey 测试顺利执行完成,在 log 的最后,会打印出当前执行事件的次数和所花费的时间。其中 // Monkey finished 代表执行完成。

即使 Monkey 执行中断,在 log 的最后也能查看到当前已执行的次数。

 

5. Monkey 测试的内存问题分析

1)怎样去确认内存泄露?

  • 内存泄露弹出 out of memory 对话框。
  • 对于有内存泄露但是没有弹出 out of memory 对话框的情况,可以通过 logcat 文件 GC 输出信息:
    • GC_FOR_ALLOC:因为在分配内存时内存不够引发的。
    • GC_EXPLICIT:表明 GC 被显式请求触发的,如 System.gc 调用。
    • GC_CONCURRENT:表明 GC 在内存使用率达到一定的警戒值时,自动触发。
    • GC_BEFORE_OOM:表明在虚拟机抛出内存不够异常 OOM 之前,执行最后一次回收内存垃圾。

2)--hprof 参数与报告

adb shell monkey -p fishjoy.control.menu --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkey.txt

如果指定了这个选项,Monkey 会在发送时间的前后生成 APP 内存快照文件,一般会在设备的 /data/misc 目录下生成 hprof 的文件(注:/data/misc 需要 root 权限)。

3)通过工具 Eclipse Memory Analyzer tool(MAT) 查看和分析

注意:Android 系统生成的 HPROF 文件格式和普通的 JVM 格式不一致,需要用 Android 自带的 hprof-conv 命令转化。

 

6. Monkey 测试的停止条件

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

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

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

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

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

 

7. Monkey Script 脚本制作

  1. Monkey script 是按照一定的语法规则编写有序的用户事件流并适用于 Monkey 命令工具的脚本。 脚本可以用 txt 制作。
  2. 脚本制作完毕后放入手机的 sdcard 目录下。
  3. CMD 中运行命令:adb shell monkey –f/sdcard/ <脚本> 运行次数。
  4. 结合 monkey 的 –v 和 --hprof 参数,输出日志和性能报告。

例:

adb shell monkey --hprof -f/sdcard/*.txt -v -v -v 3 > c:\monkey.txt

start data>>

将控制 monkey 的一些参数设置和具体的 monkey 命令分隔开来。

例如:

#控制 Monkey 发送消息的一些参数
count = 10
speed = 1.0
start data>>
# monkey 命令

LaunchAcitivity(pkg_name, cl_name)

命令用于启动任意应用的一个活动(界面):

  • pkg_name:要启动的应用包名
  • cl_name:要打开的活动的类名

DispatchPointer( downTime, eventTime, action, x, y, pressure, size, metaState, xPrecision, yPrecision, device, edgeFlags)

命令用于向一个指定位置发送单个手势消息。

  • downTime:发送消息的时间,只要是合法的长整型数字即可。
  • eventTime:主要是用在指定发送两个事件之间的停顿。
  • action:消息是按下还是抬起,0 表示按下,1 表示抬起。
  • x:x 坐标。
  • y:y 坐标。
  • 其余 7 个参数均可以设置为 0。

monkey script 脚本制作模板

count = 1 //下面这个count选项, monkey并没有用到,可以忽略它
 
speed = 1.0 //speed 选项是用来调整两次按键的发送濒率的
 
start data >> // “start data >>”是有大小写敏感的,而且单词间的间隔只用有一个空格!
 
LaunchActivity(com.zhengping.contact, com.zhengping.contact.Main) //Activity值可以通过aapt命令查看
 
DispatchPointer(5109520,5109520,0,261,128,0,0,0,0,0,0,0);
DispatchPointer(5109521,5109521,1,261,128,0,0,0,0,0,0,0);
 
UserWait(2000) //停顿时间
 
DispatchPress (KEYCODE_Z) //文字输入 monkey只识别英文和数字输入

Monkey script 脚本取坐标点

  • 取坐标点,选择手机中的开发人员选项,打开“显示指针位置”。

  • Monkeyrunner 的录制取坐标。

  • Eclipse 的 DDMS 取坐标。

 

 

posted @ 2021-04-12 20:46  Juno3550  阅读(441)  评论(0编辑  收藏  举报