zoukankan      html  css  js  c++  java
  • Android自动化测试之Monkey 转自:LupuX

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011436666/article/details/53998332

    在之前的文章Android自动化测试之Monkey中我们了解过了Monkey的4大类命令和基本使用,当我们运行Monkey之后,我们会发现它的日志输出是很有规律的,因此很有必要对Monkey事件及其输出日志做一个了解。

    1、Monkey事件

    Monkey事件是用来模拟用户的常规操作的,对手机进行稳定性测试,主要可以分为11大类事件。

    注意:以下的pct前面是两个连在一起的中划线- -,网页上显示在了一起。

    1、触摸事件

    是指在屏幕的点击事件,按下并抬起的操作,由一个ACTION_DOWN–>一个ACTION_UP组成。可通过–pct-touch参数来配置此事件的比例,我们可以从运行Monkey后输出的log看到:

    :Sending Touch (ACTION_DOWN): 0:(657.0,287.0)
    :Sending Touch (ACTION_UP): 0:(662.1641,290.94638)

     

    2、手势事件

    在屏幕的某处按下、随机滑动、抬起的事件,由一个ACTION_DOWN–>多个ACTION_MOVE–>一个ACTION_UP组成。实际上是一个直线滑动操作。可通过–pct-motion来配置其百分比。

    :Sending Touch (ACTION_DOWN): 0:(111.0,898.0)
    :Sending Touch (ACTION_MOVE): 0:(107.93105,888.1464)
    :Sending Touch (ACTION_MOVE): 0:(106.85465,885.9339)
    :Sending Touch (ACTION_MOVE): 0:(104.74859,881.0618)
    :Sending Touch (ACTION_MOVE): 0:(103.88795,880.0649)
    :Sending Touch (ACTION_MOVE): 0:(103.34122,874.6459)
    :Sending Touch (ACTION_UP): 0:(102.85543,864.8377)

     

    3、二指缩放事件

    此事件是指双指在屏幕同时按下,并滑动,最后在抬起,最常用的如图库中查看图片时的双指缩放操作。由一个ACTION_DOWN&ACTION_POINTER_DOWN–>多个ACTION_MOVE–>一个ACTION_UP&ACTION_POINTER_UP组成。可通过–pct-pinchzoom参数来配置此事件的百分比。

    :Sending Touch (ACTION_DOWN): 0:(501.0,466.0)
    :Sending Touch (ACTION_POINTER_DOWN 1): 0:(496.17197,465.6653) 1:(217.0,144.0)
    :Sending Touch (ACTION_MOVE): 0:(495.73535,463.35156) 1:(209.00148,146.82776)
    :Sending Touch (ACTION_MOVE): 0:(485.36288,461.93683) 1:(203.72124,151.1682)
    :Sending Touch (ACTION_MOVE): 0:(471.66867,459.6027) 1:(186.45467,155.50856)
    :Sending Touch (ACTION_POINTER_UP 1): 0:(443.38687,451.881) 1:(143.06265,161.267)
    :Sending Touch (ACTION_UP): 0:(438.07867,448.4626)

     

    4、轨迹事件

    轨迹球在现在的手机上已经没有了,但我们仍可以用此事件来模拟曲线滑动操作。通过–pct-trackball参数来配置其事件百分比。

    :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,0.0)

     

    5、屏幕旋转事件

    模拟手机的横竖屏操作,可通过–pct-rotation参数来配置其比例。由一个rotation事件组成,degree表示的是旋转方向,顺时针方向,0表示90度的方向,1-180度、2-270度方向、3-360度方向。

    :Sending rotation degree=0, persist=false
    :Sending rotation degree=3, persist=true

     

    6、基本导航事件

    基本导航事件是指上下左右按键的操作,在几年前的智能机上很常见,现在很少见了。由一个Key的ACTION_DOWN和ACTION_UP组成。可以用–pct-nav参数来配置其百分比。

    :Sending Key (ACTION_DOWN): 19    // KEYCODE_DPAD_UP
    :Sending Key (ACTION_UP): 19    // KEYCODE_DPAD_UP
    :Sending Key (ACTION_DOWN): 20    // KEYCODE_DPAD_DOWN
    :Sending Key (ACTION_UP): 20    // KEYCODE_DPAD_DOWN
    :Sending Key (ACTION_DOWN): 21    // KEYCODE_DPAD_LEFT
    :Sending Key (ACTION_UP): 21    // KEYCODE_DPAD_LEFT
    :Sending Key (ACTION_DOWN): 22    // KEYCODE_DPAD_RIGHT
    :Sending Key (ACTION_UP): 22    // KEYCODE_DPAD_RIGHT

     

    7、主要导航事件

    和基本导航事件不同的是,主要导航事件通常会导致UI界面发生变化,如5键按钮中的中间件、Back Key、Menu Key等。通过–pct-majornav来配置其百分比。

    :Sending Key (ACTION_DOWN): 23    // KEYCODE_DPAD_CENTER
    :Sending Key (ACTION_UP): 23    // KEYCODE_DPAD_CENTER

     

    8、系统按键事件

    系统保留的按键,如Home键、音量键等。可通过–pct-syskeys参数来配置其百分比。

    :Sending Key (ACTION_DOWN): 3    // KEYCODE_HOME
    :Sending Key (ACTION_UP): 3    // KEYCODE_HOME
    :Sending Key (ACTION_DOWN): 24    // KEYCODE_VOLUME_UP
    :Sending Key (ACTION_UP): 24    // KEYCODE_VOLUME_UP

     

    我们很容易发现几种按键事件都是通过Sending Key这个“方法”来发送的, 在其后加上ACTION和Key_Code即可

    9、启动Activity事件

    在手机上启动一个Activity的操作,在随机的时间间隔内Monkey将执行一个startActivity方法,最大限度上覆盖被测包中的全部Activity。可通过–pct-appswitch参数来配置其事件百分比。

    :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.youdao.dict/.activity.LaunchActivity;end
        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.youdao.dict/.activity.LaunchActivity } in package com.youdao.dict     

     

    10、键盘事件

    主要是一些与键盘有关的操作,比图点击输入框键盘弹起、点击其他区域收起键盘灯。可通过–pct-flip参数来配置其事件百分比。

    :Sending Flip keyboardOpen=false

     

    11、其他类型事件

    包括上面10种事件以外的其他所有事件,如具体的数字、字母按键等。现在的手机很少带有全键盘,所以用的并不多。通过–pct-anyevent参数来配置其百分比。

    :Sending Key (ACTION_DOWN): 201    // KEYCODE_BUTTON_14
    :Sending Key (ACTION_UP): 201    // KEYCODE_BUTTON_14
    :Sending Key (ACTION_DOWN): 51    // KEYCODE_W
    :Sending Key (ACTION_UP): 51    // KEYCODE_W

     

    2、Monkey日志分析

    之前的文章提到过,保存日志的方式有三种:

    1. 保存在PC中: adb shell monkey [options] < count> > d:monkey.txt

    2. 保存在手机中:

      • adb shell
      • monkey [options] < count> > /sdcard/monkey.txt
    3. 运行日志和异常日志分开存放: monkey [options] < count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt

    通过分析Monkey运行时输出的日志可以知道其一般分为4类信息,测试命令、伪随机事件、异常信息、Monkey执行结果信息。

    1、测试命令信息

    当前所执行命令的各种参数信息,包括种子、事件数量、应用列表、各事件的百分比等等。部分代码清单如下:

    //测试命令信息
    //种子值和执行事件数量
    :Monkey: seed=1234567 count=1000
    //允许的应用列表
    :AllowPackage: fm.qingting.qtradio
    :AllowPackage: com.youdao.dict
    :AllowPackage: me.ele
    :IncludeCategory: android.intent.category.LAUNCHER
    :IncludeCategory: android.intent.category.MONKEY
    // Selecting main activities from category android.intent.category.LAUNCHER
    //   + Using main activity com.youdao.dict.activity.LaunchActivity (from package com.youdao.dict)
    //   + Using main activity me.ele.Launcher (from package me.ele)
    //   + Using main activity fm.qingting.qtradio.WelcomeActivity (from package fm.qingting.qtradio)
    // Selecting main activities from category android.intent.category.MONKEY
    // Seeded: 1234567
    //各事件的百分比
    // 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%

     

    2、伪随机事件流信息

    Monkey开始执行测试后,会顺序的输出执行的事件流信息,即本篇开始的讲到的11大事件。部分代码清单如下:

    //执行的事件流信息
    //启动APP事件
    :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.youdao.dict/.activity.LaunchActivity;end
        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.youdao.dict/.activity.LaunchActivity } in package com.youdao.dict
        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.youdao.dict/.activity.LaunchActivity } in package com.youdao.dict
    //延时
    Sleeping for 200 milliseconds
    //导航按键事件
    :Sending Key (ACTION_DOWN): 22    // KEYCODE_DPAD_RIGHT
    //还有其他各种事件
    ...

    3、异常信息

    在此,举一个native crash的例子给大家看看,部分代码如下。当然,还有应用层面的Crash、ANR等各种异常信息。

    //发生Crash的应用包名和pid
    // CRASH: fm.qingting.qtradio (pid 20487)
    //Crash的简要信息
    // Short Msg: Native crash
    //Crash的详细信息
    // Long Msg: Native crash: Aborted
    //机型和系统信息
    // Build Label: Xiaomi/dior/dior:4.4.4/KTU84P/6.12.29:user/release-keys
    // Build Changelist: 6.12.29
    // Build Time: 1482861145000
    // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    // Build fingerprint: 'Xiaomi/dior/dior:4.4.4/KTU84P/6.12.29:user/release-keys'
    // Revision: '0'
    // pid: 20487, tid: 20487, name: ingting.qtradio  >>> fm.qingting.qtradio <<<
    //Crash的详细日志
    // signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
    //     r0 00000000  r1 00005007  r2 00000006  r3 00000000
    //     r4 00000006  r5 0000000b  r6 00005007  r7 0000010c
    //     r8 60350e98  r9 577a6508  sl 57734830  fp 577a6378
    //     ip 40160398  sp beda6828  lr 401251d1  pc 4013412c  cpsr 00030010
    //     d0  732e6b69766c6164  d1  614e2e6d65747379
    ...

    4、Monkey执行结果信息

    执行成功时的结果信息:

    Events injected: 1000
    :Sending rotation degree=0, persist=false
    :Dropped: keys=2 pointers=85 trackballs=0 flips=0 rotations=0
    ## Network stats: elapsed time=79214ms (0ms mobile, 0ms wifi, 79214ms not connected)
    // Monkey finished

     

    执行失败时的结果信息:

    //显示Monkey执行失败
    ** Monkey aborted due to error.
    //执行的事件数量
    Events injected: 730
    //旋转角度为0
    :Sending rotation degree=0, persist=false
    //丢失的事件数量
    :Dropped: keys=0 pointers=1 trackballs=0 flips=0 rotations=0
    //网络状况
    ## Network stats: elapsed time=45652ms (0ms mobile, 0ms wifi, 45652ms not connected)
    //提示在执行到730个事件时出现Crash,及使用的seed
    ** System appears to have crashed at event 730 of 1000 using seed 1234567
    

     

    3、使用adb命令,获取更多信息

    很多时候,测试除了想知道执行过程是否有异常,还需要获取执行过程中的一些详细数据和性能信息,这时候monkey自带的log就不能满足我们的要求了。我们可以使用一些adb命令来获取更多的信息,比如:

    • 获取logcat日志信息:
      • adb shell logcat -v time > log.txt
    • 获取内存信息:
      • adb shell dumpsys meminfo <进程名>
    • 获取CPU消耗信息:
      • adb shell top -n 1 | find “进程名”
    • 获取电量信息:
      • adb shell dumpsys battery
    • 获取GPU信息:
      • adb shell dumpsys grcxinfo <进程名>
    • 获取流量信息:
      • adb shell cat/proc/uid_stat/< app uid>/tcp_rcv

    如何得到app uid?可分为以下两步:

    1. 查看被测app的进程ID(pid)
      adb shell ps | grep <被测应用名>
    2. 查看用户ID(uid)
      adb shell cat /proc/$pid/status

    通过以上对Monkey事件的解释和执行日志的分析,想必我们已经可以流畅的使用Monkey来进行测试了。但是仍然有很多的限制,比如无法截图、在测试的过程中如何确保网络一直在连接状态等等。这些较为深入的问题就需要我们阅读其源码并进行一些定制了。

  • 相关阅读:
    EventBus (四) Sticky事件
    EventBus (三) 源码解析 带你深入理解EventBus
    EventBus (二) 使用详解——EventBus使用进阶
    EventBus (一) 使用详解——初步使用EventBus
    Android布局优化之ViewStub、include、merge使用与源码分析
    Android API 中文(14) —— ViewStub
    ViewStub用法
    FaceBook推出的Android图片加载库-Fresco
    WinForm打印之页边距
    带参数的多线程的方式
  • 原文地址:https://www.cnblogs.com/lixy-88428977/p/9566218.html
Copyright © 2011-2022 走看看