zoukankan      html  css  js  c++  java
  • Android稳定性之Monkey测试

    1. Monkey是什么

    Monkey是一个运行在模拟器或者Android设备中可以产生类似用户点击、触摸、手势以及一些系统级的伪随机事件流的程序。我们可以通过命令让monkey向模拟器或者Android设备发送伪随机事件流来对我们开发的App进行压力测试。

    1.1. Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是: /system/framework/monkey.jar,包名:com.android.commands.monkey.Monkey;  
    1.2. Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中 的存放路径是:/system/bin/monkey;

    内容为:

    # Script to start "monkey" on the device, which has a very rudimentary

    # shell.

    #

    base=/system

    export CLASSPATH=$base/framework/monkey.jar

    trap "" HUP

    exec app_process $base/bin com.android.commands.monkey.Monkey $*

    app_process是Android的系统启动进程,用于启动zygote和其他java进程:

    if (zygote) {

           runtime.start("com.android.internal.os.ZygoteInit", args, zygote);

       } else if (className) {

           runtime.start("com.android.internal.os.RuntimeInit", args, zygote);

       }

    1.3. Monkey 命令启动方式:

    a. 可以通过PC机CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试         

    b. 在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数} 来进行Monkey测试

    2. 环境搭建

    下载Android SDK并配置adb环境变量

    打开Android设备开发者选项中的USB调试。

    3. Monkey 架构

    Monkey 运行在设备或模拟器上面,可以脱离PC运行(普遍做法是将monkey作为一个向待测应用发送随机按键消息的测试工具,验证待测应用在这些随机性的输入面前是否会闪退或者崩溃)

    wps1

    4. Monkey 参数大全

    wps2

    5. Monkey 命令基本参数介绍

    Monkey基本用法:

    adb shell monkey [options] <event-count>

    Category

    Option

    Description

    通用

    --help

    打印帮助

    -v

    命令行中的每个-v都将增加测试信息的详细级别
    Level 0 (默认)提供了很少的信息除了启动通知,测试完成,和最终结果。-v
    Level 1 提供了更详细的测试运行,如个别事件被发送到您的Activity。 -v -v
    Level 2 提供了更详细的设置等信息如Activity选中或未选中的测试信息。 -v -v -v
    根据你对测试结果要求的详细程度来确定您用几个-v,一般会用-v -v -v 最详细的输出到指定文件中,方便查找bug的原因。

    事件

    -s <seed>

    伪随机数生成器的种子值,如果用相同的种子值再次运行monkey,将生成相同的事件序列。(该种子值对于Bug复现至关重要)
    注:如果不指定种子值,系统会随机生成一个种子值,在出现Bug时该种子值会和Bug信息一起被输出,这也是为了便于复现该Bug

    --throttle <milliseconds>

    在事件之间插入特定的延时时间(单位毫秒),这样做可以延缓monkey执行事件的速度,默认没有延时,monkey会以最快速度将指定的事件个数执行完。

    --pct-touch <percent>

    指定touch(触摸)事件的百分比,touch事件是由一个DOWN和一个UP组成,按下并抬起即是一个touch事件
    注:若不指定任何事件的百分比,系统将随机分配各种事件的百分比

    --pct-motion <percent>

    指定motion(手势)事件百分比,motion事件是由屏幕上某处一个down事件、一系列伪随机的移动事件和一个up事件组成
    注:移动事件是直线移动

    --pct-pinchzoom <percent>

    缩放事件百分比

    --pct-trackball <percent>

    指定trackball(轨迹球)事件的百分比,滚动球事件由一个或多个随机的移动事件组成,有时会伴随着点击事件
    注:移动事件可以是曲线移动

    --pct-rotation <percent>

    屏幕旋转事件百分比

    --pct-nav <percent>

    指定基本的导航事件百分比。导航事件由方向输入设备的上下左右按键所触发的事件组成,即四个方向键

    --pct-majornav <percent>

    指定主导航事件百分比。这些导航事件通常会导致UI界面发生变化,如5-way键盘的中间键,返回按键、菜单按键

    --pct-syskeys <percent>

    指定系统事件百分比。这些按键通常由系统保留使用,如Home、Back、Start Call、End Call、音量调节

    --pct-appswitch <percent>

    指定Activity启动的百分比。在随机的时间间隔中,monkey执行startActivity()方法,最大程度地覆盖应用中全部的Activity

    --pct-flip <percent>

    键盘翻转事件百分比

    --pct-anyevent <percent>

    指定其他事件的百分比。包含所有其他事件,如按键、其他在设备上不常用的按钮等

    约束

    -p <allowed-package-name>

    约束只对某个应用进行测试,your.package.name是你要进行测试的应用包名,如果要对多个应用进行测试可以使用多个-p

    -c <main-category>

    如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选 择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选 项只能用于一个类别。

    --pkg-whitelist-file <whitelist file>

    只执行在白名单中的apk。

    --pkg-blacklist-file <blacklist file>

    系统将执行除了黑名单中以外的apk。

    调试

    --dbg-no-events

    设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。

    --hprof

    设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要小心使用它。

    --ignore-crashes

    用于指定当应用程序崩溃时(Force & Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。

    --ignore-timeouts

    用于指定当应用程序发生ANR(Application Not Responding)错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。

    --ignore-security-exceptions

    用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。

    --kill-process-after-error

    通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。

    --monitor-native-crashes

    监视并报告Android系统中本地代码的崩溃事件。如果设置了--kill-process-after-error,系统将停止运行。

    --wait-dbg

    停止执行中的Monkey,直到有调试器和它相连接。


    6. Monkey实例

    (1) 使用命令行执行

    以 xxx app为例,其包名为com.xxx.office.oa,PC连上Android设备后

    a. 手机上创建Monkeylog文件夹:adb shell mk /sdcard/Monkeylog

    b. 挂起logcat:adb  shell "logcat -v time >/sdcard/Monkeylog/Logcat.log 2>&1"

    c. 对该APP执行monkey测试:adb shell "monkey -c android.intent.category.LAUNCHER -c android.intent.category.MONKEY -c android.intent.category.DEFAULT -c android.intent.category.BROWSABLE -c android.intent.category.HOME -c android.intent.category.TEST --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -s 1423 -v -v -v --throttle 1000 -p com.xxx.office.oa 190000 >/sdcard/Monkeylog/MonkeyScreenLog.log 2>&1"

    注:180000大致跑12小时,应用验收时一般要求12小时无异常

    (2) 使用MoonLight执行

    MoonLight为科大讯飞研发的一款插件化的手机应用调试工具,可用作Monkey自动化测试。

    以xxx app为例,

    a. config ask.xml配置项中的指令自动运行monkey,拉起被测试的app,支持中断恢复和定时停止。具体配置如下所示:

    <TASK>

            <CLASSNAME>iflytek.testTech.moonlight.task.monkey.Task_Monkey</CLASSNAME>

            <TAGNAME>monkey</TAGNAME>

            <Time_Minute>999</Time_Minute>

            <NoMonkey>false</NoMonkey>

            <MonkeyCommand>monkey -p com.xxx.office.oa --pct-syskeys 0  --ignore-crashes --ignore-native-crashes --ignore-timeouts --ignore-security-exceptions --throttle 1000 190000 </MonkeyCommand>

    </TASK>

    <!-- iTestMini配置项, 间隔, 包名(多个包名需英文逗号隔开)。默认监控cpu, pss内存, 系统总cpu, 系统剩余pss内存  -->

    <TASK>

            <CLASSNAME>iflytek.testTech.moonlight.task.itestmini.TH_iTestMini </CLASSNAME>

            <TAGNAME>iTestMini</TAGNAME>

    <AUTOSTART>false</AUTOSTART>

    <interval>5</interval>

    <pkg>com.xxx.office.oa</pkg>

    <serverEnable>false</serverEnable>

    <serverUrl>http:/itest.iflytek.com:2017/iTestServer/</serverUrl>

    <serverUser>**</serverUser>

    <serverPasswd>**</serverPasswd>

    b. Android设备连上PC,点击批处理start.bat开始测试

    7. Monkey测试结果分析

    (1) Monkey finished

    打开monkey log,查看log的最下端,是否有类似以下字段:

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

    // Monkey finished

    这个字段表明本次的Monkey测试完成。

    (2) CRASH

    同样,在得到monkey log后,搜索”CRASH”字段,如果搜索到有结果,则表明有进程出现问题,测试不通过,需要结合logcat和dropbox(/data/system/dropbox/)日志分析出错原因。

    // CRASH: com.onekchi.downloadmanager (pid 12919)

    (3) ANR

    在monkey log中搜索该字段,如果有搜索有结果,则表示测试过程中,测试对象出现了无响应的现象,因此测试不通过,需要结合logcat和tombstone(/data/tombstones)日志分析出错原因。

    (4) Exception

    在monkey log中搜索该字段,如果有搜索有结果,则表示测试过程中,测试对象出现了异常,因而测试不通过,需要结合logcat日志分析出错原因。

  • 相关阅读:
    企业如何搭建数据分析平台
    如何查看Android设备上的分区信息
    从传统企业谈大数据的战略意义
    金融行业的BI应用分析
    Android 5.x 权限问题解决方法
    unity使用ugui自制调色面板
    手机模式及分区
    高通8x12平台开机画面制作工具
    Unity插件
    Android开发小问题集
  • 原文地址:https://www.cnblogs.com/fanfeng/p/11837230.html
Copyright © 2011-2022 走看看