[android]monkey

Posted TesterQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[android]monkey相关的知识,希望对你有一定的参考价值。

Monkey是一种Google提供的android平台自动化测试工具,通过模拟用户触摸屏幕、滑动、点击、按键等操作来对设备上的程序进行压力测试,检测程序是否会发生异常。

1. Monkey测试特点

Monkey测试的特点主要有以下几点:

  • 可对测试的对象、事件数量、类型、频率、时间等进行设置;

  • Monky中各种动作使用的事件流是预定义好的,不支持自定义,但可以二次开发;

  • 采用了随机测试法,不能测试业务功能

2. Monkey常用命令参数

  • -help: 列出帮助

adb shell monkey --help
usagemonkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
              [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
              [--ignore-crashes] [--ignore-timeouts]
              [--ignore-security-exceptions]
              [--monitor-native-crashes] [--ignore-native-crashes]
              [--kill-process-after-error] [--hprof]
              [--pct-touch PERCENT] [--pct-motion PERCENT]
              [--pct-trackball PERCENT] [--pct-syskeys PERCENT]
              [--pct-nav PERCENT] [--pct-majornav PERCENT]
              [--pct-appswitch PERCENT] [--pct-flip PERCENT]
              [--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
              [--pct-permission PERCENT]
              [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
              [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
              [--wait-dbg] [--dbg-no-events]
              [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
              [--port port]
              [-s SEED] [-v [-v] ...]
              [--throttle MILLISEC] [--randomize-throttle]
              [--profile-wait MILLISEC]
              [--device-sleep-time MILLISEC]
              [--randomize-script]
              [--script-log]
              [--bugreport]
              [--periodic-bugreport]
              [--permission-target-system]
              COUNT

adb shell monkey -p <包名> -v 1000 1>info.txt 2>error.txt
adb shell monkey -p <包名> -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -vvv 500
  • -v: 将增加反馈信息的详细级别。
    Level0(默认),除了启动、测试完成和最终结果外只提供较少的信息。
    Level1,提供了较为详细的测试信息,如逐个发送到Activity的事件信息。
    Level2,提供了更多的设置信息,如测试中选中或未选中的Activity信息。

adb shell monkey -v 10
adb shell monkey -vvv 10
  • -s

    : 伪随机数生成器的seed值。如果用相同的seed值再次运行monkey,将生成相同的事件序列。
adb shell monkey -s 12345 -v 10
  • --throttle

    : 常用参数,在事件之间插入固定的时间(毫秒)延迟,减缓Monkey的运行速度,一般设置为300毫秒,不指定则事件之间将没有延迟,以最快的速度生成。
adb shell monkey –throttle 300 -v 10
  • -p

    :指定允许访问的包,如果不指定任何包,Monkey将允许系统启动所有包的Activity。可以使用多个-p指定多个包
  • -c

    : 指定一个或多个类别,Monkey将只启动这些指定类别中的Activity。默认情况下Monkey将选择Intent.CATEGORY_LAUNCHER和Intent.CATEGORY_MONKEY类别中列出的Activity,。指定多个类别使用多个-c,每个-c指定一个类别:
adb shell monkey -c android.intent.category.HOME   -v 999
1. CATEGORY_DEFAULT:普通Activity
2. CATEGORY_HOME:Home Activity
3. CATEGORY_PREFERENCE:Preference。 
4. CATEGORY_LAUNCHER:优先级最高的Activity,通常为入口 
5. CATEGORY_BROWSABLE:可以使用浏览器启动的组件 
6. CATEGORY_GADGET:可以内嵌到另外的Activity中的组件
  • --ignore-crashes: 忽略崩溃,当应用程序崩溃或发生失控异常时,monkey将继续运行直到计数完成。如果不设置此项,monkey遇到上述崩溃或异常将停止运行。

  • --ignore-timeouts:忽略超时,当应用程序发生任何超时错误(如ANR,即Application Not Responding)时,monkey将继续运行直到计数完成。如果不设置此项,monkey 遇到此类超时将停止运行。

  • --ignore-security-exception:忽略安全异常,当程序发生许可错误(例如启动一些需要许可的Activity)导致的异常时,Monkey将停止运行。设置此项,Monkey将继续发送事件给系统,直到事件计数完成。

  • --kill-process-after-error:通知系统停止发生错误的进程

  • --monitor-native-crashes:监视并报告Andorid系统中本地代码的崩溃事件。如果设置–kill-process-after-error,系统将停止运行。

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

  • --hprof: 生成性能报告

3. 动作

monkey中的动作由若干事件组成,包括MotionEvent和KeyEvent(见后)等,monkey参数中预定义了一些动作,通过调整各事件的百分比,可以模拟多种动作,这些动作其分配的百分比之和为100%

#可以通过input命令模拟各种事件
> adb shell input
Usage: input [<source>] <command> [<arg>...]
The sources are:
      keyboard(键盘)
      mouse(鼠标,单点)
      joystick(操纵杆)
      touchnavigation
      touchpad(触摸板)
      trackball(老式手机滚动球)
      dpad(老式手机方向键)
      stylus(手写笔)
      gamepad(游戏手柄)
      touchscreen(触摸屏,多点)
The commands and default sources are:
      text <string> (Default: touchscreen)
      keyevent [--longpress] <key code number or name> ... (Default: keyboard)
      tap <x> <y> (Default: touchscreen)
      swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
      press (Default: trackball)
      roll <dx> <dy> (Default: trackball)

# 3是Home键
adb shell input keyevent 3

# monkey可以指定动作的百分比,每一个动作由若干事件组成
> adb shell monkey -–pct-touch 100
  • monkey动作

  • MotionEvent:手势事件

    1. ACTION_DOWN:当屏幕检测到第一个触点按下之后就会触发到这个事件。

    2. ACTION_MOVE:当触点在屏幕上移动时触发,触点在屏幕上停留也是会触发的,主要是由于它的灵敏度很高,而我们的手指又不可能完全静止(即使我们感觉不到移动,但其实我们的手指也在不停地抖动)。

    3. ACTION_POINTER_DOWN:当屏幕上已经有触点处于按下的状态的时候,再有新的触点被按下时触发。

    4. ACTION_POINTER_UP:当屏幕上有多个点被按住,松开其中一个点时触发(即非最后一个点被放开时)触发。

    5. ACTION_UP:当触点松开时被触发。

    6. ACTION_OUTSIDE: 表示用户触碰超出了正常的UI边界.

    7. ACTION_SCROLL:android3.1引入,非触摸滚动,主要是由鼠标、滚轮、轨迹球触发。

    8. ACTION_CANCEL:不是由用户直接触发,由系统在需要的时候触发

  • KeyEvent:由物理按键或者软键盘上按键触发,比如:Home键、Back键、菜单键、静音键、音量键,各种字母、数字、标点符号键等。默认3键:

    1. KEYCODE_BACK(4)

    2. KEYCODE_HOME(3)

    3. KEYCODE_APP_SWITCH(187): app切换

4. 常见问题

  • ANR问题(程序无响应):在日志中搜索“ANR"(application no response)

  • E问题:在日志中搜索"CRASH"

  • 异常:搜索"Exception"

  • 强制退出:搜索"Force stopping"

5. 通过monkey日志分析问题

  1. 找到日志中出现错误的地方

  2. 查看错误堆栈,定位错误发生的地方

  3. 如果步骤2不能定位错误,则查看出错前的一些事件动作,并手动执行该动作

  4. 若步骤3还不能定位到问题,可以使用之前执行monkey命令,再执行一遍,注意使用相同的seed

通过logcat日志分析问题

  • 内存溢出:搜索关键词GC,如果看到GC的Reason为Alloc,说明即将出现OOM错误,可能存在内存溢出。

  • 内存泄漏:看到大量的GC的记录,并且Heap stats信息中的(对象数/堆的空间)的数值不断增长,没有变小的趋势。那么应用很有可能存在内存泄漏。

  • ANR以及CRASH/ForceClosed等异常退出问题

    1. 如果是ANR问题, 则搜索"ANR"关键词

    2. 如果是ForceClosed和其它异常退出信息,则搜索"Fatal"关键词

    3. 定位到关键事件信息后,如果信息不够明确的,再去搜索应用程序包的虚拟机信息,查看具体的进程和线程跟踪的日志,来定位到代码 。


以上是关于[android]monkey的主要内容,如果未能解决你的问题,请参考以下文章

Android Monkey测试入门(摘)

android测试monkey啥意思

Android Monkey 介绍

Android命令Monkey压力测试,详解

Android Monkey

Android Monkey 压力测试 介绍