Monkey介绍及相关命令

Monkey概念:

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

  该工具用于进行压力测试。然后开发人员结合monkey打印的日志和系统打印的日志,分析测试中的问题

Monkey测试的特点:
Monkey测试,所有的事件都是随机产生的,不带任何人的主观性。
1、测试的对象仅为应用程序包,有一定的局限性。
2、Monky测试使用的事件数据流是随机的,不能进行自定义。
3、可对MonkeyTest的对象,事件数量,类型,频率等进行设置。

Monkey存放路径:

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

Monkey大致操作流程:

  通过名为“monkey”的Shell脚本去启动Monkey.jar程序(shell脚本在Android文件系统中的存放路径是:/system/bin/monkey),在你指定的APP应用上模拟用户点击,滑动,输入等操作以极快的速度来对设备程序进行压力测试,检测程序是否会发生异常,然后通过日志进行排错。

Monkey测试目的:

测试app是否会Crash(崩溃)

Monkey操作命令格式:

adb shell monkey{+命令参数}

Monkey命令参数:
1)参数:-p
参数 -p 用于约束限制,用此参数指定一个或多个包(Package,即App)。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。
* 指定一个包:adb shell monkey -p 包名 100  说明:对指定的包进行随机事件操作,100是事件计数(即让Monkey程序模拟100次随机用户事件)。
* 指定多个包:adb shell monkey -p 包名 –p 包名 -p 包名 100
* 不指定包:adb shell monkey 100                  说明:Monkey随机启动APP并发送100个随机事件。

2)参数: -v
用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别

日志级别Level 0
示例: adb shell monkey -p 包名 –v 100
说明缺省值,仅提供启动提示、测试完成和最终结果等少量信息
日志级别Level 1
示例: adb shell monkey -p 包名 –v -v 100
说明提供较为详细的日志,包括每个发送到Activity的事件信息
日志级别Level 2
示例: adb shell monkey -p 包名 –v -v –v 100
说明最详细的日志,包括了测试中选中/未选中的Activity信息

3)参数:--throttle <毫秒>

用于指定用户操作(即事件)间的时延,单位是毫秒;

示例:adb shell monkey -p 包名 --throttle 3000 100  # 对指定包名进行随机事件100次,每间隔3秒执行

4)参数:-s
用于指定伪随机数生成器的seed值(send值的种子数有1-10组),如果seed相同,则两次Monkey测试所产生的事件序列也相同的。

假设随机测试过程中发现了 bug,程序崩溃,报告给了开发,开发说修 复好了,如何进行回归?

示例: adb shell monkey -p com.sky.jisuanji --throttle 500 -s 2 100 (伪随机)

如果设置了随机send值,并执行两次相同的两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的。

5)参数:--ignore-crashes

用于指定当应用程序崩溃时(Force&Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。
示例:adb shell monkey -p com.sky.jisuanji --ignore-crashes 1000
测试过程中即使Weather程序崩溃,Monkey依然会继续发送事件直到事件数目达到1000为止

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

示例: adb shell monkey -p com.sky.jisuanji --ignore-timeouts 1000

7)参数:--ignore-security-exceptions
用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。

示例: adb shell monkey -p com.sky.jisuanji --ignore-security-exceptions 1000

针对过滤参数可以一起使用:

adb shell monkey -p com.sky.jisuanji --throttle 300 -s 6 --ignore-crashes --ignore-timeouts --ignore-security-exceptions 1000

让 monkey 长久的执行下去,执行到设定次数为止

monkey 用户事件流应该是设置在 10 亿以内

