Android Monkey测试

article/2025/10/18 10:03:41

monkey通常用于对app进行压力测试,通过monkey工具在模拟器或设备中产生类似用户点击、触摸、手势等一些系统级的伪随机事件流以测试app的稳定性,这好比一只猴子随意操作设备。

一、monkey原理

monkey是一个用java编写的脚本,设备中存放在system/bin/monkey,源码位于development/cmds/monkey/monkey
monkey测试的架构如下:
在这里插入图片描述
monkey测试的运行原理如下:

  • 解析用户输入的monkey命令:解析出命令中的附加选项,如包名、是否忽略crash、动作间隔等。
  • 确定运行范围:根据包名列表提取出monkey测试可唤醒或切换的activity,不在该列表中的应用/组件会被阻止唤醒。
  • 确定生成事件的方式:有脚本、网页、随机三种事件生成方式
    1. -f scriptfile 表示使用脚本方式生成事件。
    2. -port socketPort 表示从网络端读取事件。
    3. 否则则为随机生成事件,生成随机事件前先随机打开一个activity。
  • 循环执行monkey测试:根据用户命令行输入的执行次数,循环生成事件并执行。
  • 上报结果: monkey在运行过程中遇到crash或ANR会停止运行并上报结果。
    monkey测试优缺点:
优点缺点
1、简单易用1、由于操作随机,遍历界面有限,测试有效性不足
2、 随机,能覆盖测试用例复杂性2、无法得知bug复现步骤
3、路径回环,由于随机性容易陷入特定界面无法退出

二、命令介绍

使用monkey -help查看命令详情

$ monkey -helpbash arg: -help
args: [-help]arg: "-help"
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...][-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...][--ignore-crashes] [--ignore-timeouts][--ignore-security-exceptions][--monitor-native-crashes] [--ignore-native-crashes][--kill-process-after-error] [--hprof][--match-description TEXT][--pct-touch PERCENT] [--pct-motion PERCENT][--pct-trackball PERCENT] [--pct-syskeys PERCENT][--pct-nav PERCENT] [--pct-majornav PERCENT][--pct-appswitch PERCENT] [--pct-flip PERCENT][--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT][--pct-permission PERCENT][--pkg-blacklist-file PACKAGE_BLACKLIST_FILE][--pkg-whitelist-file PACKAGE_WHITELIST_FILE][--wait-dbg] [--dbg-no-events][--setup scriptfile] [-f scriptfile [-f scriptfile] ...][--port port][-s SEED] [-v [-v] ...][--throttle MILLISEC] [--randomize-throttle][--profile-wait MILLISEC][--device-sleep-time MILLISEC][--randomize-script][--script-log][--bugreport][--periodic-bugreport][--permission-target-system]COUNT

在这里插入图片描述

2.1、基础参数

  • -v:用于指定反馈信息详细程度,共三个级别
    1. Level 0: -v 提供很少的信息,除了启动通知,测试完成和最终结果。
    2. Level 1: -v -v 提供更详细的信息,如个别事件被发生至测试Activity。
    3. Level 2:-v -v -v提供更详细的设置等信息,如Activity选中和未选中的测试信息。
adb shell monkey -v 500//随机模式执行500次随机事件,打印信息级别为Level 0
  • -s:伪随机数生成器种子值,如果用相同的种子值,则将生成相同的事件序列,该值对于BUG复现至关重要。
adb shell monkey -s 6666 -v 500
  • –throttle:事件延时时间
adb shell monkey --throttle 1000 -v 500//随机执行500个事件,事件间隔1秒
  • -p:用于指定运行monkey启动的包名,可指定多个包名;如果不指定则系统中所有app都运行启动
adb shell monkey -p XXX -p xxx -v 500

2.2、发送事件类型

  • –pct-touch:touch事件由一个DOWN和一个UP事件组成,一组为一个touch事件。
  • –pct-motion:motion事件是由屏幕上某处一个down事件、一系列伪随机的移动事件和一个up事件组成。
  • –pct-trackball:滚动球事件由一个或多个随机的移动事件(可以是曲线移动)组成,有时会伴随着点击事件。
  • –pct-nav:导航事件由方向输入设备的上下左右按键所触发的事件组成,即四个方向键。
  • –pct-syskeys:这些按键通常由系统保留使用,如Home、Back、Start Call、End Call、音量调节。
  • –pct-anyevent:包含所有其他事件,如按键、其他在设备上不常用的按钮等。
adb shell monkey --throttle 1000 --pct-touch 30 --pct-motion 25 --pct-syskeys 15  -v 500

随机执行500条事件,其中30%触摸事件,25%移动事件,15%系统案件事件,30%其他随机事件。
注意:各类事件类型总和不能超过100%。

