Android Monkey工具介绍与使用

news/2024/5/13 9:33:42

        过于爽快的承认失败,就可能发觉不了曾经与正确非常接近。大家好,依旧是在翻看旧文档的时候,发现一篇关于Monkey的介绍和使用,Monkey这款工具在软件测试中主要用于进行压力测试和稳定性测试。它可以模拟大量随机的用户操作,对应用程序进行长时间的高强度测试,以发现潜在的稳定性问题、崩溃问题以及其他异常情况。通过 Monkey 测试,可以在一定程度上评估应用在极端情况下的表现。

Monkey介绍

什么是Monkey

        Monkey是Android系统自带的一个命令行工具,可以在Android模拟器或手机设备中运行。通过向Android系统发送伪随机用户事件流(如屏幕的点击、滑动和系统按键操作等),实现对Android App进行稳定性测试。

Monkey的特点

我们可以在CMD命令行或adb shell命令行执行命令,根据一个特定命令来发送信息。

使用Monkey执行测试,具有如下特点:

(1)如果限定了Monkey运行在特定包上,当监测到试图转到其他包的操作,将对其进行阻止。

(2)如果应用程序崩溃或接收到任何失控异常,或程序无响应(application not responding),Monkey将记录对应的错误日志,并根据命令行参数判断是停止运行还是继续运行。

(3)按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。

(4)不支持条件判断,也不支持读取待测界面的UI值来执行验证和操作。

Monkey的介入时间

等产品比较稳定,没有明显或很多bug的时候,再使用Monkey进行稳定性测试。

Monkey操作

基本操作步骤

  1. 启动手机(真机或者虚拟机都可以),在其中安装要测试的应用。例如:百度地图。
  2. 执行monkey命令
  3. 进入手机系统(adb shell,如有多台设备需要指定设备 -s参数)
  4. 连接设备(adb connect 设备ID)
  5. 打开CMD命令行窗口

Monkey命令示例

        在模拟器上安装百度地图,可手动打开并打开地图显示页。打开CMD命令行执行adb shell进入 Linux命令行界面。执行如下命令,可看到Monkey的随机操作效果。

monkey -p com.baidu.BaiduMap --ignore-crashes --ignore-timeouts --ignore-native-crashes  --pct-motion 39 --pct-pinchzoom 34 --pct-trackball 20 --pct-touch 7 -s 1 -v -v -v --throttle 200 20000

        除了上面执行方式外,也可以不进入adb shell,在DOS命令行直接执行adb shell monkey命令。如下:

adb shell monkey -p com.baidu.BaiduMap --ignore-crashes --ignore-timeouts --ignore-native-crashes  --pct-motion 39  --pct-pinchzoom 34 --pct-syskeys 0 --pct-trackball 20 --pct-touch 7  -s 1 -v -v -v --throttle 200 20000

强制关闭monkey

        如果我们运行之后发现设置错误,运行了别的应用,需要中止monkey测试过程;或者monkey在运行测试中出现故障,需要中止进程,怎么实现呢?

根据monkey进程的启动方式,分为以下两种情况:

  1. monkey进程通过CMD命令行直接执行adb shell monkey启动:
  2. monkey进程通过先执行adb shell,进入Linux环境再执行monkey命令启动。

在第一种情况下,采用如下方式终止Monkey进程:

打开一个新的CMD窗口,输入命令:

adb shell ps |findstr "monkey"

查出com.android.commands.monkey 进程记录,记录其进程号(pid).

adb shell kill 进程号

杀掉monkey进程

在第二种情况下,结束Monkey进程则比较简单,直接Ctrl+C即可结束Monkey进程运行。

Monkey命令和参数

monkey 程序组成

1、Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;

2、Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;

monkey命令帮助

命令:

adb shell monkey -help   

运行结果:如下图。

Monkey命令参数

monkey基本参数

-p
 参数-p用于约束限制,用此参数指定一个或多个包(Package,即App)
 不指定-p参数的话会对整机进行测试,即对所有APP进行测试。


-s
 用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同。
 执行monkey所产生的事件顺序,相当于一个flag,设置这个参数是为了更好地复现Bug。
 Seed值如果不指定,系统会自动生成
 seed值取值范围:1~9223372036854775807 (2的63次方-1)

如:

adb shell monkey -p com.test -v -s 10 100

第一次运行时出现了bug,但从日志也看不出来什么,再运行一次

