过于爽快的承认失败,就可能发觉不了曾经与正确非常接近。大家好,依旧是在翻看旧文档的时候,发现一篇关于Monkey的介绍和使用,Monkey这款工具在软件测试中主要用于进行压力测试和稳定性测试。它可以模拟大量随机的用户操作,对应用程序进行长时间的高强度测试,以发现潜在的稳定性问题、崩溃问题以及其他异常情况。通过 Monkey 测试,可以在一定程度上评估应用在极端情况下的表现。
Monkey介绍
什么是Monkey
Monkey是Android系统自带的一个命令行工具,可以在Android模拟器或手机设备中运行。通过向Android系统发送伪随机用户事件流(如屏幕的点击、滑动和系统按键操作等),实现对Android App进行稳定性测试。
Monkey的特点
我们可以在CMD命令行或adb shell命令行执行命令,根据一个特定命令来发送信息。
使用Monkey执行测试,具有如下特点:
(1)如果限定了Monkey运行在特定包上,当监测到试图转到其他包的操作,将对其进行阻止。
(2)如果应用程序崩溃或接收到任何失控异常,或程序无响应(application not responding),Monkey将记录对应的错误日志,并根据命令行参数判断是停止运行还是继续运行。
(3)按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。
(4)不支持条件判断,也不支持读取待测界面的UI值来执行验证和操作。
Monkey的介入时间
等产品比较稳定,没有明显或很多bug的时候,再使用Monkey进行稳定性测试。
Monkey操作
基本操作步骤
- 启动手机(真机或者虚拟机都可以),在其中安装要测试的应用。例如:百度地图。
- 执行monkey命令
- 进入手机系统(adb shell,如有多台设备需要指定设备 -s参数)
- 连接设备(adb connect 设备ID)
- 打开CMD命令行窗口
Monkey命令示例
在模拟器上安装百度地图,可手动打开并打开地图显示页。打开CMD命令行执行adb shell进入 Linux命令行界面。执行如下命令,可看到Monkey的随机操作效果。
monkey -p com.baidu.BaiduMap --ignore-crashes --ignore-timeouts --ignore-native-crashes --pct-motion 39 --pct-pinchzoom 34 --pct-trackball 20 --pct-touch 7 -s 1 -v -v -v --throttle 200 20000
除了上面执行方式外,也可以不进入adb shell,在DOS命令行直接执行adb shell monkey命令。如下:
adb shell monkey -p com.baidu.BaiduMap --ignore-crashes --ignore-timeouts --ignore-native-crashes --pct-motion 39 --pct-pinchzoom 34 --pct-syskeys 0 --pct-trackball 20 --pct-touch 7 -s 1 -v -v -v --throttle 200 20000
强制关闭monkey
如果我们运行之后发现设置错误,运行了别的应用,需要中止monkey测试过程;或者monkey在运行测试中出现故障,需要中止进程,怎么实现呢?
根据monkey进程的启动方式,分为以下两种情况:
- monkey进程通过CMD命令行直接执行adb shell monkey启动:
- monkey进程通过先执行adb shell,进入Linux环境再执行monkey命令启动。
在第一种情况下,采用如下方式终止Monkey进程:
打开一个新的CMD窗口,输入命令:
adb shell ps |findstr "monkey"
查出com.android.commands.monkey 进程记录,记录其进程号(pid).
adb shell kill 进程号
杀掉monkey进程
在第二种情况下,结束Monkey进程则比较简单,直接Ctrl+C即可结束Monkey进程运行。
Monkey命令和参数
monkey 程序组成
1、Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;
2、Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;
monkey命令帮助
命令:
adb shell monkey -help
运行结果:如下图。
Monkey命令参数
monkey基本参数
-p
参数-p用于约束限制,用此参数指定一个或多个包(Package,即App)
不指定-p参数的话会对整机进行测试,即对所有APP进行测试。
-s
用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同。
执行monkey所产生的事件顺序,相当于一个flag,设置这个参数是为了更好地复现Bug。
Seed值如果不指定,系统会自动生成
seed值取值范围:1~9223372036854775807 (2的63次方-1)
如:
adb shell monkey -p com.test -v -s 10 100
第一次运行时出现了bug,但从日志也看不出来什么,再运行一次
adb shell monkey -p com.test -v -s 10 100
它的事件执行顺序与上一次相同,这样就有利于你发现产生bug的地方了。
-v 日志级别
Level 0
示例:
adb shell monkey -p com.baidu.BaiduMap -v 100
说明:仅提供启动提示、测试完成和最终结果等少量信息
Level 1
示例:
adb shellmonkey -p com.baidu.BaiduMap -v -v 100
说明:提供较为详细的日志,包括每个发送到Activity的事件信息
Level 2
示例:
adb shellmonkey -p com.baidu.BaiduMap -v -v -v 100
说明:最详细的日志,包括了测试中选中/未选中的Activity信息
adb shell monkey --throttle 3000 100
--randomize--throttle
结合--throttle使用,随机延迟范围为0到throttle指定的时间
示例:
adb shell monkey --throttle 3000 --randomize-throttle 100
--pkg-whitelist-file 白名单
只执行在白名单中的apk
把设置的白名单的包写入到一个txt文档里面(文档和路径名不能有中文)
如果想指定多个程序被执行,则在文件中添加多个包名,注意包名与包名之间均用回车键换行。
把这个文件放入到安卓手机中,放在/data/local/tmp下面:
adb push D:\whitelist.txt /data/local/tmp
adb shell monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt 200
--pkg-blacklist-file 黑名单
执行除了黑名单中以外的apk
设置方法和白名单类似,把文件名改为blacklist
示例:
adb shell monkey --pkg-blacklist-file /data/local/tmp/blacklist.txt 200
--ignore-crashes
用于指定当应用程序崩溃时(Force& Close错误),Monkey是否停止运行。
如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。
--ignore-timeouts
忽略应用程序发生ANR(Application No Responding)错误时,直到事件数执行完成
--ignore-native-crashes
忽略本地代码造成的崩溃,直到事件数执行完成
--ignore-security-exceptions count
应用程序权限错误发生后继续发送事件
如果你希望monkey在应用程序权限错误发生后继续发送事件,则需要用到--ignore-security-exceptions选项。
如果不设置此选项,monkey遇到此类权限错误将停止运行
随机事件个数,必填项
Monkey事件百分比参数
--pct-事件名称 百分比(用0-100的整数表示)
--pct-touch 触摸事件,点击事件的百分比。编号为:0
--pct-motion 动作事件,设定移动事件百分比,直线滑动。编号为:1
--pct-pinchzoom 缩放事件百分比,比如放大或者缩小的操作。编号为:2
--pct-trackball 轨迹球事件百分比,不常用。编号为:3。现在手机基本没有滚动球,但滚动球事件中包含曲线滑动事件,在被测程序中需要曲线滑动时可以使用此参数
--pct-rotation 屏幕旋转事件百分比,横屏竖屏。编号为:4
--pct-nav 基本导航事件百分比。编号为:5 包括上下左右,如方向输入设备的输入,老人机的上下左右键,智能机上没有
--pct-majornav 主要导航事件百分比。号为:6例如中间键,回退键,菜单键
--pct-syskeys 系统按键事件百分比。编号为:7这些按钮一般专供系统使用,如:Home,Back,Start Call,End Call,音量控制
--pct-appswitch Activity启动事件百分比/调整APP切换事件的百分比。编号为8
--pct-flip 键盘翻转事件百分比/键盘的隐藏,出现。编号为9
--pct-anyevent 其他事件百分比。编号为10如按键,在其他设备上不常用的按钮等
注意:
1.如果不添加任何事件百分比参数,系统将在各种事件中随机分配比例;
2.所有事件百分比相加应小于等于100,若小于100,则剩余比例将随机分配;
3.手动设置时如何分配比例,要根据应用类型决定。
Monkey日志管理
我们使用Monkey进行测试,目的是测试应用的稳定性,在运行时是否发生了诸如崩溃或无响应的问题。Monkey通过日志来记录执行过程以及其中的出错信息。默认情况下,Monkey日志打印在命令行窗口(Windows CMD窗口或adb shell窗口),显示范围有限,内容比较多的时候,无法查看先前生成的内容。而且,如果关闭了命令行窗口日志就丢失了。所以我们要处理的第一个问题,就是日志的保存。
monkey日志保存
Monkey运行日志可以保存在PC中,也可以保存在移动设备(或模拟器)上。而且保存在手机上时,可以将标准流和错误流分开保存。
1、保存在PC中
前提是Monkey测试在PC端执行,命令格式如下:
adb shell monkey [选项参数] 事件数 >Windows文件全路径
此时所有信息输出到一个日志文件。例如:
adb shell monkey -p com.baidu.BaiduMap -v -v -v --throttle 200 100 >d:\monkey.log
2、保存在移动设备(或模拟器)上
前提是Monkey测试在移动设备(或模拟器)执行,先通过执行adb shell进入设备中。 有两种保存方式:
标准信息、错误信息保存在同一个文件,命令格式如下:
monkey [选项参数] 事件数 1>Linux文件全路径 2>&1
例如:
monkey -p com.baidu.BaiduMap -v -v -v --throttle 200 100 1>/sdcard/monkey.log 2>&1
标准信息、错误信息分开保存在两个文件,命令格式如下:
monkey [选项参数] 事件数 1>Linux文件全路径 2>Linux文件全路径
例如:
monkey -p com.baidu.BaiduMap -v -v -v --throttle 200 100 1>/sdcard/monkey_std.log 2>/sdcard/monkey_error.log
Monkey日志分析
Monkey日志分析是Monkey测试中非常重要的一个环节,通过日志分析,可以获取当前测试对象在测试过程中是否发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。
Monkey日志详解
Monkey日志由以下几部分组成:
1、测试命令信息:包括随机种子、事件总数、允许测试包和使用的Activity、各事件百分比。。
2、App切换和Activity跳转:可以看到切换到了哪个App,从哪个Activity跳转到了哪个Activity,如果发生了异常,就可以看出是在哪个App和Activity中发生的。
3、伪随机事件流:各种随机事件。
4、异常信息:应用崩溃、无响应等异常相应信息。
5、测试结果信息:完成事件数、其他信息。
App切换和Activity跳转
可以看到切换到了哪个App,从哪个Activity跳转到了哪个Activity,如果发生了异常,就可以看出是在哪个App和Activity中发生的。
注:在允许一次测试多个应用时,会看到多次App切换;只测试一个应用时,一般只看到一次App切换,除非应用异常后重启。
伪随机事件流
记录各种随机操作及中间的延迟时间,主要是以下几种操作:
touch 触摸操作
motion 滑动操作
trackball 曲线滑动操作
pinch-zoom 缩放操作
rotation 旋转操作
异常信息
应用无响应、崩溃等异常信息
应用无响应时信息:
崩溃信息:
测试结果信息
完成事件数、其他信息
完成事件数:
其他信息:
从日志中发现并提交bug
使用Monkey进行测试结束后,我们关注的是应用在测试中是否出现崩溃或无响应这类问题。测试结果可以通过如下方法判断:
(1)在日志中搜索“CRASH”,如果搜到,可以判断App在测试过程中发生过崩溃(闪退)问题;
(2)在日志中搜索“ANR”,如果搜到,可以判断App在测试过程中发生过无响应的问题;
我们可以把这些关键字,连同其上下文,包括Java异常信息和其他相关信息一起提交。其中,Java异常信息主要有以下类型:
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
违法访问错误:IllegalAccessError
内存不足错误:OutOfMemoryError
堆栈溢出错误:StackOverflowError
注意:长时间运行Monkey时,产生的日志文件非常庞大,用记事本无法打开,可以使用如Notepad++或UltraEdit之类的流式读取的编辑器打开。
ANR异常和traces.txt文件
Monkey日志中ANR相关信息不够详细,当发现APP运行中存在ANR问题时,我们还需要使用adb pull命令从被测设备的/data/anr目录下导出名为traces.txt的对应log文件,一并交给开发人员排查问题。命令如下:
adb pull /data/anr/traces.txt D:\logs\
adb logcat 查看Android系统日志(logcat日志)
使用monkey进行测试时,还要注意logcat日志。这是Android系统日志,包含更详细的内容,可以帮助开发人员定位问题。如果要获取logcat日志,需要在执行monkey测试前开始记录logcat日志。完整步骤如下:
① adb logcat -c 清理现有日志
② adb logcat -v time > D:\logcat.log 开始记录日志
③ 运行monkey程序
运行monkey程序结束后,可以把logcat日志文件logcat.log也提交给开发作为定位问题的参考。
复现问题
如果需要复现问题,可以在日志中找到当时执行的seed值,再构建monkey命令运行几次。构建命令时,seed值自定义,定义成与第一次运行相同。程序运行的初始界面也跟第一次运行相同。
后续回归问题也用同一个命令,seed值保持相同。 如果问题不易复现,需要多运行几次,或多运行一段时间。
另外,还应保持初始界面、网络条件、位置、运行时长一致。
一次测试发现多个问题
monkey 执行时如果加了--ignore-crashes和--ignore-native-crashes,App出现崩溃退出后,还会自动重启并继续发送事件(否则monkey中断)。我们可以等monkey进程结束后,去日志里直接搜索CRASH。可能会看到多处问题。所以加这两个选项可以帮助我们在一次测试中发现多处崩溃问题。
monkey 执行时如果加了--ignore-timeouts,App出现无响应后还会继续发送事件;我们可以等monkey进程结束后,去日志里直接搜索ANR,可能会看到多处问题。所以加这个选项可以帮助我们在一次测试中发现多处无响应的问题。
上述三个选项都加,则可能在一次测试中发现多处CRASH或ANR问题。