一、Monkey简介:
Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发送伪随机的用户事件流(点击、滑动、Application切换、横竖屏、应用关闭)实现对正在开发的应用程序进行压力测试。monkey测试是一种为了测试软件的稳定性,健壮性的快速有效的方法。只针对Activity做测试,不能对Service做测试。
二、质量要求:
三、Monkey命令参数:
1> -p
用于约束限制,用此参数指定一个或者多个包,指定包之后,monkey将只允许启动指定app,如果不指定包,monkey将启动系统中所有的app 。
2> -v
用于指定反馈的信息级别(日志的详细程度),分为三个级别,级别越高,日志越详细。
level 0:
例:monkey -p com.htc.weather -v 1000
3> -s
指定伪随机数生成器的seed值,如果seed相同,则两次monkey 测试产生的事件序列也相同。
4> --throttle(毫秒)
制定每个事件结束后的间隔时间,降低系统压力。(如果不指定系统会尽快的发送事件序列)
5> 定制事件
--pct-motion <percent> (滑动事件)
6>调试选项
--hprof:指定该项后在事件序列发送前后会立即生成分析报告 —— 一般建议指定该项。
--ignore-crashes:忽略崩溃
--ignore-timeouts:忽略超时
--ignore-security-exceptions:忽略安全异常
--kill-process-after-error:发生错误后直接杀掉进程
--monitor-native-crashes:跟踪本地方法的崩溃问题
--wait-dbg:知道连接了调试器才执行monkey测试。
对单独的APP进行测试
l monkey-p com.hst.che --throttle 500 -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000 >/mnt/sdcard/monkey1.txt
说明:
--throttle(毫秒)事件之间插入的固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定,Monkey将尽可能快的产生并执行事件。
-s 用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。
--ignore-crashes 忽略程序崩溃。设置此选项后,Monkey会执行完所有的事件,不会因crash而停止。
--ignore-timeouts 忽略程序无响应。设置此选项后,Monkey会执行完所有的事件,不会因ANR而停止。
--ignore-security-exceptions 忽略证书或认证异常。设置此选项后,Monkey会执行完所有的事件,不会因认证或证书异常而停止。
--ignore-native-crashes 监视系统中本地代码发生的崩溃
--monitor-native-crashes 忽略本地代码导致的崩溃。设置忽略后,Monkey将执行完所有的事件,不会因此停止。
-v -v –v 提供最详细的设置信息
四、使用示例:(本例测试环境Android studio+模拟器Nexus_5_API_23)
1>首先配置Android环境,要使用虚拟机测试的话,还要创建模拟器(真机测试就不用管)。
2>进入平台工具,我的platform-tools在下图所示路径
在Android studio自带的命令行(或者是cmd)里输入以下命令
3>启动模拟器(执行adb devices命令可以列出已连接的设备),安装待测试apk
先把apk放在platform-tools文件夹下,执行命令: adb install 文件名.apk
4>找到应用程序的主Activity所在的包名,分别执行以下命令:
ls命令执行之后从列出的包名中找到要测试的apk的主Activity的包名。
5>使用monkey进行自动化测试
五、测试结果分析:
1>
2>
3>
4>
5>测试完成,没有crash和exception出现的情况
6>测试中间出现crash或者exception,monkey停止会打印相关错误信息。
六、monkey测试停止条件(也可以在命令里设置出现这些停止条件后可以继续跑完测试数量)
1>如果先顶了Monkey运行在一个或几个特定的包上,那么它会检测试图转到它包的操作,并对其进行阻止;
2>如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错;
3>如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
通过多次并且不同设定下的Monkey测试才算它是一个稳定性和健壮性足够的程序。
七、为保证测试数量的完整进行,一般不会在发生错误时立刻退出压力测试。monkey 测试命令如下
八、把log导出到本地
这里分为两种情况:
1.如果我们没有进入到shell则直接执行命令:
adb shell monkey -p 包名 -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v -v 10000 > E:\monkey_log\test1.txt
2.
如果已经进入adb shell,正确的导出步骤:(在前边我们执行完adb shell命令之后,进入shell命令相当于进入Linux的root下面,没有权限在里面创建文件。)执行exit命令退出shell
然后执行adb shell monkey -p 包名 -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v -v 10000 > E:\monkey_log\test1.txt
分析log
l 日志开头:显示本次测试seed值,执行次数,测试包,
l 日志结尾:
如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间;Monkey finished代表执行完成。
(如果Monkey执行中断,在log的最后也能查看到当前已执行的次数。)
l 日志内容分析
一般测试结果分析-搜索关键字:
1.程序无响应,ANR问题:在日志中搜索“ANR”
2.崩溃问题:在日志中搜索“CRASH”
3.其他问题:在日志中搜索”Exception”
详细分析monkey日志
Switch--查看log中的Switch,主要是查看Monkey执行的是那一个Activity,两个swtich之间如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
Sleeping--Sleeping for 500 milliseconds这是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。
重现问题
Monkey测试出现错误后,一般的查错步骤为以下几步:
1.找到是monkey里面的哪个地方出错
2.查看Monkey里面出错前的一些事件动作,并手动执行该动作
3.若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样