adb shell monkey -p com.test -v -s 10 100

它的事件执行顺序与上一次相同,这样就有利于你发现产生bug的地方了。

-v  日志级别
Level 0 

示例:

adb shell monkey -p com.baidu.BaiduMap -v 100

说明:仅提供启动提示、测试完成和最终结果等少量信息

Level 1

示例:

adb shellmonkey -p com.baidu.BaiduMap -v -v 100

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

Level 2

示例:

adb shellmonkey -p com.baidu.BaiduMap -v -v -v 100

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

adb shell monkey  --throttle 3000 100

 --randomize--throttle
结合--throttle使用,随机延迟范围为0到throttle指定的时间
示例:

adb shell monkey --throttle 3000 --randomize-throttle 100

 --pkg-whitelist-file 白名单
 只执行在白名单中的apk
 把设置的白名单的包写入到一个txt文档里面(文档和路径名不能有中文)
 如果想指定多个程序被执行,则在文件中添加多个包名,注意包名与包名之间均用回车键换行。
 把这个文件放入到安卓手机中,放在/data/local/tmp下面:

adb push D:\whitelist.txt /data/local/tmp   adb shell monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt 200

--pkg-blacklist-file 黑名单
 执行除了黑名单中以外的apk
 设置方法和白名单类似,把文件名改为blacklist
 示例:

adb shell monkey --pkg-blacklist-file /data/local/tmp/blacklist.txt 200

  

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


--ignore-timeouts
忽略应用程序发生ANR(Application No Responding)错误时,直到事件数执行完成

--ignore-native-crashes
忽略本地代码造成的崩溃,直到事件数执行完成

--ignore-security-exceptions count
 应用程序权限错误发生后继续发送事件
 如果你希望monkey在应用程序权限错误发生后继续发送事件,则需要用到--ignore-security-exceptions选项。
 如果不设置此选项,monkey遇到此类权限错误将停止运行
随机事件个数,必填项

Monkey事件百分比参数

--pct-事件名称 百分比(用0-100的整数表示)--pct-touch     触摸事件,点击事件的百分比。编号为:0
--pct-motion 动作事件,设定移动事件百分比,直线滑动。编号为:1
--pct-pinchzoom 缩放事件百分比,比如放大或者缩小的操作。编号为:2
--pct-trackball 轨迹球事件百分比,不常用。编号为:3。现在手机基本没有滚动球,但滚动球事件中包含曲线滑动事件,在被测程序中需要曲线滑动时可以使用此参数
--pct-rotation     屏幕旋转事件百分比,横屏竖屏。编号为:4
--pct-nav     基本导航事件百分比。编号为:5 包括上下左右,如方向输入设备的输入,老人机的上下左右键,智能机上没有
--pct-majornav 主要导航事件百分比。号为:6例如中间键,回退键,菜单键
--pct-syskeys     系统按键事件百分比。编号为:7这些按钮一般专供系统使用,如:Home,Back,Start Call,End Call,音量控制
--pct-appswitch  Activity启动事件百分比/调整APP切换事件的百分比。编号为8
--pct-flip     键盘翻转事件百分比/键盘的隐藏,出现。编号为9
--pct-anyevent 其他事件百分比。编号为10如按键,在其他设备上不常用的按钮等

注意:

1.如果不添加任何事件百分比参数,系统将在各种事件中随机分配比例;
2.所有事件百分比相加应小于等于100,若小于100,则剩余比例将随机分配;
3.手动设置时如何分配比例,要根据应用类型决定。

Monkey日志管理

        我们使用Monkey进行测试,目的是测试应用的稳定性,在运行时是否发生了诸如崩溃或无响应的问题。Monkey通过日志来记录执行过程以及其中的出错信息。默认情况下,Monkey日志打印在命令行窗口(Windows CMD窗口或adb shell窗口),显示范围有限,内容比较多的时候,无法查看先前生成的内容。而且,如果关闭了命令行窗口日志就丢失了。所以我们要处理的第一个问题,就是日志的保存。

monkey日志保存

        Monkey运行日志可以保存在PC中,也可以保存在移动设备(或模拟器)上。而且保存在手机上时,可以将标准流和错误流分开保存。

1、保存在PC中
前提是Monkey测试在PC端执行,命令格式如下:

adb shell monkey [选项参数] 事件数 >Windows文件全路径

