【自动化测试】Android(安卓)Monkey实践
16lz
2022-03-21
一:Monkey作用 通过Monkey程序模拟用户触摸屏幕、滑动Trackball、 按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常 Monkey 主要用于Android 的压力测试 自动的一个压力测试小工具, 主要目的就是为了测试app 是否会Crash.
二:Monkey介绍 1.Monkey程序由Android系统自带,使用Java诧言写成,在Android文件系统中的存放路径是: /system/framework/monkey.jar; 2. Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中 的存放路径是:/system/bin/monkey; 3. Monkey 命令启动方式: a)可以通过PC机CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试 b)在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数} 来进行Monkey 测试 c ) 在Android机或者模拟器上直接执行monkey 命令,可以在Android机上安装Android终端模拟器
三:Monkey架构图
四:Monkey弱点 Monkey虽然可以根据一个指定的命令脚本发送按键消息,但其不支持条件判断,也不支持读取待测界 面的信息来执行验证操作。
五:环境搭建 1.模拟器准备好root(开发者模式) 2.adb 路径配置到系统环境变量path里面(D:\Jack_ESong\AndroidSDK\Sdk\platform-tools) 3.adb shell 可以进入模拟器(如果有adb.exe 与当前模拟器版本不匹配情况,直接将本地的adb.exe 复制一份到模拟器安装目录上面,将模拟器的安装目录配置到系统变量path里面,重新打开AS 和模拟器)
六:参数大全
参数介绍 adb shell monkey –help
-p <允许的包名列表> 用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。如果不指定包, monkey将允许系统启动设备中的所有app。 指定一个包:adb shell monkey -p com.clt.naton 指定多个包:adb shell monkey -p fishjoy.control.menu –p com.clt.naton 100
-v 用亍指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下 表所示: Level 0 : adb shell monkey -p com.clt.naton -v 100 // 缺省值,仅提供启动提示、测试完成和最终结果等少量信息 Level 1 : adb shell monkey -p com.clt.naton -v -v 100 // 提供较为详细的日志,包括每个发送到Activity的事件信息 Level 2 : adb shell monkey -p com.clt.naton -v -v -v 100 // 最详细的日志,包括了测试中选中/未选中的Activity信息
-s(随机数种子) 用亍指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。 示例: monkey测试1:adb shell monkey -p com.clt.naton –s 10 100 monkey测试2:adb shell monkey -p com.clt.naton –s 10 100
--throttle <毫秒> 用亍指定用户操作(即事件)间的时延,单位是毫秒;如果不指定这个参数,monkey会尽可能快的 生成和发送消息。 示 例:adb shell monkey -p com.clt.naton --throttle 3000 100
保存测试日志其实很简单,命令如下:
七:monkey测试实例 命令: adb devices :查看当前正在连接的设备
adb shell :进入调试模式(adb shell monkey -p com.clt.naton -v 100 >D:\monkey.txt ) ps : 查看正在执行的包名(将crm项目运行起来,通过ps就可以看到包名)
(跑monkey的时候或者想抓程序log导出时,有时会提示:cannot create D:monkeytest.txt: read-only file system 为什么有时候可以有时候不可以? 后来发现跟使用使用习惯不一样,一会是先进入adb shell 再用命令,一会是直接命令进入。 进入adb shell后再用命令就会失败~ 正确方法:退出shell或者执行命令时先不要进shell C:\Documents and Settings\Administrator>adb shell monkey -p 包名 -v 300 >e:\text.txt 进入adb shell后就相当于进入linux的root下面,没有权限在里面创建文件~)
adb shell monkey -p com.clt.naton -v 100 >D:\monkey.txt 表示打开crm项目 随机执行100次 输出目录到d盘下面的monkey.txt文件下面
查看结果
adb shell monkey –p com.clt.naton –-throttle 1000 --pct-touch 50 –-pct-motion 50 –v –v 1000 >D:\monkey.txt
八:日志分析
正常情况, 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\ 异常情况 Monkey 测试出现错误后,一般的分析步骤
看Monkey的日志 (注意第一个swith以及异常信息等)
1. 程序无响应的问题: 在日志中搜索 “ANR” 2. 崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug Monkey 执行中断, 在log最后也能看到当前执行次数
九:代码执行过程中的CRASH ANR
adb shell monkey -p com.clt.naton -s 1499654233911 -v 1000
一次随机的自动化Monkey测试完成。
十:停止执行Monkey命令 cmd在打开一个命令行窗口
十一:执行 Monkey Script 脚本
二:Monkey介绍 1.Monkey程序由Android系统自带,使用Java诧言写成,在Android文件系统中的存放路径是: /system/framework/monkey.jar; 2. Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中 的存放路径是:/system/bin/monkey; 3. Monkey 命令启动方式: a)可以通过PC机CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试 b)在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数} 来进行Monkey 测试 c ) 在Android机或者模拟器上直接执行monkey 命令,可以在Android机上安装Android终端模拟器
三:Monkey架构图
Monkey 运行在设备或模拟器上面,可以脱离PC运行(普遍做法是将monkey作为一个像待测应用发送 随机按键消息的测试工具。验证待测应用在这些随机性的输入面前是否会闪退或者崩溃)
四:Monkey弱点 Monkey虽然可以根据一个指定的命令脚本发送按键消息,但其不支持条件判断,也不支持读取待测界 面的信息来执行验证操作。
五:环境搭建 1.模拟器准备好root(开发者模式) 2.adb 路径配置到系统环境变量path里面(D:\Jack_ESong\AndroidSDK\Sdk\platform-tools) 3.adb shell 可以进入模拟器(如果有adb.exe 与当前模拟器版本不匹配情况,直接将本地的adb.exe 复制一份到模拟器安装目录上面,将模拟器的安装目录配置到系统变量path里面,重新打开AS 和模拟器)
六:参数大全
参数介绍 adb shell monkey –help
-p <允许的包名列表> 用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。如果不指定包, monkey将允许系统启动设备中的所有app。 指定一个包:adb shell monkey -p com.clt.naton 指定多个包:adb shell monkey -p fishjoy.control.menu –p com.clt.naton 100
-v 用亍指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下 表所示: Level 0 : adb shell monkey -p com.clt.naton -v 100 // 缺省值,仅提供启动提示、测试完成和最终结果等少量信息 Level 1 : adb shell monkey -p com.clt.naton -v -v 100 // 提供较为详细的日志,包括每个发送到Activity的事件信息 Level 2 : adb shell monkey -p com.clt.naton -v -v -v 100 // 最详细的日志,包括了测试中选中/未选中的Activity信息
-s(随机数种子) 用亍指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。 示例: monkey测试1:adb shell monkey -p com.clt.naton –s 10 100 monkey测试2:adb shell monkey -p com.clt.naton –s 10 100
--throttle <毫秒> 用亍指定用户操作(即事件)间的时延,单位是毫秒;如果不指定这个参数,monkey会尽可能快的 生成和发送消息。 示 例:adb shell monkey -p com.clt.naton --throttle 3000 100
--pct-touch
作用:调整触摸事件的百分比。(触摸事件是指在屏幕中的一个down-up事件,即在屏幕某处按下并抬起的操作)
例: adb shell monkey –pct-touch 100 -v 10
注:常用参数,此参数设置要适应当前被测应用程序的操作,比如一个应用80%的操作都是触摸,那就可以将此参数的百分比设置成相应较高的百分比。 --pct-motion
作用:调整motion事件百分比。(motion事件是由屏幕上某处一个down事件、一系列伪随机的移动事件和一个up事件组成)
例: adb shell monkey –pct-motion 100 -v 10
注:常用参数,需注意的是移动事件是直线滑动,下面的trackball移动包含曲线移动。
--ignore-crashes
作用:通常,应用发生崩溃或异常时Monkey会停止运行。如果设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
--ignore-timeouts
作用:事件请求超时会影响monkey的测试。如果设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
保存测试日志其实很简单,命令如下:
adb shell monkey -p
com.clt.naton -v -v -v 500 > monkeytest.txt
七:monkey测试实例 命令: adb devices :查看当前正在连接的设备
adb shell :进入调试模式(adb shell monkey -p com.clt.naton -v 100 >D:\monkey.txt ) ps : 查看正在执行的包名(将crm项目运行起来,通过ps就可以看到包名)
(跑monkey的时候或者想抓程序log导出时,有时会提示:cannot create D:monkeytest.txt: read-only file system 为什么有时候可以有时候不可以? 后来发现跟使用使用习惯不一样,一会是先进入adb shell 再用命令,一会是直接命令进入。 进入adb shell后再用命令就会失败~ 正确方法:退出shell或者执行命令时先不要进shell C:\Documents and Settings\Administrator>adb shell monkey -p 包名 -v 300 >e:\text.txt 进入adb shell后就相当于进入linux的root下面,没有权限在里面创建文件~)
adb shell monkey -p com.clt.naton -v 100 >D:\monkey.txt 表示打开crm项目 随机执行100次 输出目录到d盘下面的monkey.txt文件下面
查看结果
adb shell monkey –p com.clt.naton –-throttle 1000 --pct-touch 50 –-pct-motion 50 –v –v 1000 >D:\monkey.txt
八:日志分析
正常情况, 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\ 异常情况 Monkey 测试出现错误后,一般的分析步骤
看Monkey的日志 (注意第一个swith以及异常信息等)
1. 程序无响应的问题: 在日志中搜索 “ANR” 2. 崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug Monkey 执行中断, 在log最后也能看到当前执行次数
九:代码执行过程中的CRASH ANR
CRASH即崩溃信息,程序在运行中非正常退出。 不设置忽略crashes,在测试过程中出现CRASH,会中断测试,并显示CRASH信息和seed信息
根据seed值来完成bug的复现:adb shell monkey -p com.feicuiedu.monkeytestdemo -s 1476474162566 -v 1000adb shell monkey -p com.clt.naton -s 1499654233911 -v 1000
ANR
Applicaton Not Responsing.
同样在monkey测试过程中,如果出现ANR现象,会输出相应的信息,以ANR开头,获取到信息进行问题的解决,同样可以通过seed来进行复现。
附:如果在手动测试过程中出现ANR,日志信息出现在手机中:
- adb shell
- cd /data/anr 切换到设备路径下
- ls 可以看到traces.txt 里面即为log信息
一次随机的自动化Monkey测试完成。
十:停止执行Monkey命令 cmd在打开一个命令行窗口
输入:
adb shell ps | grep monkey
返回来的第一个数字,即是monkey的进程号
2.kill 命令结束进程继续输入:
adb shell kill [刚才查到的进程号] 同理结束其他进程,和其他应用也可用此法。十一:执行 Monkey Script 脚本
脚本编写完毕放入手机的sdcard目录下,cmd中运行命令
adb shell monkey -f/sdcard/脚本名字 运行次数
结合monkey的-v和–hhprof输出日志和性能报告
adb shell monkey --hprof -f/sdcard/*.txt -v -v -v 3 > c:\monkey.txt
一些脚本命令:
-
start data>>
将控制 monkey 的一些参数设置和具体的 monkey 命令分隔开来 -
LaunchAcitivity(pkg_name, cl_name)
启动任意应用的一个活动(界面)
pkg_name, 要启动的应用包名
cl_name, 要打开的活动的类名 - DispatchPointer(downTime,eventTime,action,x,y,pressure,size,metaState,xPrecision,yPrecision,device,edgeFlags)
向一个指定位置发送单个手势消息
downTime: 发送消息的时间,只要是合法的长整型数字即可
eventTime: 主要是用在指定发送两个事件之间的停顿
action: 消息是按下还是抬起,0表示按下,1表示抬起
x:x 坐标
y:y 坐标
其余 7 个参数均可以设置为 0
模版
count = 1 // 下面这个 count 选项, monkey 并没有用到,可以忽略它
speed = 1.0 //speed 选项是用来调整两次按键的发送濒率的
start data >> // “start data >>” 是 有 大小写敏感的,而且单词间的间隔只用有一个空格!
LaunchActivity(com.zhengping.contact, com.zhengping.contact.Main) //# Activity 值可以通过 aapt 命令查看
DispatchPointer(5109520,5109520,0,261,128,0,0,0,0,0,0,0);
DispatchPointer(5109521,5109521,1,261,128,0,0,0,0,0,0,0);
UserWait(2000) // 停顿时间
DispatchPress (KEYCODE_Z) // 文字输入 monkey 只识别英文和数字输入 更多相关文章
- android XML解析技术
- 开源项目之Android框架(Query)
- 更简单的学习Android事件分发
- 【Android】实现XML解析的几种技术
- 如何开发Android(安卓)Maps
- Android(安卓)adb不是内部或外部命令 问题解决
- Android(安卓)adb的使用略解
- Android中解析XML
- Android桌面小部件AppWidget(1)