2.3、调试选项

  • –hprof:用于在发送事件序列前后生成性能分析报告,通常会生成在“data/misc”目录
  • –ignore-crashes:忽略crash异常,测试过程中发生crash继续执行测试,直到执行完指定事件数,如果不忽略则系统发生crash,monkey测试会停止。
  • –ignore-timeouts:忽略超时异常,测试过程中发生ANR继续执行测试,直到执行完指定事件数,如果不忽略则系统发生ANR,moneky测试会停止。
  • –ignore-security-exceptions:忽略应用权限异常,测试过程中发生应用权限错误时继续执行测试,直到执行完指定事件数,如果忽略则系统发生应用权限错误,monkey测试会停止。
  • –kill-process-after-error:通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。
  • -monitor-native-crashes:监视并报告Android系统中本地代码的崩溃事件。如果设置了–kill- process-after-error,系统将停止运行。
adb shell monkey --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --throttle 1000 -v 500

三、monkey示例

随机对系统中的应用间隔500ms执行720000次事件,启用Level 2级打印,并将打印重定向指定路径。

adb shell time monkey --throttle 500  -v -v -v 720000 > C:\Users\xxx\Desktop\adbLog\072103.log

四、log分析

上述monkey示例运行结果如下:

adb shell time monkey --throttle 500  -v -v -v 720000 > C:\Users\gd08575\Desktop\adbLog\072103.log
args: [--throttle, 500, -v, -v, -v, 720000]arg: "--throttle"arg: "500"arg: "-v"arg: "-v"arg: "-v"arg: "720000"
arg="--throttle" mCurArgData="null" mNextArg=1 argwas="--throttle" nextarg="500"
data="500"
PS C:\Windows\system32> adb reboot
PS C:\Windows\system32> adb shell time monkey --throttle 500  -v -v -v 720000 > C:\Users\gd08575\Desktop\adbLog\072104.log
args: [--throttle, 500, -v, -v, -v, 720000]arg: "--throttle"arg: "500"arg: "-v"arg: "-v"arg: "-v"arg: "720000"
arg="--throttle" mCurArgData="null" mNextArg=1 argwas="--throttle" nextarg="500"
data="500"
// CRASH: org.codeaurora.gallery (pid 4043)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException: uri
// Build Label: qti/xxx/xxx:10/QKQ1.210910.001/8970_A10_DS:userdebug/dev-keys
// Build Changelist: 8970_A10_DS
// Build Time: 1658127765000
// java.lang.NullPointerException: uri
//      at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:133)
//      at android.content.ContentResolver.update(ContentResolver.java:1982)
//      at com.android.gallery3d.filtershow.tools.SaveImage.updateFile(SaveImage.java:796)
//      at com.android.gallery3d.filtershow.tools.SaveImage.processAndSaveImage(SaveImage.java:526)
//      at com.android.gallery3d.filtershow.pipeline.ImageSavingTask.doInBackground(ImageSavingTask.java:124)
//      at com.android.gallery3d.filtershow.pipeline.ProcessingTask.processRequest(ProcessingTask.java:61)
//      at com.android.gallery3d.filtershow.pipeline.ProcessingTaskController.handleMessage(ProcessingTaskController.java:59)
//      at android.os.Handler.dispatchMessage(Handler.java:103)
//      at android.os.Looper.loop(Looper.java:214)
//      at android.os.HandlerThread.run(HandlerThread.java:67)
//
** System appears to have crashed at event 74163 of 720000 using seed 1658296072289153m38.49s real     1m34.00s user     0m45.90s system在运行近2.5h时抛出NPE异常,停止monkey测试,上述log给出了基本报错代码位置,便于定位问题,具体NPE分析过程这里不多赘述。通常在log中查找error,ANR,crash等报错关键字。
接下来分析生成的log文件:bash arg: --throttlebash arg: 500bash arg: -vbash arg: -vbash arg: -vbash arg: 720000
:Monkey: seed=1658296072289 count=720000
//monkey命令中设置的参数,以及随机生成的种子,通过设置该种子数可用于复现和验证修改措施。:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
//   + Using main activity com.android.calendar.AllInOneActivity (from package com.android.calendar)
//   + Using main activity com.android.contacts.activities.PeopleActivity (from package com.android.contacts)
//   + Using main activity com.android.deskclock.DeskClock (from package com.android.deskclock)
//   + Using main activity com.android.email.activity.Welcome (from package com.android.email)
//   + Using main activity com.android.mms.ui.ConversationList (from package com.android.mms)
//   + Using main activity com.android.music.MusicBrowserActivity (from package com.android.music)
//   + Using main activity com.android.music.VideoBrowserActivity (from package com.android.music)
//   + Using main activity com.android.settings.Settings (from package com.android.settings)
//   + Using main activity com.android.soundrecorder.SoundRecorder (from package com.android.soundrecorder)
//   + Using main activity com.android.dialer.main.impl.MainActivity (from package org.codeaurora.dialer)
//   + Using main activity com.android.gallery3d.app.GalleryActivity (from package org.codeaurora.gallery)
//   + Using main activity com.android.camera.CameraLauncher (from package org.codeaurora.snapcam)
//   + Using main activity com.android.documentsui.LauncherActivity (from package com.android.documentsui)
//   + Using main activity com.android.quicksearchbox.SearchActivity (from package com.android.quicksearchbox)
// Selecting main activities from category android.intent.category.MONKEY
//   + Using main activity com.android.launcher3.Launcher (from package com.android.launcher3)
//   + Using main activity com.android.settings.Settings$RunningServicesActivity (from package com.android.settings)
//   + Using main activity com.android.settings.Settings$StorageUseActivity (from package com.android.settings)
// Seeded: 1658296072289//各类调试选项百分比,其中序号所代表的类型定义在
//development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.javapublic static final int FACTOR_TOUCH        = 0;public static final int FACTOR_MOTION       = 1;public static final int FACTOR_PINCHZOOM    = 2;public static final int FACTOR_TRACKBALL    = 3;public static final int FACTOR_ROTATION     = 4;public static final int FACTOR_PERMISSION   = 5;public static final int FACTOR_NAV          = 6;public static final int FACTOR_MAJORNAV     = 7;public static final int FACTOR_SYSOPS       = 8;public static final int FACTOR_APPSWITCH    = 9;public static final int FACTOR_FLIP         = 10;public static final int FACTOR_ANYTHING     = 11;public static final int FACTORZ_COUNT       = 12;    // should be last+1// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 2.0%
//   3: 15.0%
//   4: -0.0%
//   5: -0.0%
//   6: 25.0%
//   7: 15.0%
//   8: 2.0%
//   9: 2.0%
//   10: 1.0%
//   11: 13.0%//应用切换
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=org.codeaurora.gallery/com.android.gallery3d.app.GalleryActivity;end// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=org.codeaurora.gallery/com.android.gallery3d.app.GalleryActivity } in package org.codeaurora.gallery
//事件延时及随机事件序列
Sleeping for 500 milliseconds
:Sending Key (ACTION_DOWN): 19    // KEYCODE_DPAD_UP
:Sending Key (ACTION_UP): 19    // KEYCODE_DPAD_UP
Sleeping for 500 milliseconds
:Sending Key (ACTION_DOWN): 167    // KEYCODE_CHANNEL_DOWN
:Sending Key (ACTION_UP): 167    // KEYCODE_CHANNEL_DOWN
Sleeping for 500 milliseconds
:Sending Key (ACTION_DOWN): 33    // KEYCODE_E
:Sending Key (ACTION_UP): 33    // KEYCODE_E
...