此时所有信息输出到一个日志文件。例如:

adb shell monkey -p com.baidu.BaiduMap -v -v -v --throttle 200 100 >d:\monkey.log


2、保存在移动设备(或模拟器)上
        前提是Monkey测试在移动设备(或模拟器)执行,先通过执行adb shell进入设备中。   有两种保存方式:

标准信息、错误信息保存在同一个文件,命令格式如下:

monkey [选项参数] 事件数 1>Linux文件全路径 2>&1

例如:

monkey -p com.baidu.BaiduMap -v -v -v --throttle 200 100 1>/sdcard/monkey.log 2>&1

 标准信息、错误信息分开保存在两个文件,命令格式如下:

monkey [选项参数] 事件数 1>Linux文件全路径 2>Linux文件全路径

 例如:

monkey -p com.baidu.BaiduMap -v -v -v --throttle 200 100 1>/sdcard/monkey_std.log     2>/sdcard/monkey_error.log

Monkey日志分析

        Monkey日志分析是Monkey测试中非常重要的一个环节,通过日志分析,可以获取当前测试对象在测试过程中是否发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。

Monkey日志详解

Monkey日志由以下几部分组成:

1、测试命令信息:包括随机种子、事件总数、允许测试包和使用的Activity、各事件百分比。。

 2、App切换和Activity跳转:可以看到切换到了哪个App,从哪个Activity跳转到了哪个Activity,如果发生了异常,就可以看出是在哪个App和Activity中发生的。

3、伪随机事件流:各种随机事件。

4、异常信息:应用崩溃、无响应等异常相应信息。

5、测试结果信息:完成事件数、其他信息。

App切换和Activity跳转
        可以看到切换到了哪个App,从哪个Activity跳转到了哪个Activity,如果发生了异常,就可以看出是在哪个App和Activity中发生的。

注:在允许一次测试多个应用时,会看到多次App切换;只测试一个应用时,一般只看到一次App切换,除非应用异常后重启。

伪随机事件流
记录各种随机操作及中间的延迟时间,主要是以下几种操作:   

touch 触摸操作

motion 滑动操作

trackball 曲线滑动操作

pinch-zoom 缩放操作

rotation 旋转操作

异常信息
应用无响应、崩溃等异常信息

应用无响应时信息:

崩溃信息:

测试结果信息
完成事件数、其他信息              

完成事件数:

其他信息:

从日志中发现并提交bug

        使用Monkey进行测试结束后,我们关注的是应用在测试中是否出现崩溃或无响应这类问题。测试结果可以通过如下方法判断:

(1)在日志中搜索“CRASH”,如果搜到,可以判断App在测试过程中发生过崩溃(闪退)问题

(2)在日志中搜索“ANR”,如果搜到,可以判断App在测试过程中发生过无响应的问题

        我们可以把这些关键字,连同其上下文,包括Java异常信息和其他相关信息一起提交。其中,Java异常信息主要有以下类型:

算术异常类:ArithmeticExecption

空指针异常类:NullPointerException

类型强制转换异常:ClassCastException

数组负下标异常:NegativeArrayException

数组下标越界异常:ArrayIndexOutOfBoundsException

违背安全原则异常:SecturityException

文件已结束异常:EOFException

文件未找到异常:FileNotFoundException

字符串转换为数字异常:NumberFormatException

操作数据库异常:SQLException

输入输出异常:IOException

违法访问错误:IllegalAccessError

内存不足错误:OutOfMemoryError

堆栈溢出错误:StackOverflowError

注意:长时间运行Monkey时,产生的日志文件非常庞大,用记事本无法打开,可以使用如Notepad++UltraEdit之类的流式读取的编辑器打开。

ANR异常和traces.txt文件

        Monkey日志中ANR相关信息不够详细,当发现APP运行中存在ANR问题时,我们还需要使用adb pull命令从被测设备的/data/anr目录下导出名为traces.txt的对应log文件,一并交给开发人员排查问题。命令如下:

adb pull /data/anr/traces.txt  D:\logs\
adb logcat 查看Android系统日志(logcat日志)

        使用monkey进行测试时,还要注意logcat日志。这是Android系统日志,包含更详细的内容,可以帮助开发人员定位问题。如果要获取logcat日志,需要在执行monkey测试前开始记录logcat日志。完整步骤如下:

adb logcat -c 清理现有日志

adb logcat -v time > D:\logcat.log 开始记录日志

