adb之monkey测试

adb之monkey测试

author: will

date:2024-03-11

monkey官方文档:http://www.android-doc.com/tools/help/monkey.html


一、简介

  • Monkey意指猴子🐒,顽皮淘气。所以Monkey测试,顾名思义也就像猴子一样在软件上乱敲按键,猴子什么都不懂,就爱捣乱。Monkey原理也是类似,通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、滑动Trackball、手势输入等操作),来对设备上的程序进行压力测试,检测程序多久的时间会发生异常,在功能测试完成后进行monkey测试。

  • 一般指用毫无规律的指令或操作去测试被测系统,观察被测系统的稳定性和容错性

  • monkey包括很多选项,大致四大类:

    1️⃣基本配置选项,如设置尝试的事件数量。

    2️⃣运行约束选项,如设置只对单独的一个包进行测试。

    3️⃣事件类型和频率。

    4️⃣调试选项

  • monkey命令特性
    不可能使用monkey来指定做一样测试,重复做很多次。因为monkey产生的是伪随机的事件流。但是我们可以通过添加命令选项将操作限制在一定的范围内。

  • Monkey测试用于发现App测试中的问题(如ANR(Application Not Responding), 响应延时以及CRASH, 非正常退出)


二、原理

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

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

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

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

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

    • 通过在cmd窗口中执行:adb shell monkey {+命令参数}来进行Monkey测试;


三、架构

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

在这里插入图片描述


四、事件类型

Monkey所执行的随机事件流中包含11大事件,分别是:

  • 触摸事件百分比,即参数--pct-touch

​ 触摸事件是指在屏幕某处按下并抬起的操作,可通过–pct-touch参数来配置其事件百分比。
​ 该事件由一组Touch(ACTION_DOWN)和Touch(ACTION_UP)事件组成,在手机上看到实际操作类似于点击。


  • 滑动事件百分比,即参数--pct-motion

​ 手势事件是指在屏幕某处的按下、随机移动、抬起的操作,即直线滑动操作。可通过–pct-motion参数来配置其事件百分比。
​ 该事件是由一个ACTION_DOWN事件、一系列ACTION_MOVE事件和一个ACTION_UP事件组成的,在手机上看到的实际操作是一个没有拐弯的直线滑动操作。


  • 二指缩放事件百分比,即参数--pct-pinchzoom

​ 二指缩放事件是指在屏幕上的两处同时按下,并同时移动,最后同时抬起的操作,即智能机上的放大缩小手势操作。可通过–pct-pinchzoom参数来配置其事件百分比。
​ 该事件起始是一个ACTION_DOWN事件和一个ACTION_POINTER_DOWN事件,即模拟两个手指同时点下;中间是一系列的ACTION_MOVE事件,即两个手指同时在屏幕上直线滑动;结束是由一个ACTION_POINTER_UP事件和一个ACTION_UP事件组成的,即两个手指同时放开。


  • 轨迹事件百分比,即参数--pct-trackball

​ 轨迹事件是由一个或多个随机的移动组成的,有时会伴随着点击。很早之前的Android手机带有轨迹球,这个事件就是模拟的轨迹球的操作。现在的手机几乎都没有轨迹球,但轨迹球事件中包含曲线滑动操作,如果被测程序需要曲线滑动时可以选用此参数。可通过–pct-trackball参数来配置其事件百分比。
​ 该事件是由一系列的Trackball(ACTION_MOVE)事件组成的,观察手机上的操作,即为一系列的曲线滑动操作。


  • 屏幕旋转事件百分比,即参数--pct-rotation

​ 屏幕旋转事件是一个隐藏事件,在Android官方文档中并没有记录这个事件。它其实是模拟的Android手机的横屏和竖屏切换。可通过–pct-rotation参数来配置其事件百分比。
​ 该事件由一个rotation事件组成,其中degree表示的是旋转方向,顺时针旋转,0表示旋转90度的方向,1表示旋转180度的方向,2表示旋转270度的方向,3表示旋转360度的方向。在执行过程中,可以看到手机屏幕在横竖屏之间不断地切换。


  • 基本导航事件百分比,即参数--pct-nav

