一、monkey测试的定义
- Monkey 测试是通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对应用程序客户端的稳定性测试;
- 通俗来说,Monkey 测试即“猴子测试”,是指像猴子一样,不知道程序的任何用户交互方面的知识,就对界面进行无目的、乱点乱按的操作;
- Monkey 测试是一种为了测试软件的稳定性、健壮性的快速有效的方法;
- Monkey 程序是 Android 系统自带的,由 Java 语言写成,在 Android 文件系统中的存放路是:
/system/framework/monkey.jar; - Monkey.jar程序是通过Shell脚本来启动执行的,Shell脚本的存放路径在Android文件系统中:/system/bin/monkey;它的执行语句方式主要是:adb shell monkey {+命令参数}来进行Monkey测试。命令集可以通过{ adb shell monkey }来进行查看。
二、monkey测试前期准备
- 执行Monkey测试前,一定要确保屏幕处于解锁状态;
- 设置屏幕超时时间为最大时间(设置->显示->休眠->30分钟或者从不)。以防测试过程中手机锁屏,影响Monkey测试;
- 安装并配置好adb环境,打开usb调试,确保adb可以连接;
- 抓取log(monkey日志、系统日志、kernel日志等);
- 获取被测应用的包名。
三、monkey命令参数说明
格式:adb shell monkey + 行为参数 + “>” + {日志保存路径}
常规类命令
约束类命令
调试类命令
事件类命令
四、monkey日志分析整理
4.1 测试命令信息
此类信息流主要包括在monkey启动后输出的当前执行各种参数信息,其中主要包括:种子值(seed),事件数量,运行的应用列表,各种事件的百分比等。这部分日志信息解析主要如下所示:
// 测试命令信息
// 随机种子值,执行事件数量
:Monkey: seed=1617866276701 count=100000
// 可运行的应用列表
:AllowPackage: com.car300.activity
//Category 包含LAUNCHER 和MONKEY
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// 各事件的百分比
Event percentages:
// 触摸类事件占15%
0: 15.0% 事件0 :–pct-touch
// 手势类事件占10%
1: 10.0% 事件1 :–pct-motion
// 二指缩放类事件占2%
2: 2.0% 事件2 :–pct-pinchzoom
// 轨迹类事件占15%
3: 15.0% 事件3 :–pct-trackball
// 旋转类事件占0%
4: -0.0% 事件4 :–pct-rotation
// 基本导航类事件占25%
5: 25.0% 事件5 :–pct-nav
//主要导航栏类事件占15%
6: 15.0% 事件6 :–pct-majornav
//系统按键类事件占2%
7: 2.0% 事件7 :–pct-syskeys
//启动activity类事件占2%
8: 2.0% 事件8 :–pct-appswitch
//键盘类事件占1%
9: 1.0% 事件9 :–pct-flip
//其他事件类占13%
10: 13.0% 事件10 :–pct-anyevent
4.2 事件流信息
命令开始执行测试后,会依次输出相应执行的事件流信息,主要包括前面提到的事件。这部分日志信息解析主要如下所示:
// 执行的事件流信息
// 启动App 事件,或切换应用
:Switch:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.car300.activity/com.che300.toc.module.splash.SplashActivity;end
// 延时300毫秒(每一个事件之间的间隔时间)
Sleeping for 300 milliseconds
// 轨迹球事件(后面括号里面是表示点击的位置坐标)
:Sending Trackball (ACTION_MOVE) 0:(907.6482,501.939)
// 点击事件(后面括号里面是表示点击的位置坐标)
Sleeping for 300 milliseconds
:Sending Touch (ACTION_DOWN): 0:(338.0,676.0)
:Sending Touch (ACTION_UP): 0:(325.4063,658.7628)
// 按键输入事件
Sleeping for 300 milliseconds
:Sending Key (ACTION_DOWN): 135 // KEYCODE_F5
// 翻转屏幕事件
Sleeping for 300 milliseconds
:Sending rotation degree=3, persist=true
//其他事件
…
4.3 异常类型
a.程序无响应的问题:在日志中搜索“ANR”or“ANR Warning”;
b.异常问题:在日志中搜索“Exception”;
c.崩溃问题:在日志中搜索“crash”
Monkey在运行时输出信息包含一般四类,分别是测试命令信息、事件流信息、异常信息、执行结果信;
常见的异常类型
4.4 执行结果分析
当命令执行完所有事件后,会输出相应执行结果信息,其中包括执行的事件数量、旋转的角度、丢失等事件数量、网络状态以及 最终的执行结果。这部分日志信息解析主要如下所示:
// 执行的事件数量
Events injected: 100000
// 旋转的角度为0
:Sending rotation degree=0, persist=false
// 丢失的事件数量,按键0,提示0,轨迹球0,翻转0,旋转0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态,移动网络 0ms ,Wi-Fi 0ms ,无网 144ms
## Network stats: elapsed time=9947108ms (0ms mobile, 0ms wifi, 9947108ms not connected)
// Monkey finished
如果执行过程中出现了异常导致执行失败,会输出对应的执行失败的原因,比如第几个事件执行失败以及所使用的随机种子数。这部分日志信息解析主要如下所示:
// 显示Monkey 执行失败
*\ * Monkey aborted due to error.
// 执行的事件数量
Events injected: 8
// 旋转的角度为0
:Sending rotation degree=0, persist=false
// 丢失的事件数量,按键0,提示0,轨迹球0,翻转0,旋转0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态,移动网络 0ms,Wi-Fi 0ms,无网 405ms
## Network stats: elapsed time=405ms (0ms mobile, 0ms wifi, 405ms not connected)
// 提示在执行到第8 个事件时出现Crash ,以及所使用的随机种子值
** System appears to have crashed at event 8 of 10 using seed 1454215444564
备注:
1、在monkey日志结尾处,可以通过对比Events injected的数量与设置的事件数量是否相等,来判断monkey脚本执行成功或失败;
2、在检测网络状态信息中,数字+ms not connected,其中数字反应的是monkey测试执行的时间;
五、抓取系统log
若在monkey测试过程中,遇到一些问题或异常中,可以抓取系统日志来进行分析;一般,在测试前双击执行下面的bat脚本来获取系统log,之后再去运行monkey脚本。
bat脚本代码如下:
adb devices
rem make sure all devices have different serial number
@echo off
set serial=
set /p serial=Enter device serial or only enter:
if "%serial%"=="" (
set cmd_adb=adb
set cmd_fastboot=fastboot
) else (
set cmd_adb=adb -s %serial%
set cmd_fastboot=fastboot -s %serial%
)
:again
echo get root right
%cmd_adb% root
echo wait for device
%cmd_adb% wait-for-device
echo capture system log start at %date%_%time%
%cmd_adb% logcat tag:V -v time > system_%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%.txt
echo device disappeared, wait for device again
%cmd_adb% wait-for-device
goto again
pause