Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件稳定性、健壮性的快速有效的方法。下面我将对自己已知的monkey进行整理,方便以后的学习以及巩固。
Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar。Monkey.jar程序是由一个名为“monkey”的shell脚本来启动执行,shell脚本在Android文件系统中的存放路是:/system/bin/monkey;
在进行monkey使用前,我们需要安装及配置安卓环境,前面的文章中介绍我这里不做细说。
之后就是对monkey 的使用,只需要在windows命令窗口中数据命令:adb shell monkey -v -p com.package.name 500 点击回车就可以对指定的程序:com.package.name(这里是你要测试APP的包名)进行500个随机事件 从而达到测试目的,下面我将对相关的一下常用参数进行整理及解释,来满足我们monkey命令的定制化。
-v {0,1,2}三级,-v越多,反馈信息更详细
-s 伪随机数生成器
–throttle 延迟执行速度,缺省则尽快
–pct-touch <%> down-up事件百分比
–pct-motion <%> down-[伪随机事件]-up
–pct-trackball <%> 轨迹事件百分比, 轨迹事件为move,有时伴有点击
–pct-nav <%> 基本导航事件百分比,上下左右
–pct-majornav <%> 主要导航事件的百分比,5-way的中间按键,回退,菜单等
–pct-syskeys <%> 系统按键事件的百分比
–pct-appswitch <%> 启动activity的百分比
–pct-anyevent <%> 其它事件的百分比
-p 指定启动包下面的activity (可以为多个)
运行的过程中就会命令窗口就会一直保持,直到运行完成。基本上一个简单的monkey就算完成了,是不是觉得很简单。在做完简单的monkey测试后,我们将去思考我们为什么要去做这个测试。是为了测试软件的稳定性,那如何判断他有足够的稳定性,如果出现问题我们将如何去定位问题,那问题来了:如何定位测试过程中出现的一系列问题。
在运行中可能会发现出现了相关错误:SYS_KEYS has no physical keys but with factor 2.0% 需要在运行命令中加入:--pct-syskeys 0 即可 如:adb shell monkey -v -p com.package.name --pct-syskeys 0 500
运行过程会很快,我们可以通过:--throttle 进行设定,我们为了过程简单就不设定了
首先我们要做的就是记录日志,只有我们知道了在那里出的错,我们才能找到原因。我们可以使用命令:adb shell monkey -v -p com.package.name --pct-syskeys 0 500 > D:\monkeytest.txt 这样我们就可以将这个日志文件打开来进行问题的一些定位。
打开之后我们需要去读取文件中的信息,下面我会将日志中的一下信息进行解读:
第一行::Monkey: seed=1516353665423 count=500 伪随机码(可以通过这个随机码进行问题的复现)+模拟事件次数
第二行::AllowPackage: com.tencent.wecarnavi 我们需要测试的包名
第三行-第四行 默认Activity类型 是由于Activity没有设定(可以通过-c 进行设定,这里不做多的说明)
下面一段// 的是执行各动作的百分比,可以在命令中分别进行设定
:Switch: 标签后面是找到了程序启动的Activity并成功启动(如果出现问题可以进行问题定位)
:Sending Touch (ACTION_DOWN): :Sending Touch (ACTION_UP): 代表执行了一个点击事件
:Sending Trackball (ACTION_MOVE): 代表执行了一个滑动事件
Events injected: 代表执行次数(monkey中断也会有,可以用以判断是否有异常)
elapsed time= 代表执行事件(单位毫秒)
// Monkey finished 代表执行完成
通过上面的了解,发现这个monkey测试需要人在旁看着不然程序发送错误会导致异常停止。那我们就有出现了两个需要面对的问题:1.如何重现或者找到这个问题;2.如何将这些情况进行一个规避呢?
先说第一个:如何复现该问题
1.找到问题:在日志中搜索“ANR”"CRASH"“Exception”字样
2.手工重复一下错误之前的事件动作
3.如重复步骤无法找出可通过设定seed 的值再次执行monkey,如不能复现该问题属于偶先问题
之后将会列出几个规避的参数来增加monkey的健壮性:
--ignore-crashes 通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。
--ignore-timeouts 通常,当应用程序发生任何超时错误(如“ApplicationNot Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。
--ignore-security-exceptions 通常,当应用程序发生许可错误(如启动一个需要某些许可的Activity)时,Monkey将停止运行。如果设置了此选项,Monkey将继续向系统发送事件,直到计数完成。
--kill-process-after-error 通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态
--monitor-native-crashes 监视并报告Android系统中本地代码的崩溃事件。如果设置了--kill-process-after-error,系统将停止运行。
到这里就完成了monkey的基础工作,之后的文章中会介绍通过.bat 脚本来完成:日志收集;日志自动化分析等操作。