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