8) --pct- 事件类别:设置用户事件流所占的百分比;一般有11种事件类别 

  --pct-touch{+百分比}0:
  触摸,触摸事件泛指发生在某一位置的一个down-up事件,点击
  --pct-motion{+百分比}1:
  动作,动作事件泛指从某一位置接下(即down事件)后经过一系列伪随机事件后弹出(即up事件)
  --pct-pinchzoom{+百分比}2:
  二指缩放,智能机上的放大缩小手势操作事件
  --pct-trackball{+百分比}3:
  轨迹,轨迹事件包括一系列的随机移动,以及偶尔跟随在移动后面的点击事件
  --pct-rotation{+百分比}4:
  屏幕旋转,横屏竖屏事件
  --pct-nav{+百分比}5:
  基本导航,基本导航事件主要来自方向输入设备的上、下、左、右事件
  --pct-majornav{+百分比}6:
  主要导航,主要导航事件通常指引发图形界面的一些动作,如键盘中间按键、返回按键、菜单按键等
  --pct-syskeys{+百分比}7:
  系统按键,系统按键事件通常指仅供系统使用的保留按键,如HOME键、BACK键、拨号键、挂断键、音量键等
  --pct-appswitch{+百分比}8:
  应用启动,应用启动事件(activitylaunches)即打开应用,通过调用startActivity()方法最大限度地开启该package下的所有应用
  --pct-flip{+百分比}9:
  翻转,键盘轻弹百分比,如点击输入框,键盘弹起,点击输入框以外区域,键盘收回
  --pct-anyevent{+百分比}10:
  其他类型,其他类型事件指上文中未涉及的所有其他事件,如keypress、不常用的button等

monkey随机事件类别(11种)
--pct-touch              触摸事件                     点击
--pct-motion            手势事件                     直线滑动
--pct-pinchzoom     缩放事件                      放大缩小手势
--pct-trackball         轨迹球事件                  曲线滑动
--pct-rotation          屏幕旋转事件               横屏竖屏切换
--pct-nav                基本导航事件               物理上下左右按键
--pct-majornav       主要导航事件               物理菜单键、中间键
--pct-syskeys         系统按键事件               物理HOME键、返回键、音量调节键
--pct-appswitch      启动Activity事件           切换界面
--pct-flip                 键盘事件                       键盘开启和关闭
--pct-anyevent       其他类型事件                物理字母按键、数字按键

示例: adb shell monkey -p com.sky.jisuanji --throttle 300 -s 6 --pct-rotation 30 --pct-touch 60 --pct-syskeys 10 300

说明 对指定app进行随机事件300次,种子数为6,其中屏幕旋转30%,点击60%,系统按键10% 且随机事件流每次间隔0.3秒执行

在公司一般情况下如何使用 monkey?

1、adb logcat -c 清除日志缓存

2、adb logcat -f 手机路径 -s *:E -v long

 

 

 

3、新打开一个dos窗口编写 monkey 命令并执行(一般次数写最大、指定-s 、--throttle ... --ignore-crashes
--ignore-timeouts --ignore-security-exceptions )

  窗口1,日志实时打印中:

  窗口2,执行monkey命令:

4、到时间停止 monkey 或者提前停止monkey操作:

  1、杀进程:adb shell(进入手机终端)——ps -ef | grep monkey(查看monkey进程,找到PID)—— kill -9 pid(强制杀进程)如下图:

 

  2、ctrl + c (自动停止 monkey==》或者可以编写python 定时任务 18:00,22:00、 杀掉 monkey 进程 os.system(“adb shell kill -9 pid”))

    如果ctrl + c后,monkey还在操作,再执行1步骤,杀进程

5、停止日志:

    查找monkey进程:

    adb shell ps | findstr "monkey" 

    杀死monkey进程:

    adb shell kill 进程id

  1、杀进程:adb shell(进入手机终端)——ps -ef | grep logcat(查看logcat进程,找到PID)—— kill -9 pid(强制杀进程)如下图:

    

 

    

 

  2、ctrl + c

6、把日志从手机下载到电脑 adb pull

7、分析日志报错定位问题: 查找包名 发现 Exception

在日志文件中查找指定的包名,查看 Exception报错信息;如下图

 

 

 

 

posted @ 2021-09-14 15:20  奔跑在路上you  阅读(502)  评论(0编辑  收藏  举报