monkey

作者: 阿飞666666 | 来源:发表于2020-03-07 01:29 被阅读0次

    一、什么是Monkey

    在Android的官方自动化测试领域有一只非常著名的“猴子”叫Monkey,这只“猴子”一旦启动,就会让被测的Android应用程序像猴子一样活蹦乱跳,到处乱跑。Monkey是一个程序,运行在您的模拟器或设备上,并生成伪随机的用户事件流,如点击,触摸或手势,以及一些系统级事件。 您可以使用Monkey以随机但可重复的方式对您正在开发的应用程序进行压力测试。

    二、 Monkey的特征

    1、测试的对象仅为应用程序包,有一定的局限性。

    2、 Monkey测试使用的事件流数据流是随机的,不能进行自定义。

    3、可对MonkeyTest的对象,事件数量,类型,频率等进行设置。

    三、Monkey的基本用法

    基本语法如下:

    $ adb shell monkey [options]

    如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:

    $ adb shell monkey -p your.package.name -v 500

    四、monkey事件

    Monkey所执行的随机事件流中包含11大事件,分别是触摸事件、手势事件、二指缩放事件、轨迹事件、屏幕旋转事件、基本导航事件、主要导航事件、系统按键事件、启动Activity事件、键盘事件、其他类型事件。Monkey通过这11大事件来模拟用户的常规操作,对手机App进行稳定性测试。下面让我们来详细了解这11大事件。

    1.触摸事件

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

    2.手势事件

    手势事件是指在屏幕某处的按下、随机移动、抬起的操作,即直线滑动操作。可通过--pct-motion参数来配置其事件百分比。

    该事件是由一个ACTION_DOWN事件、一系列ACTION_MOVE事件和一个ACTION_UP事件组成的,在手机上看到的实际操作是一个没有拐弯的直线滑动操作。

    3.二指缩放事件

    二指缩放事件是指在屏幕上的两处同时按下,并同时移动,最后同时抬起的操作,即智能机上的放大缩小手势操作。可通过--pct-pinchzoom参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到:

    该事件起始是一个ACTION_DOWN事件和一个ACTION_POINTER_DOWN事件,即模拟两个手指同时点下;中间是一系列的ACTION_MOVE事件,即两个手指同时在屏幕上直线滑动;结束是由一个ACTION_POINTER_UP事件和一个ACTION_UP事件组成的,即两个手指同时放开。

    4.轨迹事件

    轨迹事件是由一个或多个随机的移动组成的,有时会伴随着点击。很早之前的Android手机带有轨迹球,这个事件就是模拟的轨迹球的操作。现在的手机几乎都没有轨迹球,但轨迹球事件中包含曲线滑动操作,如果被测程序需要曲线滑动时可以选用此参数。可通过--pct-trackball参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到:

    该事件是由一系列的Trackball(ACTION_MOVE)事件组成的,观察手机上的操作,即为一系列的曲线滑动操作。

    5.屏幕旋转事件

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

    6.基本导航事件

    基本导航事件是指点击方向输入设备的上、下、左、右按键的操作,现在手机上很少有上、下、左、右按键,这种事件一般用得比较少。可通过--pct-nav参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到:

    该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的就是上、下、左、右四个方向按键。

    7.主要导航事件

    主要导航事件是指点击“主要导航”按键的操作,这些按键通常会导致UI界面中的动作,如键盘的中间键、回退按键、菜单按键。可通过--pct-majornav参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到: [代码] 该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的按键就是中间键和菜单键。

    8.系统按键事件

    系统按键事件是指点击系统保留使用的按键的操作,如点击Home键、返回键、音量调节键等。可通过--pct-syskeys参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到: [代码] 该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的就是上面说到的几个系统按键。

    9.启动Activity事件

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

    10.键盘事件

    键盘事件主要是一些与键盘相关的操作。比如点击输入框、键盘弹起、点击输入框以外区域、键盘收回等。可通过--pct-flip参数来配置其事件百分比。从Monkey执行该事件对外输出的日志可以看到: [代码] 如日志所示,这里主要是键盘的打开和关闭操作。

    11.其他类型事件

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

    五、monkey参数

    参数分类

    1.常规类参数

    2.事件类参数

    3.约束类参数

    4.调试类参数

    常规类参数

    常规类参数包括帮助参数和日志信息参数。帮助参数用于输出Monkey命令使用指导;日志信息参数将日志分为三个级别,级别越高,日志的信息越详细。

    1.帮助类参数

    monkey -h

    2.日志级别

    $ adb shell monkey -v <event-count>

    -v:打印出日志信息,每个-v将增加反馈信息的级别。-v越多日志信息越详细,不过目前最多支持3个-v,即:

    事件类参数

    事件类参数的作用是对随机事件进行调控,从而使其遵照设定运行,如设置各种事件的百分比、设置事件生成所使用的种子值等。频率参数主要限制事件执行的时间间隔。

    1.执行指定脚本

    $ adb shell monkey -f <scriptfile> <event-count>

    $ adb shell monkey -f /mnt/sdcard/test1

    2.伪随机数生成种子值

    使用-s命令可以重复执行之前的伪随机操作。本身每次执行伪随机事件操作也会默认生成一个seed值

    $ adb shell monkey -s <seed> <event-count>

    $ adb shell monkey -s 666 100

    3.设置间隔 如果你希望在每一个指令之间加上固定的间隔时间,可以用--throttle(注意,前面是--)命令。

    $ adb shell monkey --throttle <milliseconds>

    $ adb shell monkey --throttle 3000  5

    --throttle:后面接时间,单位为ms(<milliseconds>),表示事件之间的固定延迟(即执行每一个指令间隔的时间),若不接该选项,monkey将不会延迟。

    4.调整触摸事件百分比

    如果你希望调整触摸事件的百分比,记住使用--pct-touch。

    $ adb shell monkey --pct-touch

    $ adb shell monkey -v -v --pct-touch 100 200

    <percent>--pct-touch:后面接触摸事件百分比

    注意:触摸事件不单单是按键,它泛指发生在某一位置的一个down-up事件。

    5.调整手势事件百分比

    $ adb shell monkey --pct-motion

    $ adb shell monkey -v -v --pct-motion 100 200

    6.调整应用启动事件的百分比

    如果你希望调整应用启动事件的百分比,记住使用--pct-app-switch。

    $ adb shell monkey --pct-appswtich <percent>

    --pct-appswitch:后面接应用启动事件百分比。

    应用启动事件(即activity launches)俗称打开应用,通过调用startActivity()方法最大限度地开启该package下的所有应用。

    7.调整屏幕旋转事件百分比

    $ adb shell monkey --pct-rotation <percent>

    --pct-rotation 后面接屏幕旋转事件的比例值。

    8.其他参数

    约束类参数

    1.包约束

    -p:后面接一个或多个包名(<allowed-package-name>),如果应用需要访问其他包里的Activity,那相关的包也需要在此同时指定。如果不指定任何包,monkey将允许系统启动全部包里的Activity。

    $ adb shell monkey -p <allowed-package-name> <event-count>

    $ adb shell monkey -p com.tal.kaoyan 500

    $ adb shell monkey -p com.tal.kaoyan -p com.tencent.mm 500

    2.activity类约束

    如果你希望将monkey限制在一个或几个类别中,使用如下命令:

    adb shell monkey -c <main-category> <event-count>

    以下命令表示运行Intent.CATEGORY_LAUNCHER类别的Activity并发送1000个随机事件。

    $ adb shell monkey -c Intent.CATEGORY_LAUNCHER  1000

    调试类参数

    1.应用程序崩溃后继续发送事件

    如果你希望monkey在应用程序崩溃后继续发送事件,则需要用到--ignore-crashes命令

    $ adb shell monkey --ignore-crashes <event-count>

    在设置此选项后,当应用程序崩溃或发生失控异常时,monkey将继续运行直到计数完成。如果不设置此选项,monkey遇到上述崩溃或异常将停止运行。

    2.超时错误继续发送事件

    如果你希望monkey在任何超时错误发生后继续发送事件,则需要用到--ignore-timeouts命令。

    $ adb shell monkey --ignore-timeouts

    <event-count>--ignore-timeouts:在设置此选项后,当应用程序发生任何超时错误(如ANR,即Application Not Responding)时,monkey将继续运行直到计数完成。如果不设置此选项,monkey遇到此类超时对话框将停止运行。

    3.应用程序权限错误发生后继续发送事件

    如果你希望monkey在应用程序权限错误发生后继续发送事件,则需要用到--ignore-security-exceptions命令。

    $ adb shell monkey --ignore-security-exceptions

    <event-count>--ignore-security-exceptions:在设置此选项后,当应用程序发生任何权限错误(如启动一个需要某些权限的Activity)时,monkey将继续运行直到计数完成。如果不设置此选项,monkey遇到此类权限错误将停止运行。

    其他参数

    Monkey参数应用综合案例

    测试场景

    测试考研帮app Android版。测试希望通过Monkey来模拟用户的随机操作,检查被测应用是否会出现异常(应用崩溃或者无响应)。

    需求分析

    1、测试是指定应用,因此需要使用-p指定被测app包名:com.tal.kaoyan

    2、这个测试的目的是希望模拟用户操作,因此需要让Monkey执行的事件尽可能地接近用户的常规操作,这样才可以最大限度地发现用户使用过程中可能出现的问题。因此需要对Monkey执行的事件百分比做一些调整:

    触摸事件和手势事件是用户最常见的操作,所以通过--pct-touch和--pct-motion将这两个事件的占比调整到40%与25%;目标应用包含了多个Activity,为了能覆盖大部分的Activity,所以通过--pct-appswitch将Activity切换的事件占比调整到10%;被测应用在测试中出现过不少横竖屏之间切换的问题,这个场景也必须关注,因此通过--pct-rotation把横竖屏切换事件调整到10%。

    3、使用-s参数来指定命令执行的seed值 Monkey会根据seed值来生成对应事件流,同一个seed生成的事件流是完全相同的。这里指定了seed值,是为了测试发现问题时,便于进行问题复现。

    4、使用--throttle参数来控制Monkey每个操作之间的时间间隔 指定操作之间的时间间隔,一方面是希望能更接近用户的操作场景,正常用户操作都会有一定的时间间隔;另一方面也是不希望因为过于频繁的操作而导致系统崩溃,尤其是在比较低端的手机上执行测试时。因此通过--throttle设置Monkey每个操作固定延迟0.4秒。

    5、使用--ignore-crashs和--ignore-timeouts参数使Monkey遇到意外时能继续执行 在执行Monkey测试时,会因为应用的崩溃或没有响应而意外终止,所以需要在命令中增加限制参数--ignore-crash和--ignore-timeouts,让Monkey在遇到崩溃或没有响应的时候,能在日志中记录相关信息,并继续执行后续的测试。

    6、使用-v指定log的详细级别 Monkey的日志输出有3个级别:日志的级别越高,其详细程度也越高。为了方便问题的定位,这里将日志设为 -v -v.

    测试命令

    adb shell monkey -p com.tal.kaoyan

    --pct-touch 40 --pct-motion 25 

    --pct-appswitch 10

    --pct-rotation 5

    -s 1666 --throttle 400

    --ignore-crashes

    --ignore-timeouts

    -v -v  200

    五、monkey自定义脚本实践

    1.自定义脚本的稳定性测试

    常规Monkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景这时候就需要用到自定义脚本了,Monkey支持执行用户自定义脚本的测试,用户只需要按照Monkey脚本的规范编写好脚本,存放到手机上,启动Monkey通过-f 参数调用脚本即可。

    2.测试案例

    启动考研帮app3.1.0,然后跳过升级提示和引导页面,进入到登录界面并输入用户名密码进行登录。

    3.需求分析

    从用户角度来思考步骤该怎样进行?

    要操作的元素该如何定位?

    怎样将操作步骤转化为测试脚本?

    4.获取元素坐标点位置

    Monkey脚本只能通过坐标的方式来定位点击和移动事件的屏幕位置,这里就需要提前获取坐标信息。获取坐标信息的方法很多,最简单的方法就是打开手机中的开发人员选项,打开“显示指针位置”。随后,在屏幕上的每次操作,在导航栏上都会显示坐标信息。

    5.Monkey脚本API简介

    LaunchActivity(pkg_name, cl_name):启动应用的Activity。参数:包名和启动的Activity。

    Tap(x, y, tapDuration): 模拟一次手指单击事件。参数:x,y为控件坐标,tapDuration为点击的持续时间,此参数可省略。

    UserWait(sleepTime): 休眠一段时间

    DispatchPress(keyName): 按键。参数: keycode。 RotateScreen(rotationDegree, persist): 旋转屏幕。 参数:rotationDegree为旋转角度, e.g. 1代表90度;persist表示旋转之后是否固定,0表示旋转后恢复,非0则表示固定不变。

    DispatchString(input): 输入字符串。

    DispatchFlip(true/false): 打开或者关闭软键盘。

    PressAndHold(x, y, pressDuration): 模拟长按事件。

    Drag(xStart, yStart, xEnd, yEnd, stepCount): 用于模拟一个拖拽操作。

    PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟缩放手势。

    LongPress(): 长按2秒。

    DeviceWakeUp(): 唤醒屏幕。

    PowerLog(power_log_type, test_case_status): 模拟电池电量信息。

    WriteLog(): 将电池信息写入sd卡。

    RunCmd(cmd): 运行shell命令。

    DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags): 向指定位置,发送单个手势。

    DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFilags): 发送按键消息。

    LaunchInstrumentation(test_name,runner_name): 运行一个instrumentation测试用例。

    DispatchTrackball: 模拟发送轨迹球事件。

    ProfileWait: 等待5秒。

    StartCaptureFramerate(): 获取帧率。

    EndCaptureFramerate(input): 结束获取帧率。

    6.Monkey脚本格式

    Monkey脚本主要包含两部分,一部分是头文件信息,一部分是具体的monkey命令。

    type = raw events  

    count = 1  

    speed = 1.0  

    //下面为monkey命令  

    start data >>   

    具体的monkey脚本内容  

    7.编写脚本

    kyb.txt

    #头文件信息

    type = raw events

    count = 1

    speed = 1.0

    #启动测试

    start data >>

    LaunchActivity(com.tal.kaoyan,com.tal.kaoyan.ui.activity.SplashActivity)

    UserWait(2000)

    Tap(624,900,1000) #点击取消升级

    UserWait(2000)

    Tap(806,64,1000) #点击跳过

    UserWait(2000)

    Tap(217,378,1000) #点击用户名输入框

    DispatchString(zxw1234)

    UserWait(2000)

    Tap(197,461,1000) #点击密码输入框

    DispatchString(zxw123456)

    UserWait(2000)

    Tap(343,637,1000) #点击登录按钮

    执行脚本

    脚本编写完成后,传到手机设备上,然后执行。

    adb push C:\Users\Shuqing\Desktop\kyb1.txt /sdcard

    adb shell monkey -f /sdcard/kyb1.txt -v 1

    执行结果

    C:\Users\Shuqing>adb shell monkey -f /sdcard/kyb.txt -v 1

    :Monkey: seed=1524592021303 count=1

    :IncludeCategory: android.intent.category.LAUNCHER

    :IncludeCategory: android.intent.category.MONKEY

    Replaying 0 events with speed 1.0

    :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.tal.kaoyan/.ui.activity.SplashActivity;end

        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tal.kaoyan/.ui.activity.SplashActivity } in package com.tal.kaoyan

    :Sending Touch (ACTION_DOWN): 0:(267.0,1233.0)

        // Allowing start of Intent { act=com.android.systemui.recent.action.TOGGLE_RECENTS cmp=com.android.systemui/.recent.RecentsActivity } in package com.android.systemui

    :Sending Touch (ACTION_UP): 0:(267.0,1233.0)

    Events injected: 5

    :Sending rotation degree=0, persist=false

    :Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0

    ## Network stats: elapsed time=7201ms (0ms mobile, 0ms wifi, 7201ms not connected)

    // Monkey finished

    注意事项

    头文件代码书写注意“=”两边预留空格,否则会出现

    六.monkey 日志管理

    1.日志管理作用

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

    2.monkey日志保存方法

    保存在PC中

    保存在手机上

    标准流和错误流分开保存

    3.保存在PC中

    >adb shell monkey [option] <count> >d:\monkey.txt

    C:\Users\Shuqing>adb shell monkey -v -v 100 >d:\monkeylog.txt

    4.保存在手机上

    C:\Users\Shuqing>adb shell monkey -v 100 >/sdcard/monkeylog.log

    注意:不能写成C:\Users\Shuqing>adb shell monkey -f /sdcard/kyb.txt -v 1 > /mnt/sdcard/monkey.log 否则会报错“系统找不到指定的路径”。

    5.标准流和错误流分开保存

    ·标准流与错误流分开保存,代码如下:

    Monkey [option] <count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt

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

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

    6.日志内容分析

    运行命令:

    adb shell monkey -v 100

    运行后log如下:

    C:\Users\Shuqing>adb shell monkey -v 100

    :Monkey: seed=1524595418646 count=100

    :IncludeCategory: android.intent.category.LAUNCHER

    :IncludeCategory: android.intent.category.MONKEY

    // Event percentages:

    //   0: 15.0%

    //   1: 10.0%

    //   2: 2.0%

    //   3: 15.0%

    //   4: -0.0%

    //   5: 25.0%

    //   6: 15.0%

    //   7: 2.0%

    //   8: 2.0%

    //   9: 1.0%

    //   10: 13.0%

    :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.android.settings/.Settings;end

        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.settings/.Settings } in package com.android.settings

    :Sending Touch (ACTION_DOWN): 0:(381.0,391.0)

    :Sending Touch (ACTION_UP): 0:(371.61426,386.54578)

    :Sending Touch (ACTION_DOWN): 0:(608.0,610.0)

    :Sending Touch (ACTION_UP): 0:(609.2884,609.54736)

    :Sending Trackball (ACTION_MOVE): 0:(-3.0,4.0)

    :Sending Trackball (ACTION_MOVE): 0:(4.0,4.0)

    :Sending Touch (ACTION_DOWN): 0:(42.0,319.0)

    :Sending Touch (ACTION_UP): 0:(40.672623,306.90936)

    :Sending Touch (ACTION_DOWN): 0:(577.0,372.0)

    :Sending Touch (ACTION_UP): 0:(521.3876,386.2045)

    :Sending Touch (ACTION_DOWN): 0:(59.0,762.0)

    :Sending Touch (ACTION_UP): 0:(92.18322,695.0543)

    :Sending Touch (ACTION_DOWN): 0:(46.0,1066.0)

    :Sending Touch (ACTION_UP): 0:(118.78821,1042.1993)

    :Sending Touch (ACTION_DOWN): 0:(525.0,696.0)

    :Sending Touch (ACTION_UP): 0:(557.81305,684.04376)

    :Sending Touch (ACTION_DOWN): 0:(466.0,12.0)

    :Sending Touch (ACTION_UP): 0:(453.73657,10.844121)

    :Sending Trackball (ACTION_MOVE): 0:(0.0,1.0)

    Events injected: 100

    :Sending rotation degree=0, persist=false

    :Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0

    ## Network stats: elapsed time=924ms (0ms mobile, 0ms wifi, 924ms not connected)

    // Monkey finished

    资料来源于:https://www.51zxw.net/List.aspx?cid=451

    相关文章

      网友评论

          本文标题:monkey

          本文链接:https://www.haomeiwen.com/subject/lyezrhtx.html