​ 基本导航事件是指点击方向输入设备的上、下、左、右按键的操作,现在手机上很少有上、下、左、右按键,这种事件一般用得比较少。可通过–pct-nav参数来配置其事件百分比。
​ 该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的就是上、下、左、右四个方向按键。


  • 主要导航事件百分比,即参数--pct-majornav

​ 主要导航事件是指点击“主要导航”按键的操作,这些按键通常会导致UI界面中的动作,如键盘的中间键、回退按键、菜单按键。可通过–pct-majornav参数来配置其事件百分比。
​ 该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的按键就是中间键和菜单键。


  • 系统按键事件百分比,即参数--pct-syskeys

​ 系统按键事件是指点击系统保留使用的按键的操作,如点击Home键、返回键、音量调节键等。可通过–pct-syskeys参数来配置其事件百分比。
​ 该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的就是上面说到的几个系统按键.


  • Activity启动事件百分比,即参数--pct-appswitch

​ 启动Activity事件是指在手机上启动一个Activity的操作。在随机的时间间隔中,Monkey将执行一个startActivity()方法,作为最大限度上覆盖被测包中全部Activity的一种方法。可通过–pct-appswitch参数来配置其事件百分比。
​ 该事件是由一个Switch操作组成的,从手机上看,上面的操作实际是打开了com.android.settings这个应用的一个com.android.settings.Settings的Activity界面。


  • 键盘事件百分比,即参数--pct-flip

​ 键盘事件主要是一些与键盘相关的操作。比如点击输入框、键盘弹起、点击输入框以外区域、键盘收回等。可通过–pct-flip参数来配置其事件百分比。
​ 该事件主要是键盘的打开和关闭操作。


  • 其他事件百分比,即参数--pct-anyevent

​ 其他类型事件包括了除前面提到的10种事件外其他所有的事件,如按键、其他不常用的设备上的按钮等。可通过–pct-anyevent参数来配置其事件百分比。
​ 该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的按键就是其他的一些系统按键,如字母按键、数字按键等。因为现在手机很少带字母按键或数字按键,所以这个事件一般使用得比较少.