五、总结

本文介绍了monkey测试用途,架构以及运行原理和基本命令参数及其作用。结合命令示例和log介绍常用的分析方法。


http://chatgpt.dhexx.cn/article/BldGpYih.shtml

相关文章

Monkey测试全过程

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

Monkey测试(APP稳定性)

目录 1、Monkey简介 2、monkey程序介绍 3、Monkey测试前准备 4、Monkey测试命令 5、 Monkey测试结果(pass或者fail)的判断 6、Monkey Log的简单分析 7、汇总如图 1、Monkey简介 Monkey是Androld中的一个命令行工具,可以运行在模拟器里…

monkey 测试介绍

目录 前言 环境搭建 什么是Monkey Monkey 用来做什么 Monkey程序介绍 Monkey 架构 Monkey弱点 Monkey 参数大全 Monkey 命令 基本参数介绍 Monkey 实例 Monkey 查看包名 Monkey 日志分析 必须重视Crash 前言 Monkey 是Android SDK提供的一个命令行工具&#xff0…

一个简单的monkey测试工具

Monkey的概念: “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的…

monkey测试详解

一、monkey测试的定义 Monkey 测试是通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对应用程序客户端的稳定性测试;通俗来说,Monkey 测试即“猴子测试”,是指像猴子一样&…

Monkey测试

一、什么是 Monkey 测试 Monkey 测试是通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对应用程序客户端的稳定性测试;通俗来说,Monkey 测试即“猴子测试”,是指像猴子一样&a…

使用Monkey进行软件测试(随机测试+脚本测试)

