Android稳定性测试利器Monkey使用详解

1.简介

Monkey是Android系统自带的一款稳定性测试小工具,简单易用

2.环境搭建

(1)下载Android SDK
(2)将Android SDK目录下的platform-tools和tools目录配置到系统环境变量Path中
(3)打开cmd窗口,输入adb命令,查看环境是否配置成功,如下图所示,则环境配置成功

image.png

3.Monkey启动

(1)最简单的例子:命令行中输入 adb shell monkey 1000后,你会发现手机(或者虚拟机)自动运行起来了,命令行也会输出相关的日志。

image.png

(2)标准的Monkey命令:monkey [options] <count>
其中options表示Monkey执行可配置的参数,是可选项,如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包,count表Monkey执行的事件数,必须设置
(3)options的类型及其使用
下面将Monkey的Options操作分为四类:常规类,事件类,约束类和调试类。

常规类命令 使用 详解
-h adb shell monkey -h 显示monkey参数帮助信息
-v adb shell monkey -v -v -v<event-count> 打印出日志信息,每个-v将增加反馈信息的级别,-v越多日志信息越详细:0级,除启动提示、测试完成和最终结果提供较少信息。1级,提供较详细调试信息,比如逐个发送到Activity的事件。2级,提供更详细安装信息,如测试中被选中或未被选中的Activity
事件类命令 使用 详解
-f adb shell monkey -f<测试脚本名><event-count> 表示要使用Monkey运行指定的脚本
-s adb shell monkey -s<seed><event-count> 指定随机数生成器seed值,如果用相同的seed值再次运行moneky,将重复执行刚才的随机操作
--throttle adb shell monkey --throttle<时间间隔> 表示每执行一个指令间隔的时间,单位ms,注意是-“--”开头
--pct-touch adb shell monkey --pct-touch<percent> 表示触摸事件百分比
--pct-motion adb shell monkey --pct-motion<percent> 表示动作事件百分比
--pct-trackball adb shell monkey --pct-trackball<percent> 表示轨迹球事件百分比
--pct-nav adb shell monkey --pct-nav<percent> 表示基本导航事件百分比
--pct-majornav adb shell monkey --pct-majornav<percent> 表示主要导航事件百分比
--pct-syskeys adb shell monkey --pct-syskeys<percent> 表示系统按键事件百分比
--pct-appswitch adb shell monkey --pct-appswitch<percent> 表示应用启动事件百分比
约束类命令 使用 详解
-p adb shell monkey -p<一个或者多个包名><event-count> 指定测试一个或者多个包
-c adb shell monkey -c<一个或者多个类别><event-count> 指定测试一个或者多个类别(即<main-category>参数)
调试类命令 使用 详解
--dbg-no-events adb shell monkey --dbg-no-events<event-count> 监视应用程序所调用的包之间的转换
--hprof adb shell monkey --hprof <event-count> 在事件序列前后立即生成profiling report,在data/misc中生成5MB大小左右的文件
--ignore-crashes adb shell monkey --ignore-crashes<event-count> 设置后,当应用程序崩溃或者发生异常的时候,Monkey将继续运行直到计数完成,而不会停止运行
--ignore-timeouts adb shell monkey --ignore-timeouts<event-count> 设置后,当应用程序发生任何超时错误(比如ANR),Monkey将继续运行直到计数完成,而不会停止运行
--ignore-security-exceptions adb shell monkey --ignore-security-exceptions<event-count> 设置后,当应用程序发生任何相关权限错误的时候,Monkey将继续运行直到计数完成,而不会停止运行
--monitor-native-crashes adb shell monkey--monitor-native-crashes<event-count> 设置后,monkey会监视并报告Android系统的native code的崩溃事件

(4)Moneky脚本的编写

事件 使用 详解
点击事件 DispatchPointer ( downTime , eventTime , action , x , y , pressure , size , metaState , xPrecision , yPrecision , device , edgeFlags) 其实这么多参数,只需要关注action 、 x 、y 三个参数即可。action :事件是按下还是抬起,0 表示按下,1 表示抬起。x、y:表示当前事件触发的X轴和Y轴的坐标
输入字符串事件 DispatchString(String text) 输入一个不加引号的字符串
启动应用 LaunchActivity ( pkg_name , act_name ) 用于打开任意应用的一个页面,但是前提条件是打开的Activity 需要属性 android:exported 被设定为true,才可以通过 LaunchActivity 打开
等待事件 UserWait(long sleeptime) 操作需要等待的事件,单位为毫秒
按下键值 DispatchPress(int keycode) 用于模拟敲击键盘的事件
长按键值 LongPress(int keycode) 用于模拟敲击键盘的事件

(5)准确地获取控件坐标
方法一:
因为Monkey是基于坐标来操作控件的,所以必须准确地获取控件坐标才能进行正确测试。这里就需要getevent。在命令行上输入adb shell getevent后,然后点击手机界面,会获得所点击的位置的十六进制坐标。

image.png

比如上图,我点击点一个文本框后输入的一系列数据(看起来好乱和复杂),每一行的三个数据分别代表type,code,value(具体的含义自己百度一下,这里就不多解释),然后其实我们只需要关注的是code为0035和0036这两行的数据,分别代表触屏时的绝对坐标X和Y,然后将它们转为十进制的坐标就可以了,就这样我们得到了控件的x和y坐标。

方法二:我推荐另外一种更简单的方式,来获取当前你看见的,在待测试设备上的控件的坐标点的定位方式。那就是利用 Android 设备的开发者选项。设置 → 开发者选项 → 指针位置 ,将这个属性开启之后,当手指在屏幕上滑动的时候,就可以在顶部看到当前触摸点的 X、Y 轴的坐标,这就是我们需要的。

Paste_Image.png

(6)Monkey日志分析

  • 正常情况: 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\
  • 异常情况:Monkey 测试出现错误后,一般的分析步骤:
    1.程序无响应的问题: 在日志中搜索 “ANR”
    2.崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug

4.Monkey简单实战

下面我们写一个简单的Monkey脚本进行测试:就是两个Activity页面,第一个页面输入EditText,然后第二个页面显示第一个页面的信息。(相信这部分代码对各位大佬来说很简单,就不粘贴出来了)

image.png
image.png

思路:

(1)选中文本框1
captureDispatchPointer(10,10,0,308,215,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,308,215,1,1,-1,1,1,0,0)
(2)往文本框1中输入内容
captureDispatchString(111)
captureDispatchPress(66)
(3)选中文本框2
captureDispatchPointer(10,10,0,197,295,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,197,295,1,1,-1,1,1,0,0)
(4)往文本框2中输入内容
captureDispatchString(222)
captureDispatchPress(66)
(5)点击提交按钮
UserWait(500)
captureDispatchPointer(10,10,0,264,403,1,1,-1,1,1,0,0);
captureDispatchPointer(10,10,1,264,403,1,1,-1,1,1,0,0);
(6)全部代码

Paste_Image.png

(7)运行脚本,比如下面指定执行脚本10次,输出相关日志信息

Paste_Image.png

5.Monkey总结

优点:功能强大, 主要用于压力和稳定性测试
缺点:本身不提供截屏功能,本身无法完成录制、回放的功能(不过都可以借用其他的开源工具来实现Monkey的截屏和录制等功能)
不支持条件判断,不支持读取待测界面的信息来执行验证操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容