五、测试准备

  1. adb下载安装(参考👉ADB安装及使用详解(非常详细)从零基础入门到精通,看完这一篇就够了-CSDN博客)
  2. jdk下载安装(参考其他博客)
  3. adb基本命令(参考👉adb常用指令以及安卓端的实用操作-CSDN博客
  4. 包名的获取方法
  • 包名获取方法较多,此处只介绍几种:

    • adb shell pm list package 获取所有包名
    • adb shell pm list package -3 获取第三方包名
    • adb shell pm list package | grep “包名关键字”
    • adb logcat | findstr START 输入该命令,然后点击要启动的app,即可获取到包名和activity

    在这里插入图片描述

    • adb shell dumpsys window w | findstr \/ | findstr name=
      先打开app,再输入此行命令

    在这里插入图片描述


六、命令解读

  1. 获取官方帮助文档
adb shell monkey --help
  1. -v:日志详细程度
注意:每一个-v将增加反馈信息的级别
Level 0(缺省值)除启动提示、测试完成和最终结果之外,提供较少信息 -v
Level 1提供较为详细的测试信息,如逐个发送到Activity的事件   -v -v
Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity     -v -v -v 

Note📖 : 一个-v及以上会显示详细的参数列表

Note📖 : 两个-v及以上会显示调用了哪些包哪些活动,还会显示睡眠时间

Note📖 : 三个-v没看出来多了啥😕

  1. -s:伪随机数生成器的seed值

Note📖 : 如果用相同的seed值再次运行Monkey, 两次monkey测试将生成相同的事件序列

  1. count参数
count无需显示指明,直接接上数字即可
eg:adb shell monkey -v 100
  1. –throttle:两次事件的时间间隔,单位是毫秒

Note📖 : 通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被完成;

  1. -p:指定包名
用于约束限制,用此参数指定一个或多个package,指定包之后,monkey将只允许系统启动指定的APP,如果不指定包,monkey将允许启动设备中所有APP。
不指定包:adb shell monkey 100
指定一个包:adb shell monkey -p com.fileManager 100
指定多个包:adb shell monkey -p com.fileManager 100 -p fileManager 100*
-p空格后面是软件包名;100表示测试事件次数。
一个 -p 选项只能用于一个包,指定多个包,需要使用多个 -p 选项;
即使app崩溃,Monkey依然继续发送事件,直到事件数目达到目标值为止
  1. –pct-{+事件类型}{+事件类型的百分比}

Note📖 : 参数后面紧接着是百分比 0-100,百分比的总量不能大于100

adb shell monkey -p com.fileManager --pct-touch 50 --pct-motion 50 1000
  1. –ignore-crashes参数(忽略应用程序崩溃)
adb shell monkey -p com.fileManager --ignore-crashes -v 1000

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

  1. –ignore-timeouts参数(忽略应用程序无响应)
adb shell monkey -p com.fileManager --ignore-timeouts -v 1000

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

  1. –ignore-security-exceptions参数(忽略权限问题异常)
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.fileManager --ignore-security-exceptions 100

Note📖 : 通常情况下,指定应用程序发生许可错误时(如证书许可,网络许可等),monkey将停止运行。若指定了该参数,即使应用程序发生许可错误,monkey会继续向系统发送事件,直到指定事件全部运行完毕。

  1. –kill-process-after-error参数(发生错误后停止运行)
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.fileManager --kill-process-after-error 100

Note📖 : 用于指定当应用程序发生错误时,是否停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态(*注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。

  1. –monitor-native-crashes参数
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.fileManager --monitor-native-crashes 100

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

  1. –hprof参数
adb shell monkey -p com.fileManager --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >d:\monkey.txt

Note📖 : 指定此选项(需要root权限),monkey会在发送事件前后生成性能报告(即内存的快照文件),一般在设备的/data/misc目录下生成一个5M左右的文件

  1. –dbg-no-events参数
adb shell monkey --throttle 3000 --dbg-no-events --pct-trackball 50 -p com.fileManager --monitor-native-crashes 100

Note📖 : 指定了此选项,monkey会启动待测应用,但不发送任何消息,建议与-v,-p,-throttle一起使用

  1. 参数常用配置
  • 🚀–throttle: 一般建议设置为500(ms)🚀
  • 🚀遇到错误: 不停止🚀

七、日志

1.日志作用

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

2.错误类型

  • 程序无响应📶:ANR(Application No Responding)
  • 崩溃☹️:crash
  • 异常😦:exception
  • 强制退出❌:force closed

3.日志保存方法

  1. 保存在PC💻中
>adb shell monkey xxxxxx  >d:\monkey.txt
  1. 保存在手机📱上
C:\Users\xxxxx>adb shell
monkey -v 100 >/sdcard/monkeylog.log
  1. 标准流和错误流分开保存
>adb shell monkey xxxxx 1>/sdcard/monkey.txt 2>/sdcard/error.txt

C:\Users\xxxxx>adb shell monkey -v 100 1>d:\monkey.log  2>d:\error.log

Note📖 : 执行以上命令,Monkey的运行日志和异常日志将被分开保存。此时Monkey的运行日志将被保存在monkey.txt文件中,而异常日志将被保存在D盘下的error.txt中。

Note📖 : 不添加末尾的输入流则默认不输入日志,在命令行输出。

Note📖 : 输入文件的方式默认是覆盖写。

4.日志分析

eg:
adb shell monkey -p com.xxxx --pct-touch 20 --pct-rotation 0 --pct-trackball 20 --pct-motion 20 --ignore-timeouts --ignore-crashes --ignore-security-exceptions --throttle 500 -v 100 >d:monkey\monkeylog.txt

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Note📖 : 如果出现了问题,只需要重新输入此行指令加上-s 1710465056930即可复现


八、常见问题

  • shell报错
/system/bin/sh: can't create D:\monkey\monkeylog.txt: Read-only file system

Note📖 : 无法写入文件的原因是设备shell只有对本设备有读写权限,而无法对PC上有写权限。因此不应该进入adb shell后执行monkey,应首先退出shell,加上adb shell一起执行


九、参考文档

  1. 如何使用monkey进行稳定性测试(全过程)_如何用monkey做稳定性测试-CSDN博客

  2. App测试之Monkey压力测试 - 知乎 (zhihu.com)

  3. Monkey测试详解_monkey test-CSDN博客

  4. 全网讲的最好,Monkey自动化测试(Android)吐血整理(超详细)-CSDN博客

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值