文章目录 一、基础概念二、monkey测试的优缺点2.1 优点2.2缺点2.3 解决方案2.3.1 二次开发2.3.2 指定测试页面2.3.3 调整各种事件的比例2.3.3 编写自定义测试脚本2.3.4 分析APP特性,选择合适的方案 三、monkey测试的基本过程3.1 环境准备3.1.1环境3.1.2 配置过程 3.…

【Monkey测试】Monkey测试详解

一、什么是 Monkey 测试 Monkey 测试是通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对应用程序客户端的稳定性测试;通俗来说,Monkey 测试即“猴子测试”,是指像猴子一样&a…

Linux 的 Kill -9命令

大家对kill -9 肯定非常熟悉,在工作中也经常用到。特别是你去重启tomcat时。 可是多半看来,我们对-9的理解只是表面而已。 很少有人(包括我)认真的去了解一下 kill -n 这个n到底是什么东东。自我批评一下。 好吧。我们来好好的认识…

kill进程.bat

输入端口号kill进程若出现中文乱码问题,则打开文件,点击另存为,将编码格式从UTF-8,改为ANSI,并将拓展名改为.bat,保存即可 echo off setlocal enabledelayedexpansion set /p port请输入端口号&#xff1…

shell中的kill命令

简介: 无论你使用哪种操作系统,你一定会遇到某个行为失常的应用,它把自己锁死并拒绝关闭。在Linux(还有Mac),你可以用一个"kill"命令强制终结它。在这个教程中,我们将展示给你多种方式使用"kill"…

Mysql的kill命令

在MySQL中有两个kill命令:一个是kill query 线程id,表示终止这个线程中正在执行的语句;一个是kill connection 线程id,这里connection可缺省,表示断开这个线程的连接,当然如果这个线程有语句正在执行&#…

kill与kill -9的区别

kill命令格式: kill -Signal pid pid是进程号,可以用 ps 命令查出 signal是发送给进程的信号, 默认参数下,kill 发送SIGTERM(15)信号给进程,告诉进程,你需要被关闭,请自…

Linux命令之终止进程kill

概述 kill 命令可以用来终止进程&#xff0c;即杀死某些进程。 语法 该命令的语法如下&#xff1a; kill [选项] 进程号该命令支持的选项有&#xff1a; 选项说明 -l <信息编号>若不加<信息编号>选项&#xff0c;则 -l 参数会列出全部的信息名称-a当处理当前进…

killall 、kill 、pkill 命令详解

转载地址&#xff1a;https://www.cnblogs.com/rsky/p/4886043.html killall 命令 Linux系统中的killall命令用于杀死指定名字的进程&#xff08;kill processes by name&#xff09;。我们可以使用kill命令杀死指定进程PID的进程&#xff0c;如果要找到我们需要杀死的进程&am…

kill命令详解kill -9、kill -15区别

kill相当于赐死&#xff0c;kill -9相当于斩立决 kill命令默认的信号就是15&#xff0c;也就是 kill -15 1.从help中可以清晰的看到 -n 指的是 信号编号 2.kill -l(查看Linux/Unix的信号变量) 3.说一下SIGKILL(kill -9)和SIGTERM(kill -15) kill -9 PID 是操作系统从内核级别…

Linux之kill命令

【Linux常用命令速查手册】关注【入门小站】&#xff0c;后台回复 「1001」 自取。 Linux中的kill命令用来终止指定的进程&#xff08;terminate a process&#xff09;的运行&#xff0c;是Linux下进程管理的常用命令。通常&#xff0c;终止一个前台进程可以使用CtrlC键&#…

(Linux)kill命令常用技巧

前言 在Linux的系统中&#xff0c;kill是我们最常见的命令之一。 kill&#xff0c;英语中为杀死的意思&#xff0c;顾名思义&#xff0c;就是用来杀死一些东西的命令&#xff0c;用来杀死系统中的进程。就像是Windows系统中的关闭软件的按钮或任务管理器的结束任务&#xff0c;…

Linux 进程kill -9 无法杀死解决方案

从下述案例中可以看到使用kill -9 28051并未将28051进程杀死 [rootiZufxxxxxxxxxxxx2tnZ devops-xxl-job]# kill -9 28051 [rootiZufxxxxxxxxxxxx2tnZ devops-xxl-job]# jps 28051 Launcher 29247 Jps [rootiZufxxxxxxxxxxxx2tnZ devops-xxl-job]# jps 28051 Launcher 29539 J…

常用的 kill 命令,来了解一下!

开发和运维&#xff0c;开发和测试基本上不分家。所以市面上存在很多的开发运维、运维开发、测试开发等岗位。如果你连 kill 命令都还不会&#xff0c;怎么好意思说你是一个合格的开发呢&#xff1f; 除了开发&#xff0c;工作或者生活当中&#xff0c;也存在着非常多的“异常程…