[android]monkey
Posted TesterQ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[android]monkey相关的知识,希望对你有一定的参考价值。
Monkey是一种Google提供的android平台自动化测试工具,通过模拟用户触摸屏幕、滑动、点击、按键等操作来对设备上的程序进行压力测试,检测程序是否会发生异常。
1. Monkey测试特点
Monkey测试的特点主要有以下几点:
可对测试的对象、事件数量、类型、频率、时间等进行设置;
Monky中各种动作使用的事件流是预定义好的,不支持自定义,但可以二次开发;
采用了随机测试法,不能测试业务功能
2. Monkey常用命令参数
-help: 列出帮助
> adb shell monkey --help
usage: monkey [-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:手势事件
ACTION_DOWN:当屏幕检测到第一个触点按下之后就会触发到这个事件。
ACTION_MOVE:当触点在屏幕上移动时触发,触点在屏幕上停留也是会触发的,主要是由于它的灵敏度很高,而我们的手指又不可能完全静止(即使我们感觉不到移动,但其实我们的手指也在不停地抖动)。
ACTION_POINTER_DOWN:当屏幕上已经有触点处于按下的状态的时候,再有新的触点被按下时触发。
ACTION_POINTER_UP:当屏幕上有多个点被按住,松开其中一个点时触发(即非最后一个点被放开时)触发。
ACTION_UP:当触点松开时被触发。
ACTION_OUTSIDE: 表示用户触碰超出了正常的UI边界.
ACTION_SCROLL:android3.1引入,非触摸滚动,主要是由鼠标、滚轮、轨迹球触发。
ACTION_CANCEL:不是由用户直接触发,由系统在需要的时候触发
KeyEvent:由物理按键或者软键盘上按键触发,比如:Home键、Back键、菜单键、静音键、音量键,各种字母、数字、标点符号键等。默认3键:
KEYCODE_BACK(4)
KEYCODE_HOME(3)
KEYCODE_APP_SWITCH(187): app切换
4. 常见问题
ANR问题(程序无响应):在日志中搜索“ANR"(application no response)
E问题:在日志中搜索"CRASH"
异常:搜索"Exception"
强制退出:搜索"Force stopping"
5. 通过monkey日志分析问题
找到日志中出现错误的地方
查看错误堆栈,定位错误发生的地方
如果步骤2不能定位错误,则查看出错前的一些事件动作,并手动执行该动作
若步骤3还不能定位到问题,可以使用之前执行monkey命令,再执行一遍,注意使用相同的seed
通过logcat日志分析问题
内存溢出:搜索关键词GC,如果看到GC的Reason为Alloc,说明即将出现OOM错误,可能存在内存溢出。
内存泄漏:看到大量的GC的记录,并且Heap stats信息中的(对象数/堆的空间)的数值不断增长,没有变小的趋势。那么应用很有可能存在内存泄漏。
ANR以及CRASH/ForceClosed等异常退出问题
如果是ANR问题, 则搜索"ANR"关键词
如果是ForceClosed和其它异常退出信息,则搜索"Fatal"关键词
定位到关键事件信息后,如果信息不够明确的,再去搜索应用程序包的虚拟机信息,查看具体的进程和线程跟踪的日志,来定位到代码 。
以上是关于[android]monkey的主要内容,如果未能解决你的问题,请参考以下文章