一、monkey概念的详细介绍
Monkey是Android系统自带的一个程序,可以用于APP的稳定性测试,压力测试;
Monkey启动脚本存储于Android的/system/bin目录下,jar包在/system/framework下
monkey测试主要通过adb命令行进行,根据参数设置生成随机事件流(可以通过脚本设定事件过程),在测试过程中,可以监测手机,发生异常时会进行处理.。
APP出现异常主要分为两类:
①ANR(Application Not Responding):指系统检测APP5秒内没有响应输入的事件或者广播在10秒内没有执行完毕则抛出无响应提示。一般会弹窗提示,应该都见过这类弹窗
②Crash:就是常说的闪退,应用就直接崩溃了。退回到桌面。
二、monkey命令
1.命令行脚本:
monkey [option]
option:可选项配置参数,不指定的话就以无反馈模式启动,随机事件发送给手机安装的全部包
count:必选项,表示想要执行事件的次数
option可配置的参数分为五类:
A:基础配置参数
B:事件类型和频率参数
C:约束限制类参数
D:调试类参数
E:官方系统隐藏参数
2.启动方式
①$adb shell monkey [option]
②$adb shell
$monkey [option]
tip:Monkey测试启动后,只有当指定完指定事件或者发生异常,才会停止向手机发送事件流,在这个过程中,即使断开电脑与手机的连接,也会继续运行的,所以当需要停止monkey测试的时候,需要杀掉该进程
①查找进程
adb shell ps|grep monkey
②杀掉进程
adb shell kill -9 pid
#(-9参数是完全杀死的,这里用到的命令其实和linux命令是一样的,只不过加上adb shell是表示用来操作Android系统的)
3.monkey测试实例
【I:常规稳定性测试】
(一个具体例子)
$adb shell monkey -p com.xxx.xxx --pct-touch 40 --pct-motion25 --pct-appswtich 10 --pct-rotation 5 -s 12358 --throttle 400 --ignore-crashes --ignore-timeouts -v 50000
命令行中的参数解析:
①-p参数:指定被测包名
获取方式:
A:pm命令获取
$ adb shell pm list package -3
#3:表示下载的应用,不指定,返回所有包
B:adb logcat命令获取
$adb logcat|findstr Displayed
#(直接打印adb logcat,当前界面日志会不断的刷新,没法找到包名,需要过滤出自己想要的)
C:aapt命令也可以用,它是sdk包的一个工具,命令不好用,所以上面两种就满足了
②--pct-xxx参数:指定需要执行的事件,比如是需要随机的点击呢还是滑动页面,手机页面旋转,等等,具体的操作事件可以查阅官方的说明,应该有10中事件类型,
--pct-xxx后面的数字,指定的是该时间的频率,比如在一次测试过程中,需要百分之40的事件是触摸屏幕,就设定40,另外的一个切换Activity需要设定25,那就--pct-appswtich 25;
具体哪些事件设定多大的频率,依据测试需求(需要模拟的实际场景,尽量monkey测试过程贴近实际场景,毕竟贴近实际场景测试才有意义)
③-s:执行命令执行的seed值,主要在需要复现问题的时候需要
monkey是根据seed生成事件流,同一个seed的事件流是完全相同的,当执行一次发现问题后,还需要重新复现一次,就需要执行-s参数
④--throttle:指定monkey测试每一个操作之间的时间间隔,
设置时间间隔原因有两个
1.是为了更好模拟实际的场景,因为人去操作手机的时候,每一次操作之间是会有时间空隙的
2.并且也不希望太过频繁的操作致使APP崩溃。比如手机内存小的,硬件配置比较差得,太过频繁操作必然会造成系统崩溃的,就没有了无测试意义
⑤--ignore-xxx:属于调试类参数,是为了当发生异常(无响应或者闪退)的时候可以忽略掉,可以继续操作,并将对应的日志内容可以存储至日志中;
--ignore-crash:忽视闪退
--ignore--timeout:忽视无响应,这里的
⑤-v:指定日志的详细程度
monket日志有三个等级:当未指定-v参数时表示log_level 为0,-v表示log_level为1,多加v表示日志越详细
常规稳定性测试,因为是随机事件,不知道会点到哪里,那么可能会出现不是我们想要的操作步骤或者说不小心点到了哪里:比如点了断开连接网络的,导致测试失败,不是我们想要的结果,所以想是否可以指定操作步骤呢?那么就需要自定义,通过脚本的形式进行测试
【II:自定义脚本稳定性测试】
脚本模板
#头文件,控制Monkey发送消息的参数,固定写
#脚本类型,一般不用更改,type=‘’
#脚本执行次数,因为在命令行也可以指定,此处设置不生效
#命令执行速率,命令行也可以指定该参数,此处设置不生效
以下为Monkey命令
start data >>
LaunchActivity(pck_name,cl_name)
......均为一些API接口,可参考下面的 API
使用步骤
①编写脚本,可以命名为monkey.script
②文件push上传,放置在/sdcard目录下
$adb push monkey.script /sdcard
③执行脚本
$adb shell monkey -f /sdcard/monkey.script -v 1
即可看到以设定的脚本执行
4.Monkey测试辅助命令
①获取logcat日志信息
adb shell logcat -v time>log.txt
②获取内存信息
adb shell dumpsys meminfo <进程名>
③获取CPU消耗
adb shell top -n 1|find "进程名"
④获取电量信息
adb shell dumpsys battery
⑤获取GPU信息
adb shell dumpsys gfxinfo <进程名>
⑥获取流量信息
adb shell cat/proc/uid_stat/<被测应用的uid>/tcp_rcv
获取uid的步骤
A:查看进程ID:$adb shell ps|grep <被测应用包名>
B:查看被测应用用户ID:$adb shell cat /proc/pid/status
5.Monkey测试日志内容分析
运行输出的日志包含四类:
①测试命令信息
②伪随机事件流信息
③异常信息
④Monkey执行结果信息
bat脚本统计分析Monkey日志
@echo off&setlocal enabledelayedexpansion
#设置所有Monkey日志存放的目录
set ff=log\*.txt
#设置查询关键字
set str=CRASH crash ANR died
#设置查询结果存放的目录
set fileName=Result.txt
#开始查询
echo 正在统计&echo;
echo %date% %time% >%fileName%
echo.>>%fileName%
echo 分析结果:>>%fileName%
echo ---------------------------------------------->>%fileName%
#依次打开目录下每一个Monkey日志查询关键字并输出个数
(for %%a in (%str%)do (
set n%%a=0&set/p= %%a :
for /f "delims=" %%b in ('findstr "%%a" "%ff%"')do (
set h=%%b
call :yky %%a)
echo ! n%%a! >con
echo 关键字 %%a 共有 ! n%%a! 处
))>>%fileName%
echo.>>%fileName%
#针对崩溃的日志输出其所在文件行数
echo 崩溃日志:>>%fileName%
findstr "%str%" "%ff%">>%fileName%
echo/&pause&exit
:yky
set/a n%1+=1
set h=! h:*%1=!
if defined h if not "! h:*%1=! "=="! h! " goto :yky