Monkey
- [1. Monkey](#1. Monkey)
-
- [1.1 Monkey 是什么](#1.1 Monkey 是什么)
- [1.2 Monkey 测试场景](#1.2 Monkey 测试场景)
- [1.3 Monkey 特点](#1.3 Monkey 特点)
- [1.4 Monkey 在哪里](#1.4 Monkey 在哪里)
- [1.5 测试准备事项](#1.5 测试准备事项)
- [1.6 Monkey 参数列表](#1.6 Monkey 参数列表)
- [2. 基本命令](#2. 基本命令)
- [3. 常用参数](#3. 常用参数)
- [4. 事件类型](#4. 事件类型)
- [5. 调试参数](#5. 调试参数)
- [6. 日志管理](#6. 日志管理)
- [7. 日志错误定位](#7. 日志错误定位)
- [8. Monkey测试可以发现的问题](#8. Monkey测试可以发现的问题)
1. Monkey
1.1 Monkey 是什么
Monkey是一款Android app的自动化测试工具,主要用于app的压力测试和稳定性测试。
工作原理是通过向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等操作,来对设备上的程序进行测试,检测程序长时间的稳定性,多久的时间会发生异常。
1.2 Monkey 测试场景
- app压力测试、稳定性测试。(功能测试--->专项测试(DFX 兼容性,稳定性)
- app的耗资源情况(耗电量,流量,内存,cpu等)
1.3 Monkey 特点
- 没法指定具体业务,发送一些伪随机事件(seed值)
- 通过参数来做一些设定
1.4 Monkey 在哪里
Monkey工具存在Android 系统中,使用Java语言写成,jar包在 Android 文件系统中的存放路径是:/system/framework/monkey.jar; Monkey.jar 程序是由一个名为"monkey"的 shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey; monkey需要通过adb来唤醒,即通过在cmd窗口中执行: adb shell monkey{+命令参数} 来进行 Monkey测试。
1.5 测试准备事项
- 手机准备
1)开发者模式: usb调试
2)解锁(常亮)
3)充足电量
4)放在不影响其它人的地方
5)打开wifi/数据通信
- 环境准备
1)jdk
2)sdk
3)adb
- app应用准备
(登录状态)关闭免密支付
1.6 Monkey 参数列表
图中的参数并不算全,下面会介绍常用的参数:
2. 基本命令
sql
adb devices #测试当前连接设备
adb shell pm list packages #查看你的手机所有的安装包
adb shell pm list packages -3 #查看你的手机所有的第三方安装包
#注:尽量少安装第三方软件,这样可以尽快的找到想要的安装包名称
adb shell #可执行shell命令
top | grep (包名) #获取该包的CPU内存使用率
adb shell dumpsys activity | findstr mFocusedActivity # 获取当前手机运行的包名
3. 常用参数
1)-p 参数:表示指定测试的程序(空格后面跟安装包名字)
例:指定一个app包执行
java
adb shell monkey -p 包名 100
解析:此时指定的软件会被打开并开始乱点乱按100次。
例:指定多个app包执行
java
adb shell monkey -p 包名 -p 包名 100
解析:此时2个app一起执行 可以去测试两个软件/安装包同时打开是否产生冲突!
例:不指定包
java
adb shell monkey 100
解析:此时随机打开一个软件乱点乱按100次。
2)-v:日志详细程度(最高支持'-v -v -v'三级)
指定日志级别 -v
java
adb shell monkey -p cn.mopon.film -v 100
说明:日志级别-v :缺省值,仅提供启动提示、测试完成和最终结果等少量信息。
指定日志级别 -v -v
java
adb shell monkey -p cn.mopon.film-v - 108
说明:日志级别-v -v:提供提供较为详细的日志,包括每个发送到Activity的信息。
指定日志级别 -v -v -v
java
adb shell monkey -p cn.mopon.film -v -v -v 108
说明:日志级别-v -v -v:提供更详细的日志,包括了测试中选中/未选中的Activity信息。
3)-s:种子,记忆功能,一条命令无论执行几次顺序全一样,方便问题复现
举例:monkey1:点击-滑屏-系统按键-屏幕翻转------对应的命令为adb shell monkey......seed 123.......
解析:当发现此用例/执行有问题,就可以利用种子123做复现,再次执行命令,只要种子是seed 123即可。
4)- throttle:种子,记忆功能(操作间隔时间,单位毫秒)
举例:adb shell monkey -p com.tencent.news -v -s 13 -throttle 500 1000
举例解析:
指定包名:com.tencent.news
Log日志: -v = 一级 最多三个:-v -v -v = 最高级 = 三级
种子记忆:13,自定义,之后再执行命令,执行顺序一样
单步间隔时间:500毫秒 = 半秒(1000毫秒 = 1秒)
总计执行事件:1000操作
在导出的log/txt中 Sleeping for xxxx milliseconds 就是- throttle xxxx(毫秒)!!!
4. 事件类型
图片解析:
0:触摸事件百分比,参数--pct-touch
1:滑动事件百分比,参数--pct-motion
2:缩放事件百分比,参数--pct-pinchzoo
3:轨迹球事件百分比,参数--pct-trackball
4:屏幕旋转事件百分比,参数--pct-rotation
5:基本导航事件百分比,参数--pct-nav
6:主要导航事件百分比,参数--pct-majornav
7:系统事件百分比,参数--pct-syskeys
8:Acitivity启动事件百分比,参数--pct-appswitch
9:键盘翻转事件百分比,参数--pct-flip
10:其它事件百分比,参数--pct-anyevent --ignore-crashes --ignore-timeouts等
举例:
1)命令:--pct-touch 空格后加数字,设定触屏时间生成的百分比。触屏事件是一个有手指按下,抬起事件的手势。
java
adb shell monkey --throttle 3000 --pct-touch 50 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定触屏的事件占比为50%。
2)命令: --pct-motion 设定滑动事件生成的白分比。滑动事件是一个先在某一个位置手指按下,滑动一段距离后再抬起手指的手势。
java
adb shell monkey --throttle 3000 --pct-motion 50 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定滑动的事件占比为50%。
3)命令: --pct -trackball 设定轨迹球事件生成的百分比。轨迹球事件是包含一系列随机移动和单击事件的事件。
java
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定轨迹球的事件占比为50%。
4)命令: --pct-nav 设定基本导航事件生成的百分比。基本导航事件是模拟方向性在设备上输入向上、向下、向左、向右的事件。
java
adb shell monkey --throttle 3000_--pct-nav 40 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定基本导航事件的占比为40%。
5)命令 : --pct-majornav 设定主要导航事件生成的百分比。主要导航事件通常会导致UI产生回馈信息,如单击Back键、Home键、Menu键等。
java
adb shell monkey --throttle 3000 --pct-majornav 40 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定主要导航事件的占比为40%。
6)命令 : --ignore-security-exceptions 通常情况下,指定应用程序发生许可错误时如证书许可,网络许可等),monkey将停止运行。现在会继续:
java
adb shell morkey --throttle 3000 --pct-trackball 50 -p com.tencent.news --ignore-security-exceptions 100
解析:指定了该参数,即使应用程序发生许可错误,monkey会继续向系统发送事件,直到指定事件全部运行完毕。
注:在log/txt文件中,每个时间后面的百分比占用可以自己设置,例如滑动事件要占比20% 则在命令中:adb shell monkey...--pct-motion 20...就可以在log/txt文件中看到,没有指定其它事件占比,则其它时间随机瓜分占比。
5. 调试参数
1)--ignore-crashes
指即使应用程序崩溃(Force& Close错误) ,Monkey依然会发送事件,直到事件计数达到指定的次数为止。
如 : adb shell monkey -p cn.mopon.film --ignore-crashes 10000
解析:即使应用程序崩溃,Monkey依然会发送事件,直到事件计数达到10000为止。
2)--ignore-security-exceptions
指APP发生许可证书错误时,Monkey依然继续发送事件,直到事件数目达到目标值为止。
如:adb shell monkey -p cn.mopon.film --ignore-security-exceptions 1000
3)--ignore-timeouts
指app在发生ANR(Application No Responding)错误时,Monkey是否停止运行如果使用-ignore-timeouts参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。
如:adb shell monkey -p cn.mopon.film -ignore-timeouts 1000
4)--kill-process-after-error
指APP发生错误时,应用程序停止运行并保持在当前状。
如:adb shell monkey -p cn.mopon.film --kill-process-after-error 1000
当应用程序发生错误时,应用程序停止运行并保持在当前状态,注意系统并不会结束该应用程序的进程。
也可以多个控制参数一起使用:
java
adb shell monkey -p cn.mopon.film --ignore-crashes --ignore-timeouts 10000
注:当app崩溃,发生ANR错误时继续测试。
6. 日志管理
- 作用:
Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。
-
查看:
1)直接在dos窗口下执行命令后会显示出来
2)例如
adb shell adb shell monkey -p 包名 -v -v -v 100
,在命令最后加上>E:\monkey.log -
monkey 日志保存方法:
1)保存在PC中
2)保存在手机上
3)标准流和错误流分开保存
-
保存在PC中:
举例:
adb shell monkey -v -v 100 > e:\monkeylog.txt
或者:
adb shell monkey -v -v 100 > e:\monkeylog.log
- 保存在手机上:
java
adb shell monkey -v 100 >/sdcard/monkeylog.txt
打开文件管理器就可以查看。
- 标准流和错误流分开保存
举例 1:adb shell monkey -v 100 1>e:\monkey.txt 2>e:\error.txt
解析:在E盘中会显示monkey.txt和error.txt文本,monkey.txt保存着Monkey正常运行日志,error.txt保存着Monkey异常日志。
举例 2:指定手机文件运行日志和异常日志保存到E盘下。
java
adb shell monkey - f /sdcard/wxz.txt -v -v 1 1>e:\monkey.txt 2>e:error.txt
解析:第一个1代表一个文件,第二个1代表正常运行日志,执行上述命令,Monkey的运行日志和异常日志将被分开保存。
7. 日志错误定位
1)程序无响应的问题,在日志中搜索:ANR 无响应。
可能的原因有:
a、当前有耗时操作在UI线程指定,导致卡UI了。
b、在5s内没有响应输入事件( eg:按键、触摸屏幕)。
c、BroadcastReceiver在特定时间内(10s)无法处理完成在logcat将出现anr问题的进程号复制,然后在trace.txt文件里。
按ctrl+F查找,粘贴进程号,查找对应的问题。
2)崩溃问题
在日志中搜索:Exception,如果出现空指针,则肯定有bug
常见错误类型:
java
异常与错误类型 说明
java.lang.NullPointException 空指针异常
java.lang.ArrayIndexOutOfBoundsException 数组溢出
java.lang.classNotFoundException 类不存在
java.lang.ArithmeticException 数学运算异常
java.lang.IllegalArgumentException 方法参数错误
java.io.FileNotFoundException 文件未找到
java.lang.NumberFormatException 数值转化异常
java.lang.StackOverFlowError 推展异常错误
java.lang.OutOfMemoryError 内存溢出错误
3)monkey执行中断搜索:crash、error
8. Monkey测试可以发现的问题
Android平台应用程序可能产生以下四种Crash:
App层(JAVA应用程序):
1、Force Close Crash
2、ANR Crash
Native层(本地框架):
3、Tombstone Crash(Native Crash)
Kernel层(LINUX内核空间)
4、Kernel Panic
注:Monkey的参数没有顺序要求,但是随机事件数是一定要放在最后的!!!