• Android Monkey


    一、Android Monkey介绍:

    1.Monkey是Google提供的一个用于稳定性与压力测试的命令行工具
    2.Monkey路径:

    Monkey程序是Android系统自带的

    路径:/system/farmwork/Monkey.jar 
    启动脚本路径:/system/bin/Monkey

    Monkey是由adb命令启动的,所以只要配置adb环境即可:
    1.下载android SDK
    2.环境变量配置很简单,百度一下就可以

    3.命令格式:

    1)直接PC启动

    adb shell monkey[option] 
    例如:”adb shell monkey 100”表示在设备上乱按100次

    2)shell端启动

    adb shell //进入手机终端命令 
    monkey[option] //使用monkey命令

    3)保存Monkey运行log

    //保存在PC中: 
    adb shell monkey [option] > d:monkey.txt 
    //保存在手机中: 
    monkey[option] >/mnt/sdcard/monkey.txt 
    //标准流与错误流分开保存: 
    monkey[option] 1>/mnt/sdcard/monkey.txt 2>/mnt/sdcart/error.txt

    二、Monkey基本参数与事件参数

    1.基本参数:

    方法

    说明

    -help

    打印帮助信息

     

    -v

    Monkey向命令行打印输出的log信息级别
    默认级别0(-v):-v只打印启动信息,测试完成信息和最终结果信息
    级别1(-v-v):-v打印执行时的一些信息,如发送事件
    级别2(-v-v-v-v):-v -v打印最详细信息

     
     
    • 例如:
    "monkey -help"
    "monkey -v"
    "monkey -v -v""monkey -v -v -v"

    2.约束条件:

    选项

    说明

    -P<允许执行的包名列表> 如果使用此参数指定一个或多个包,Monkey将只允许系统启动这些包里的Activity。如果你的应用程序还需要访问其他包里的Activity(如选取一个联系人),那些包也需要在此同时指定。如果不指定任何包,Monkey将允许系统启动全部包的Activity。要指定多个包需要使用多个-p选项,每个-p选项只能指定一个包
    -c<意图的总类> 如果用此参数指定了一个或几个类别,Monkey将只允许系统启动这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选择下列类别中列出的Activity:Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别需要使用多个-c选项,每个-c选项只能用于一个类别
    • 注意:

    1)使用-p启动必须在设备桌面上有图标才可以,-c就针对桌面没图标的应用。

    2)Activity可以在应用的xml文件中<Activity>标签中查看

    3)能用-p启动的应用,也就是在桌面上可以显示出图标的应用在xml文件的<Activity>标签中一定有这个:<category android:name="android.intent.category.LAUNCHER"/>

    4)如果要使用-c参数,也就是要在xml文件的<Activity>标签中加入<category android:name="PackageName.MONKEY"/>相当于是我们自定义的。也是没有桌面图标的。自定义的时候最好是包名.Monkey,方便调用

    • 例如:
    查询整个系统的包名命令:"adb shell pm list packages"可以在后面加">d:pag.txt"输出所有列表到d盘
    //测试时钟100次,并输出信息
    "adb shell monkey -p com.android.deskclock -v 100"
    //测试时钟和email各100次,并输出信息
    "adb shell monkey -p com.android.deskclock -p com.android.deskemail -v 100"
    //使用-c参数。PackageName.MONKEY为注意事项4中改的
    "adb shell monkey -c PackageName.MONKEY 300"

    3.事件:

    选项

    说明

    -s

    伪随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件序列

    –throttle<毫秒>

    在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被产生
    –randomize-throttle 在事件之间插入随机延迟,需要与–throttle配合使用,随机延迟范围为(0–throttle设置的时间)
    –pct-touch 调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某一个单一位置)
    –pct-motion 调整动作事件的百分比(动作事件由屏幕上某一处的一个down事件、一系列的伪随机事件和一个up事件组成)
    –pct-trackball 调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)
    –pct-nav 调整”基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)
    –pct-majornav 调整”主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键,回退按键,菜单按键等)
    –pct-syskeys 调整”系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home,Back,音量控制键等)
    –pct-appswitch 调整启动activity的百分比。在随机间隔里,monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法
    –pct-anyevent 调整其他类型事件的百分比。包括:按键、其他不常用的设备按钮等
    –pct-filp 调整键盘换出隐藏的百分比
    –pct-pinchzoom 调整两指缩放压缩手势的百分比
    • 注意:
    1)-s 因为monkey是随机对actyivity进行操作,因此,当出现错误的时候如果需要复现或者回归,我们只需-s之前错误的事件序列就可以进行之前出错的按键操作
    • 例如:
    //使用-s操作时钟应用上activity100次。如果不用-s的话,每次操作的seed值就会不同,那样就没法固定复现或者回归
    "adb shell monkey -p com.android.deskclock -s 100 -v -v 100"
    //以每次间隔200毫秒的延时操作时钟100次
    "adb shell monkey -p com.android.deskclock --throttle 200 -v 100"
    //以每次间隔0-200毫秒的随机延时操作时钟100次
    "adb shell monkey -p com.android.deskclock --throttle 200 --randomize-throttle -v 100"
    //以每次间隔0-200毫秒的随机延时操作时钟100次,每次操作都执行触摸操作(参数后面的100就是百分比数)
    "adb shell monkey -p com.android.deskclock --pct-touch 100 --throttle 200 --randomize-throttle -v 100"
    //对时钟操作100次,每次都执行轨动作事件(参数后面的100就是百分比数)
    "adb shell monkey -p com.android.deskclock --pct-motion 100  -v 100"
    //以此类推轨迹事件、基本导航事件、主要导航事件、系统按键事件、主要导航事件、等,需要注意的是百分比事件可以连用。按照百分比分配即可,当然所有事件的总和不能超过100

    四、Monkey黑白名单

    • 黑名单:不测试的应用
    • 白名单:要测试的应用

    如果要测试的应用太多,使用太多-p太麻烦,这时候就可以用刀黑白名单了,需要注意的是,黑名单和白名单只能设置一个

    选项

    说明

    –pkg-blacklist-file apk黑名单,屏蔽掉黑名单中的apk不操作
    PACKAGE_BLACKLIST_FILE apk黑名单,屏蔽掉黑名单中的apk不操作
    –pkg-whitelist-file apk白名单,只操作包含在白名单红的apk
    PACKAGE_WHITELIST_FILE apk白名单,只操作包含在白名单红的apk
    • 例如:
    //假设设置黑名单:"com.android.contacts","com.android.launcher"首先先将这两个包名存放在一个txt文件中(一行一个包名)。比如说是:d:lacklist.txt。为了方便记忆,使用参数名作为文件名是一个不错的选择
    //先将黑名单push到设备中,需要记住下面push到的路径。
    "adb push d:reak.txt /data/local/tmp"
    //除了黑名单外的整机测试,延时200毫秒操作300次
    "adb shell monkey --keg-blacklist-file /data/local/tmp/blacklist.txt --throttle 200 300"
    //白名单也是同理

    五、Monkey结果解读

    1.Monkey结果分类

    • Mlokey运行log输出,按照以下顺序输出:
    1)测试命令信息        随机种子、运行次数、可运行的应用列表、各事件百分比
    2)伪随机事件流        11大事件流
    3)异常信息          ANR、CRASH等异常
    4)测试结果信息        完成事件、旋转情况、案件情况、网络状态

    2.Monkey结果详细解读


    这里写图片描述

     

    这里写图片描述

     

    这里写图片描述

     

    这里写图片描述

     

    这里写图片描述

     

    这里写图片描述

     

    这里写图片描述

     

    1)有一个隐藏属性,旋转。命令为:

    adb shell monkey –pct-rotation 100 –throttle 2000 10//两秒间隔旋转10次

    六、Monkey异常结果

    1.Monkey异常结果

    1)ANR输出异常格式:

    //ANR无响应,哪一个进程没响应,进程号(Pid)是多少
    System.err.println("//NOT RESPONDING:"+"(pid"+pdi+")");
    • 例:ANR输出log
    //NOT RESPONDING:com.android.quicksearchbox(pid 6333)
    //哪一个进程ANR
    ANR in com.android.quicksearchbox(com.android.quicksearchbox/.SearchActivity)
    //CPU使用情况
    CPU usage from 8381ms to 2276ms ago:
    //内存信息
    procrank:→通过"adb shell procrank"命令输出
    //trace信息
    anr traces:→保存于/data/anr/traces.txt
    //meminfo信息
    meminfo:→通过"adb shell dumpsys meminfo"命令输出
    //Bugereport信息
    Bugreport:→通过"adb bugreport"命令输出,可用--bugreport参数控制

    2)Creash输出异常格式:

    System.err.println("//CREAAH:"+processName+"(pid"+pdi+")");//creash的进程名+进程号
    System.err.println("//Short Msg:"+ShortMsg);//错误类型,短消息
    System.err.println("//Long Msg:"+LongMsg);//错误类型,长消息
    System.err.println("//Build Lable:"+Build.FINGERPRINT);//系统属性
    System.err.println("//Build Changelist:"+Build.VERSION.INCREMENTAL);//系统属性
    System.err.println("//Build Time:"+Build.TIME);//系统属性
    System.err.pringln("//"+stackTrace.replace("
    ","
    //"));//输出
    • 例:creash输出log:
    //Crash:com.android.quicksearchbox(pid 1699)
    //Short Msg:java.lang.NullPointerException
    //Long Msg:java.lang.NUllPointException:Attempt to invoke virtual method'com.android.quicksearbox.SourceResult com.android.quicksearchbox.Suggestions.getResult()' on a null object reference
    //可以通过"adb shell"进入手机后使用"getprop | grep 86"查看该系统属性
    //Build Lable:generic/vbox86p:5.0/LRX21M/buildbot12160004:userdebug/test-keys
    //可以通过"adb shell"进入手机后使用"getprop | grep bot"查看该系统属性
    //Build Changelist:eng.buildbot.20141216.000103
    //可以通过"adb shell"进入手机后使用"getprop | grep time"查看该系统属性
    //Build Time:1318684697000
    //java.lang.RuntimeException:Unable to stop activity{com.android.quicksearchbox/com.android.quicksearchbox.SearchActivity}:java.lang.NullPointerException:Attempt to invoke virtual method 'com.android.quicksearchbox.SourResult com.android.quicksearchbox.Suggestions.getResult()' on a null object reference
    //at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3344)
    //creash的一些信息
    //at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3344)
    //at android.app.ActivityThread.handleStopActivity(ActivityThread:java:3390)
    //at android.app.ActivityThread.access$1100(ActivityThread:java:144)
    //at android.app.ActivityThread$H.handleMessage(ActivityThread:java:1307)
    //at android.os.Handler.dispatchMessage(Handler.java:102)
    //at android.Looper.loop(Looper.java:135)

    2.Java常见错误类型

    • 例如:
    异常与错误类型
    说明
    
    java.lang.NullPointerException
    空指针异常
    
    java.lang.ArraIndexOutOfBoundsException
    数组溢出
    
    java.lang.ClassNotFoundException
    类不存在
    
    java.lang.ArithmeticException
    数学运算异常
    
    java.lang.IllegalArgumentException
    方法参数异常
    
    java.os.FileNotFoundException
    文件未找到
    
    java.lang.NumberFormatException
    数值转化异常
    
    java.lang.StackOverflowError
    堆栈异常错误
    
    java.lang.OutOfMemoryError
    内存溢出错误

    七、Monkey测试策略介绍

    • 策略例子1:整机测试,而不测试拨号盘应用,忽略所有错误,次数100万次
    adb shell monkey --ignore-creashes --ignore-timeouts --pke-blacklist-file /data/local/tmp/blacklist.txt -v -v 1000000
    • 策略例子2:测试计算器30万次,随机种子为100,随机延迟0-1秒,忽略所有错误
    adb shell monkey -p com.android.calculator2 -s 100 --throttle 1000 --randomize-throttle --ignore-creashs --ignore-timeouts -v -v 300000
    • 策略例子3:测试计算器,触摸事件30%,其他按键50%,错误停止,延时200
    adb shell monkey -p com.android.calculator2 --throttle 200 --pct-touch 30 --pct-anyevent 50 -v -v 100000
    • 策略例子4:对计算器进行旋转压力测试,事件延时2秒,10W次
    adb shell monkey -p com.android.calculator2 -pct-rotation 100 --throttle 2000 100000
    • 策略例子5:仅对整机的应用开启测试,事件延时5秒,10W次
    adb shell monkey --pct-appswitch 100 --throttle 5000 100000
  • 相关阅读:
    [cf 947E] Perpetual Subtraction
    loj3120. 「CTS2019 | CTSC2019」珍珠
    loj「LibreOJ NOI Round #2」不等关系
    loj6395. 「THUPC2018」城市地铁规划 / City
    loj2553. 「CTSC2018」暴力写挂
    loj6270. 数据结构板子题
    loj6358. 前夕
    loj6677. EntropyIncreaser 与菱形计数
    fiddler模拟接口响应数据
    Fiddler请求详解/autoResponseder重定向
  • 原文地址:https://www.cnblogs.com/JianXu/p/5162727.html
Copyright © 2020-2023  润新知