Monkey测试进阶

一、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] <count>

option:可选项配置参数,不指定的话就以无反馈模式启动,随机事件发送给手机安装的全部包

count:必选项,表示想要执行事件的次数

option可配置的参数分为五类:

A:基础配置参数

B:事件类型和频率参数

C:约束限制类参数

D:调试类参数

E:官方系统隐藏参数

2.启动方式

①$adb shell monkey [option] <count>   -----------运行日志可以保存在电脑上,指定存放路径

②$adb shell

   $monkey [option] <count>                   -----------运行日志可以保存在手机上,指定存放路径(个人认为不好去查看,还是用第一种方式比较方便)

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 : <nul>con

     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