1. Monkey 工具介绍
Monkey是Google提供的一个命令行工具,可运行在模拟器或实际设备中。它向系统发送伪随机的用户事件,模拟用户的按键输入、触摸屏输入、手势输入等,从而对正在运行的应用程序进行压力测试,目的是看设备多长时间会出现异常,并观察系统的稳定性和容错性能。
Monkey程序是Android系统自带的,其启动脚本是位于Android系统的/system/bin目录的Monkey文件,其jar包是位于Android系统的/system/framework目录的Monkey.jar文件。用户主要是通过adb命令来启动Monkey的,Monkey在运行时,会根据命令行参数的配置,生成伪
随机的事件流,并在Android设备上执行对应的测试事件。同时Monkey还会对测试系统进行监测,当出现以下三种情况时会进行特殊处理:
- 如限定了Monkey运行在特定包上,当监测到试图转到其他包的操作,将对其进行阻止。
- 如应用程序崩溃或接收到任何失控异常,Monkey将记录对应的错误日志,并根据命令行参数判断是停止运行还是继续运行。
- 如果应用程序发生了程序无响应(application not responding)的错误,Monkey将记录对应的错误日志,并根据命令行参数判断是停止运行还是继续运行。
- 按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。
2. Monkey参数
Monkey启动的命令行脚本为:
monkey [options] <count>
其中,options表示Monkey执行的可配置参数,是可选项(如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包);count表示Monkey执行的事件数,为必选项。
Options可简单划分为五类:
基本配置类参数、事件类型和频率参数、约束限制类参数、调试类参数、官方隐藏类参数。
2.1基本配置类参数
Monkey的基本配置类参数包括帮助参数和日志信息参数。帮助参数用于输出Monkey命令使用指导;日志信息参数将日志分三个级别,级别越高,日志的信息越详细。
2.2 事件类型和频率参数
Monkey的事件类参数的作用是对随机事件进行调控,从而使其遵照设定运行,如设置各种事件的百分比、设置事件生成所使用的种子值等。频率参数主要限制事件执行的时间间隔。
2.3 约束限制类参数
Monkey的约束限制类参数的作用是将随机事件运行的范围限制在一个或多个包或类中。
2.4 调试类参数
通过调试类命令,可以对Monkey进行一些简单的调试,可以快速定位Monkey执行过程中的一些问题。
2.5 官方隐藏类参数
3. Monkey运用
Monkey启动方式很简单:先连接被测手机到PC上,然后打开CMD命令行窗口输入对应的adb命令行即可。通过命令行启动Monkey有两种方式:
(1)直接PC启动
adb shell monkey [options] <count>
(2)Shell端启动
>adb shell
>monkey [options] <count>
这两者的区别是,通过PC端启动,Monkey运行日志可以保存在PC上;通过Shell端启动,Monkey运行日志可以保存在手机里。
注意 :Monkey启动后会不断地向被测对象发送随机事件流,直到事件执行完毕或者发生异常时才停止。在Monkey运行过程中,即便断开与PC的连接,Monkey依然可以在手机上继续运行。停止Monkey的方法是:直接杀掉手机上的Monkey进程。具体方法如下:
>adb shell ps |grep monkey#获取到com.android.commands.monkey的进程ID >adb shell kill pid
3.1 Monkey常规的稳定性测试
使用命令行做简单的稳定性测试
adb shell monkey -p com.xxx.xxx --pct-touch 40 --pct-motion 25 --pct-appswitch 10 --pct-rotation 5 -s 12358 --throttle 400 --ignore-crashes --ignore-timeouts -v 500000 > d:monkey.txt
3.2 自定义脚本的稳定性测试
常规Monkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景(执行固定的事件流),这时候就需要用到自定义脚本,Monkey支持执行用户自定义脚本的测试,用户只需要按照Monkey脚本的规范编写好脚本,存放到手机上,启动Monkey通过-f scriptfile参数调用脚本即可。
monkey.script
Monkey日志解析
Monkey日志解析
Monkey日志解析
Monkey日志解析
Monkey脚本常见API:
Monkey脚本只能通过坐标的方式来定位点击和移动事件的屏幕位置,这里就需要提前获取坐标信息。获取坐标信息的方法很多,最简单的方法就是打开手机中的开发人员选项,打开“显示指针位置”。随后,在屏幕上的每次操作,在导航栏上都会显示坐标信息。
脚本编写示例:
这里要测试的是应用宝App,测试的操作是打开应用宝,点击输入框,输入“yyb”,点击搜索。搜索完成后,点击返回键返回应用宝首页。
首先,将在本地编写需要的测试脚本命名为monkey.script
type= raw events count= 1 speed= 1.0 #表示开始执行下面所有的命令行 start data >> LaunchActivity(com.tencent.android.qqdownloader,com.tencent.assistantv2.activity.MainActivity) UserWait(2000) Tap(185,140,1000) UserWait(2000) #输入字符串yy DispatchString(yy) UserWait(2000) #点击搜索 Tap(1040,106,1000) UserWait(2000) DispatchPress(KEYCODE_BACK)
将脚本push到手机目录,执行脚本
adb push E: est_toolsmonkey.script /sdcard/
adb shell monkey -f /sdcard/monkey.script -v 1 > E: est_toolsmonkey_test.txt
4. monkey日志分析
通过以下命令行将标注流与错误流日志分开保存:
Monkey [option] <count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt
如果Monkey执行期间存在Crash(崩溃)或ANR(Application Not Responding,应用程序无响应),error.txt中会显示错误日志
Monkey运行时输出的日志一般包含四类信息,分别是测试命令信息、伪随机事件流信息、异常信息、Monkey执行结果信息。
1)测试命令信息
Monkey启动后会输出当前所执行命令的各种参数信息,其中包括种子(Seed)信息、事件数量、可运行的应用列表以及各事件百分比等。这些信息都是通过Monkey命令参数所指定的,这部分日志信息的解析如下:
//测试命令信息 //随机种子值,执行事件数量 :Monkey: seed=1454215444564 count=10 //可运行的应用列表 :AllowPackage: com.tencent.android.qqdownloader //Category包含LAUNCHER和MONKEY :IncludeCategory: android.intent.category.LAUNCHER :IncludeCategory: android.intent.category.MONKEY //各事件的百分比 // Event percentages: // 0: 15.0% 事件0:--pct-touch // 1: 10.0% 事件1:--pct-motion // 2: 2.0% 事件2:--pct-pinchzoom // 3: 15.0% 事件3:--pct-trackball // 4: -0.0% 事件4:--pct-rotation // 5: 25.0% 事件5:--pct-nav // 6: 15.0% 事件6:--pct-majornav // 7: 2.0% 事件7:--pct-syskeys // 8: 2.0% 事件8:--pct-appswitch // 9: 1.0% 事件9:--pct-flip // 10: 13.0% 事件10:--pct-anyevent
2)伪随机事件流信息
当Monkey开始执行测试后,会顺序输出执行的事件流信息,主要是前面提到的11大事件。这部分日志信息的解析,如下:
//执行的事件流信息 //启动App事件 :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.tencent.android.qqdownloader/com.tencent.assistant.activity.SplashActivity;end // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tencent.android.qqdownloader/com.tencent.assistant.activity.SplashActivity } in packagecom.tencent.android.qqdownloader //轨迹球事件 :Sending Trackball (ACTION_MOVE): 0:(4.0,2.0) //点击事件 :Sending Touch (ACTION_DOWN): 0:(387.0,1858.0) :Sending Touch (ACTION_UP): 0:(385.8215,1861.3011) //延时 Sleeping for 0 milliseconds…
3)异常信息
当Monkey执行过程中遇到错误时,会输出对应异常信息
//发送Crash的应用包名和pid // CRASH: com.tencent.android.qqdownloader (pid 912) //Crash的简要信息 // Short Msg: java.lang.ClassNotFoundException //Crash的详细信息 // Long Msg: java.lang.ClassNotFoundException: Didn't find class "com. qq.AppService.AstApp" on path DexPathList[[zip file "/data/app/com.tencent. android.qqdownloader-2.apk"],nativeLibraryDirectories[/data/app-lib/com. tencent.android.qqdownloader-2, /vendor/lib, /system/lib]] //机型和系统信息 // Build Label: Xiaomi/pisces/pisces:4.4.4/KTU84P/5.12.24:user/release-keys // Build Changelist: 5.12.24 // Build Time: 1450958964000 //Crash的详细日志 // java.lang.RuntimeException: Unable to instantiate application com. qq.AppService.AstApp: java.lan.ClassNotFoundException: Didn't find class "com. qq.AppService.AstApp" on path: DexPathList[[zip fil "/data/app/com.tencent. android.qqdownloader-2.apk"],nativeLibraryDirectories=[/data/app-lib/com. tecent.android.qqdownloader-2, /vendor/lib, /system/lib]] // at android.app.LoadedApk.makeApplication(LoadedApk.java:509) // at android.app.ActivityThread.access$1500(ActivityThread.java:138) // at dalvik.system.NativeStart.main(Native Method) // ... 11 more //
4)Monkey执行结果信息
当Monkey执行完所有事件后,会输出执行结果信息,其中包括执行的事件数量、旋转的角度、丢失的事件数量、网络状态以及Monkey最终的执行结果
//执行的事件数量 Events injected: 10 //旋转的角度为0 :Sending rotation degree=0, persist=false //丢失的事件数量 :Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0 //网络状态,移动网络联网0ms,Wi-Fi联网0ms,没联网144ms ## Network stats: elapsed time=144ms (0ms mobile, 0ms wifi, 144ms not connected) // Monkey finished
>>待续