monkey随笔
一、Monkey测试概念
Monkey是Android SDK中附带的一个命令行工具,可以用过adb shell模拟用户行为,运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。
Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。
二、Monkey工作原理
测试原理:利用socket通讯的方式来模拟用户按键输入、触摸屏输入、手势输入等。
三、命令参数
约束类命令:
-p: 指定运行的程序
-p 用于约束限制,用此参数指定一个包,指定包后Monkey将被允许启动指定应用;如果不指定包, Monkey将被允许随机启动设备中的应用(主Activity有android.intent.category.LAUNCHER 或android.intent.category.MONKEY类别 )。
如: adb shell monkey -p xxx.xxx.xxx 1 ;
xxx.xxx.xxx 表示应用包名,1 表示monkey模拟用户随机事件参数,最低1,这样就能把应用启动起来
-c: 指定Activity的category类别
-c 指定Activity的category类别,如果不指定,默认是CATEGORY_LAUNCHER 或者 Intent.CATEGORY_MONKEY;不太常用的一个参数
常规类命令:
-v: 日志级别
-v 用于指定反馈信息级别,也就是日志的详细程度,分Level1、Level2、Level3;
-v 默认值,仅提供启动提示,操作结果等少量信息 ,也就是Level1,比如adb shell monkey -p xxx.xxx.xxx -v 1 ;
-v -v 提供比较详细信息,比如启动的每个activity信息 ,也就是Level2,比如adb shell monkey -p xxx.xxx.xxx -v -v 1 ;
-v -v -v 提供最详细的信息 。
如:adb shell monkey -p xxx.xxx.xxx -v -v -v 1
{数字} 如 1000 :monkey测试事件次数
如:adb shell monkey -p xxx.xxx.xxx -v -v -v 1000
>{日志路径} :monkey测试日志记录文件
如:adb shell monkey -p xxx.xxx.xxx -v -v -v 1000 >E:\monkey4.log
调试类命令
--ignore-crashes : 忽略异常崩溃
如果不指定,那么在monkey测试的时候,应用发生崩溃时就会停止运行;如果加上了这个参数,monkey就会运行到指定事件数才停止。
如:adb shell monkey -p xxx.xxx.xxx -v -v -v --ignore-crashes 10
--ignore-timeouts: 忽略ANR
情况与4类似,当发送ANR时候,让monkey继续运行。
如:adb shell monkey -p xxx.xxx.xxx -v -v -v --ignore-timeouts 10
--ignore-native-crashes :忽略native层代码的崩溃
情况与4类似,
如:adb shell monkey -p xxx.xxx.xxx -v -v -v --ignore-native-crashes 10
--ignore-security-exceptions :忽略一些许可错误,比如证书许可,网络许可
如:adb shell monkey -p xxx.xxx.xxx -v -v -v --ignore-security-exceptions 10
--monitor-native-crashes :是否监视并报告native层发送的崩溃代码
如:adb shell monkey -p xxx.xxx.xxx -v -v -v --monitor-native-crashes 10
--kill-procress-after-error :用于在发送错误后杀死进程
--hprof :生产分析报告
设置后,在Monkey事件序列之前和之后立即生产分析报告,保存于data/mic目录,不过将会生成大量几兆文件,谨慎使用
事件类命令
-s:指定生成随机数的seed值
-s 伪随机数生成器的种子值,如果我们两次monkey测试事件使用相同的种子值,会产生相同的事件序列;如果不指定种子值,系统会产生一个随机值。种子值对我们复现bug很重要。
使用如下adb shell monkey -p xxx.xxx.xxx -s 11111 10;这也是伪随机事件的原因,因为这些事件可以通过种子值进行复现
--throttle :指定时间之间的间隔
设置每个事件结束后延迟多少时间再继续下一个事件,降低cpu压力;如果不设置,事件与事件之间将不会延迟,事件将会尽快生成;一般设置300ms,因为人最快300ms左右一个动作,
如 adb shell monkey -p xxx.xxx.xxx -v -v -v --throttle 300 10
设置事件百分比
--pct-touch :设置触摸事件的百分比
即手指对屏幕进行点击抬起(down-up)的动作;不做设置情况下系统将随机分配各种事件的百分比。
如:adb shell monkey -p xxx.xxxx.xxx --pct-touch 50 -v -v 100 ,这就表示100次事件里有50%事件是触摸事件
日志内表现如下:
Sleeping for 1000 milliseconds
:Sending Touch (ACTION_DOWN): 0:(537.0,384.0)
:Sending Touch (ACTION_UP): 0:(528.98175,380.89752)
--pct-motion :设置移动事件百分比
这种事件类型是由屏幕上某处的一个down事件-一系列伪随机的移动事件(多个move)-一个up事件,即点击屏幕,然后直线运动,最后抬起这种运动。
日志内表现如下:
Sleeping for 1000 milliseconds
:Sending Touch (ACTION_DOWN): 0:(212.0,232.0)
:Sending Touch (ACTION_MOVE): 0:(196.21788,232.03732)
:Sending Touch (ACTION_MOVE): 0:(193.2267,232.70642)
:Sending Touch (ACTION_MOVE): 0:(189.42407,233.83818)
:Sending Touch (ACTION_MOVE): 0:(178.91463,234.27678)
:Sending Touch (ACTION_MOVE): 0:(167.1213,234.52972)
:Sending Touch (ACTION_UP): 0:(161.15532,235.30768)
--pct-pinchzoom :设置缩放事件的百分比
此事件是指双指在屏幕同时按下,并滑动,最后在抬起,最常用的如图库中查看图片时的双指缩放操作。由一个ACTION_DOWN&ACTION_POINTER_DOWN–>多个ACTION_MOVE–>一个ACTION_UP&ACTION_POINTER_UP组成。
日志内表现如下:
Sleeping for 1000 milliseconds
:Sending Touch (ACTION_DOWN): 0:(1675.0,127.0)
:Sending Touch (ACTION_POINTER_DOWN 1): 0:(1660.8683,127.270905) 1:(91.0,127.0)
:Sending Touch (ACTION_MOVE): 0:(1648.9724,131.57997) 1:(93.137505,133.4656)
:Sending Touch (ACTION_MOVE): 0:(1638.9614,145.02449) 1:(95.54965,148.55142)
:Sending Touch (ACTION_MOVE): 0:(1632.5924,149.04834) 1:(119.84023,161.33905)
:Sending Touch (ACTION_MOVE): 0:(1617.6714,155.02124) 1:(125.864365,168.54866)
:Sending Touch (ACTION_MOVE): 0:(1614.0142,166.27557) 1:(138.15358,176.04399)
:Sending Touch (ACTION_MOVE): 0:(1609.7965,169.28517) 1:(157.99666,187.98212)
:Sending Touch (ACTION_MOVE): 0:(1599.6965,174.34644) 1:(174.66353,195.03151)
:Sending Touch (ACTION_MOVE): 0:(1596.4801,181.59657) 1:(195.80869,198.18735)
:Sending Touch (ACTION_POINTER_UP 1): 0:(1593.926,187.03218) 1:(218.11163,201.74115)
:Sending Touch (ACTION_UP): 0:(1591.9668,196.68542)
--pct-trackball :设置轨迹球事件百分比
这种事件类型是一个或者多个随机移动,包含点击事件,这里可以是曲线运动,不过现在手机很多不支持,这个参数不常用
日志内表现如下:
Sleeping for 1000 milliseconds
:Sending Trackball (ACTION_MOVE): 0:(2.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(2.0,1.0)
:Sending Trackball (ACTION_MOVE): 0:(-1.0,-3.0)
:Sending Trackball (ACTION_MOVE): 0:(0.0,1.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,3.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,-3.0)
:Sending Trackball (ACTION_MOVE): 0:(4.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(-1.0,1.0)
:Sending Trackball (ACTION_MOVE): 0:(-1.0,-2.0)
--pct-syskeys :设置系统物理按键事件百分比
比如home键,音量键,返回键,拨打电话键,挂电话键等
日志内表现如下:
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 164 // KEYCODE_VOLUME_MUTE
:Sending Key (ACTION_UP): 164 // KEYCODE_VOLUME_MUTE
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 25 // KEYCODE_VOLUME_DOWN
:Sending Key (ACTION_UP): 25 // KEYCODE_VOLUME_DOWN
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 3 // KEYCODE_HOME
:Sending Key (ACTION_UP): 3 // KEYCODE_HOME
--pct-nav :设置基本的导航按键事件百分比
比如输入设备上的上下左右四个方向键
日志内表现如下:
:Sending Key (ACTION_DOWN): 24 // KEYCODE_VOLUME_UP
:Sending Key (ACTION_UP): 24 // KEYCODE_VOLUME_UP
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 20 // KEYCODE_DPAD_DOWN
:Sending Key (ACTION_UP): 20 // KEYCODE_DPAD_DOWN
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 19 // KEYCODE_DPAD_UP
:Sending Key (ACTION_UP): 19 // KEYCODE_DPAD_UP
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT
:Sending Key (ACTION_UP): 21 // KEYCODE_DPAD_LEFT
--pct-appswitch :调整Activity启动的百分比
设置monkey使用startActivity进行activity跳转事件的百分比,保证界面的覆盖情况
如果该事件比例偏低,你将会看到大部分时间的测试都停留在同一个页面上,因此适当设置该事件的比例是很有必要的。
日志内表现如下:
:Switch:
#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.xxx.xxx/.model.welcome.ui.WelcomeActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.xxx.xxx/.model.welcome.ui.WelcomeActivity } in package com.dangbei.dbmusic
--ptc-anyevent :设置其它事件百分比
这包含所有其他事件,如按键、其他在设备上不常用的按钮等
日志内表现如下:
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 13 // KEYCODE_6
:Sending Key (ACTION_UP): 13 // KEYCODE_6
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 196 // KEYCODE_BUTTON_9
:Sending Key (ACTION_UP): 196 // KEYCODE_BUTTON_9
--ptc-majornav :设置主导航事件的百分比
主要导航事件是指点击“主要导航”按钮的操作。通常会导致 UI 界面的动作,主要是中间键、返回键、菜单键等
日志内表现如下:
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23 // KEYCODE_DPAD_CENTER
Sleeping for 1000 milliseconds
:Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU
:Sending Key (ACTION_UP): 82 // KEYCODE_MENU
--pct-rotation :屏幕旋转事件
是一个隐藏事件,用于模拟手机的横竖屏切换
:Sending rotation degree=0, persist=false
================================================================
如执行monkey压测命令如下(正常点击操作控制在1s点击一次):
adb shell monkey -p baoming -s666 --throttle 1000 -v -v -v --ignore-crashes --ignore-timeouts --pct-nav 30 --pct-majornav 10 --pct-syskeys 10 --pct-appswitch 10 --pct-anyevent 5 50000 >d:kuaisou.log
================================================================
四、杀死monkey进程:
1.查看monkey进程
adb shell ps | grep monkey ps 的意思是查询所有进程信息 后面的意思是筛选monkey的进程信息
2.杀死进程
adb shell kill 21499 这样monkey就关闭了
======================================================================
五、日志分析:
// Event percentages:
// 0: 12.209302% //0:触摸事件百分比,即参数--pct-touch
// 1: 8.139535% // 1:滑动事件百分比,即参数--pct-motion
// 2: 1.6279069% // 2:缩放事件百分比,即参数--pct-pinchzoom
// 3: 12.209302% // 3:轨迹球事件百分比,即参数--pct-trackball
// 4: -0.0% //4:屏幕旋转事件百分比,即参数 --pct-rotations
// 5: 30.0% // 5:基本导航事件百分比,即参数--pct-nav
// 6: 10.0% // 6:主要导航事件百分比,即参数--pct-majornav
// 7: 10.0% // 7:系统事件百分比,即参数--pct-syskeys
// 8: 10.0% // 8: Activity启动事件百分比,即参数--pct-appswitch
// 9: 0.81395346% //9: 键盘翻转事件百分比,即参数--pct-flip
// 10: 5.0% //10: 其他事件百分比,即参数--pct-anyevent
日志错误分析:
无响应问题可以在日志中搜索 “ANR” ,崩溃问题搜索 “CRASH” ,内存泄露问题搜索"GC"(需进一步分析),异常问题搜索 “Exception”
monkey执行时未加--ignore-crashes --ignore-crashes参数,就先浏览日志中Events injected: 值,查看当前已执行的次数,就知道有无bug
程序无响应的问题:在日志中搜索 “ANR”
崩溃问题:在日志中搜索 “Exception” ,在这里顺便提一下常见的Java异常:
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
违法访问错误:IllegalAccessError
内存不足错误:OutOfMemoryError
堆栈溢出错误:StackOverflowError