③ 运行monkey程序  

运行monkey程序结束后,可以把logcat日志文件logcat.log也提交给开发作为定位问题的参考。

复现问题

        如果需要复现问题,可以在日志中找到当时执行的seed值,再构建monkey命令运行几次。构建命令时,seed值自定义,定义成与第一次运行相同。程序运行的初始界面也跟第一次运行相同。

        后续回归问题也用同一个命令,seed值保持相同。 如果问题不易复现,需要多运行几次,或多运行一段时间。

另外,还应保持初始界面、网络条件、位置、运行时长一致。

一次测试发现多个问题

        monkey 执行时如果加了--ignore-crashes和--ignore-native-crashes,App出现崩溃退出后,还会自动重启并继续发送事件(否则monkey中断)。我们可以等monkey进程结束后,去日志里直接搜索CRASH。可能会看到多处问题。所以加这两个选项可以帮助我们在一次测试中发现多处崩溃问题。

        monkey 执行时如果加了--ignore-timeouts,App出现无响应后还会继续发送事件;我们可以等monkey进程结束后,去日志里直接搜索ANR,可能会看到多处问题。所以加这个选项可以帮助我们在一次测试中发现多处无响应的问题。

上述三个选项都加,则可能在一次测试中发现多处CRASH或ANR问题。


http://www.mrgr.cn/p/86176716

相关文章

Android Studio gradle 默认sourceSets配置

