Android(安卓)Monkey入门及使用
Monkey介绍
Monkey是由Android系统自带,基于Android设备的,模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常和Crash。
Monkey虽然可以根据一个指定的命令脚本发送按键消息,但不支持条件判断,也不支持读取待测界面的信息来执行验证操作。因此具有Monkey的随机性。这种随机给我们带来了一些困扰:
- 手机困在一个界面出不去,导致测试重点偏移
- 手机系统设置被调起,比如wifi被关掉,导致APP联网业务测不到
- 手机在跑Monkey的时候锁屏,导致无法操作了
- 手机跑Monkey时的运行状态无法查看比如内存
如何优化呢,可以在后面的文章中分析。
Monkey 前提
前提一:搭建Android SDK环境
因为monkey是Android SDK里自带的一个工具,因此搭建好adb环境是运行monkey的前提。
搭建的步骤可以参考这篇文章:https://blog.csdn.net/alice_tl/article/details/78363978
前提二:获取待测试APP的包名
获取APP包名的方式有多种,可以参考这篇文章:https://blog.csdn.net/alice_tl/article/details/87094030
Monkey 启动
Monkey程序在Android文件系统中的存放路径是:/system/framework/monkey.jar
Monkey.jar程序由一个名为monkey的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey
因此:
PC终端窗口:执行adb shell monkey {+命令参数}来进行Monkey测试
Android机或者模拟器上:执行monkey 命令,可以在Android机上安装Android终端模拟器
Monkey 命令
默认使用adb shell monkey -p 包名 次数来启动monkey
示例:adb shell monkey -p com.al.office 100
即:对com.al.office的包monkey随机运行一百次
可以通过参数控制测试的APP对象、每个随机操作之间的延迟时间、日志的详尽程度、以及随机数序列。
示例:adb shell monkey –p com.al.office –-throttle 100 –-pct-touch 50 –-pct-tracball 50 –v –v 1000
即:对com.al.office的包monkey执行1000次,其中触摸50%,
monkey的命令参数如下:
-p:允许的包名列表
用此参数指定一个或多个包之后,monkey将只允许系统启动指定的app。如果不指定包,monkey将允许系统启动设备中的所有app。
- 指定一个包:adb shell monkey -p 包名 100
- 指定多个包:adb shell monkey -p 包名1 –p包名2 100
-v:指定反馈信息级别,即日志的详细程度
总共分3个级别,分别对应的参数如下:
- 缺省值,仅提供启动提示、测试完成和最终结果等少量信息:adb shell monkey -p 包名 -v 100
- 提供较为详细的日志,包括每个发送到Activity的事件信息:adb shell monkey -p 包名 -v -v 100
- 最详细的日志,包括了测试中选中/未选中的Activity信息:adb shell monkey -p 包名 -v -v -v 100
-s:随机数种子
指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。
- monkey测试1:adb shell monkey -p 包名 –s 10 100
- monkey测试2:adb shell monkey -p 包名 –s 10 100
--throttle:毫秒
指定用户操作(即事件)间的时延,单位是毫秒;如果不指定这个参数,monkey会尽可能快的生成和发送消息。
- adb shell monkey -p 包名 --throttle 3000 100
随机事件类型
虽然monkey中输入的事件是随机产生的,但是可以指定输入事件类型的百分比,让其控制在我们需要的范围内。可以设定的事件类型有:
--pct-motion | 指定滑动事件的百分比 |
--pct-trackball | 指定轨迹球事件的百分比 |
--pct-nav | 指定导航事件中,up、down、left、right等事件的百分比 |
--pct-majornav | 指定导航事件中,back、menu等事件的百分比 |
--pct-syskeys | 指定系统按键的百分比,包括HOME、Back、音量等。 |
--pct-appswitch | 指定Activity之间切换的比例。 |
--pct-anyevent | 指定任意事件的百分比 |
Monkey 日志分析
正常情况,如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间。如图所示:
(base) alicedembp:~ alice$ adb shell monkey -p com.al.office --pct-motion 15 --pct-trackball 30 -v -v 10 >/Users/alice/Downloads/output.txt bash arg: -p bash arg: com.al.office bash arg: --pct-motion bash arg: 15 bash arg: --pct-trackball bash arg: 30 bash arg: -v bash arg: -v bash arg: 10args: [-p, com.al.office, --pct-motion, 15, --pct-trackball, 30, -v, -v, 10] arg: "-p" arg: "com.al.office" arg: "--pct-motion" arg: "15" arg: "--pct-trackball" arg: "30" arg: "-v" arg: "-v" arg: "10"data="com.al.office"arg="--pct-motion" mCurArgData="null" mNextArg=3 argwas="--pct-motion" nextarg="15"data="15"arg="--pct-trackball" mCurArgData="null" mNextArg=5 argwas="--pct-trackball" nextarg="30"data="30":Monkey: seed=1558282689229 count=10:AllowPackage: com.al.office:IncludeCategory: android.intent.category.LAUNCHER:IncludeCategory: android.intent.category.MONKEY// Selecting main activities from category android.intent.category.LAUNCHER// + Using main activity com.al.fstandard.activity.SplashActivity (from package com.al.office)// Selecting main activities from category android.intent.category.MONKEY// Seeded: 1558282689229// Event percentages:// 0: 11.0%// 1: 15.0%// 2: 1.4666667%// 3: 30.0%// 4: -0.0%// 5: -0.0%// 6: 18.333334%// 7: 11.0%// 8: 1.4666667%// 9: 1.4666667%// 10: 0.73333335%// 11: 9.533334%:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.al.office/com.al.fstandard.activity.SplashActivity;end // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.al.office/com.al.fstandard.activity.SplashActivity } in package com.al.officeSleeping for 0 milliseconds:Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT:Sending Key (ACTION_UP): 21 // KEYCODE_DPAD_LEFTSleeping for 0 milliseconds:Sending Trackball (ACTION_MOVE): 0:(-3.0,3.0):Sending Trackball (ACTION_MOVE): 0:(4.0,-1.0):Sending Trackball (ACTION_MOVE): 0:(0.0,-1.0):Sending Trackball (ACTION_MOVE): 0:(-1.0,4.0):Sending Trackball (ACTION_MOVE): 0:(-3.0,-2.0):Sending Trackball (ACTION_MOVE): 0:(2.0,-4.0):Sending Trackball (ACTION_MOVE): 0:(-1.0,0.0)Events injected: 10:Sending rotation degree=0, persist=false:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0## Network stats: elapsed time=19ms (0ms mobile, 0ms wifi, 19ms not connected)// Monkey finished
Monkey finished 代表执行完成
这时查看 >/Users/alice/Downloads/output.txt 文件中已经有日志了~,即使Monkey 执行中断, 在log最后也能看到当前执行次数
测试结果分析:
- ANR问题(程序无响应):在日志中搜索“ANR"(application no response)
- 闪退问题:在日志中搜索"crash"
- 异常:搜索"Exception",如果出现空指针,"NullPointerException"肯定是有bug
- 强制退出:搜索"force closed"
更多相关文章
- Git使用规范 Android(安卓)版
- Android开发实战之——ProgressDialog的使用(一)
- EventBus源码详解(一):基本使用
- Android添加appcompat_v7包
- 小猪浅谈Android屏幕适配
- Android滑动冲突的完美解决方案
- Android(安卓)activity简单的跳转
- 浅谈android view事件分发机制
- Android(安卓)事件传递机制的理解