一. AS默认的sourceSets配置 sourceSets在Android插件中如何使用的:android {sourceSets {main {manifest.srcFile AndroidManifest.xmljava.srcDirs [src]resources.srcDirs [src]aidl.srcDirs [src]renderscript.srcDirs [src]res.srcDirs [res]assets.srcD…

数据库服务类--Redis--未授权访问终端Getshell

免责声明:本文仅做技术交流与学习. 目录 前提条件: windows上开启redis服务: Linux上创建&开启redis服务: 操作: 1-连接靶机redis 2-写入webshell 3-访问后门 redis--->webshell Redis未授权访问漏洞复现与利用 - 知乎 (zhihu.com) 前提条件: 端口开放(6379) 目录…

Blender笔记之基本操作

code review! —— 2024-04-27 杭州 Blender笔记…

JavaEE——介绍 HTTPServlet 三部分使用与 cookie 和 session 的阐述

文章目录 一、HTTPServlet介绍其中的关键 三个方法 二、HTTPServletRequest(处理请求)1.分块介绍方法作用get 为前缀的方法字段中 含有 getParameter 字段 的方法(前后端交互):字段中 含有 getHeader 字段 的方法: 2.解释前后端的交互过程3.使用 json 格…

保护企业财务报告,这款防泄密软件做得到!

在日益增长的金融欺诈和网络攻击中,保护企业的财务报告是维持公司声誉和稳定运营的关键。财务报告包含了公司的敏感信息,如利润、收入、财务结构等,一旦泄露,可能会对公司造成不利影响。华企盾DSC数据防泄密系统为企业提供了全面的解决方案,确保财务报告的安全性和机密性。…

保护企业财务报告,这几款防泄密软件做得到!

在日益增长的金融欺诈和网络攻击中,保护企业的财务报告是维持公司声誉和稳定运营的关键。财务报告包含了公司的敏感信息,如利润、收入、财务结构等,一旦泄露,可能会对公司造成不利影响。华企盾DSC数据防泄密系统为企业提供了全面的解决方案,确保财务报告的安全性和机密性。…

OSPF路由计算

1.区域内路由计算 (1)LSA的基本概念 LS Age:当LSA被始发时,该字段为0,随着LSA在网络中被泛洪,该时间逐渐累加,当到达MaxAge(缺省值为3600s)时,LSA不再用于路…

LeetCode 面试题 17.08 —— 马戏团人塔

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 首先,我们对人的身高按照从小到大排序,特别注意,对于身高相等的人,要按照体重从高到低排序。这时候,序列已经满足了在上面的人要比下面的人矮一点&#…

K8S上生产环境后,90%都会遇到这个故障

K8S上生产环境后,90%都会遇到这个故障 原创 didiplus 攻城狮成长日记 2024-03-26 21:30 广东 听全文在Kubernetes/K8s上生产环境中,90%的人都会遇到的一个故障,K8s集群突然有一天执行kubectl命令时,报错提示509证书过期。返回如下报错信息: Unable to connect to the serve…

Bayes判别示例数据:鸢尾花数据集

使用Bayes判别的R语言实例通常涉及使用朴素贝叶斯分类器。朴素贝叶斯分类器是一种简单的概率分类器,基于贝叶斯定理和特征之间的独立性假设。在R中,我们可以使用e1071包中的naiveBayes函数来实现这一算法。下面,我将通过一个简单的示例展示如…

二维数组打印菱形(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;char arr[5][5] { { , , *, , }, { , *, *, *, },{*, *, *, *, *}, { , *, *, *, …

Vue3+Vite开发的项目进行加密打包

本文主要介绍Vue3+Vite开发的项目如何进行加密打包。 目录 一、vite简介二、混淆工具三、使用方法1. 安装插件:2. 配置插件:3. 运行构建:4. 自定义混淆选项:5. 排除文件:下面是Vue 3+Vite开发的项目进行加密打包的方法。 一、vite简介 Vite 是一个由 Evan You 创造的现代…

2024 年最好的免费数据恢复软件,您可以尝试的几个数据恢复软件

由于系统崩溃而丢失数据可能会给用户带来麻烦。我们将重要的宝贵数据和个人数据保存在我们的 PC、笔记本电脑和其他数字设备上。您可能会因分区丢失、意外删除文件和文件夹、格式化硬盘驱动器而丢失数据。数据丢失是不幸的&#xff0c;如果您不小心从系统中删除了文件或数据&am…

Linux: Desktop Environment DE GUI

Check which desktop environment you are usingecho $XDG_CURRENT_DESKTOP FROM GUI gnome-shell --version gdm3 --version Display Manager VS Display Server Check whether Wayland or Xorg is in use(Display Server)必须使用GUI terminal, 必须是当前登录用户echo $XDG…

Thinkphp--in-sqlinjection

一、漏洞原理 在 Builder 类的 parseData 方法中&#xff0c;由于程序没有对数据进行很好的过滤&#xff0c;将数据拼接进 SQL 语句&#xff0c;导致 SQL注入漏洞 的产生。 影响版本 5.0.13<ThinkPHP<5.0.15 5.1.0<ThinkPHP<5.1.5 在相应的文件夹位置打开终端…

Util 应用框架 UI 全新升级

Util UI 已经开发多年, 并在多家公司的项目使用. 不过一直以来, Util UI 存在一些缺陷, 始终未能解决. 最近几个月, Util 团队下定决心, 终于彻底解决了所有已知缺陷. Util 应用框架 UI 介绍 Util 应用框架 UI 建立在 Angular , Ng-Zorro, Ng-Alain 基础之上, 用于开发企业中后…

ClubSphere项目主要风险和典型用户

一.项目风险分析 机会风险 一、市场风险: 1.市场接受度:市场对于我们软件的接受时间不确定,对我们的软件可能表现出较低的接受度。 2.市场发展趋势:市场未来发展不确定,对于社团软件需求可能下降。 3.市场知名度与拓展:软件前期在市场的知名度不高影响不大,极有可能被市…

RKNN Toolkit2 工具的使用

RKNN Toolkit2 是由瑞芯微电子 (Rockchip) 开发的一套用于深度学习模型优化和推理的工具。它主要面向在瑞芯微SoC上进行AI应用开发&#xff0c;但也可以用于PC平台进行模型的转换、量化、推理等操作。它支持将多种深度学习框架的模型&#xff08;如Caffe, TensorFlow, PyTorch等…

300kW直驱永磁同步电机(风力机组)的simulink模型仿真

搭建了300kW直驱永磁同步电机&#xff08;风力机组&#xff09;&#xff0c;simulink模型。该模型包括风机输入输出模型、机组与网侧控制模块、风机并网电路。采用双PWM变流器&#xff0c;基于转子磁场定向矢量控制&#xff0c;基于电网电压定向的矢量控制&#xff0c;最佳叶尖…

吾日三省吾身---对平常遇到的错误总结

✨个人主页&#xff1a; 不漫游-CSDN博客 前言 本篇文章是对平常练习遇到的问题总结&#xff0c;多吸取经验教训才能避免未来再犯~ Java语法部分 &#xff08;一&#xff09;多态 思考&#xff1a;这道题很明显考察的是多态的知识点&#xff0c;即一个对象可以被赋值给其父类…