在移动应用的开发过程中,确保APP在高负载下依然能够稳定运行,是保证用户体验的重要一环。为了测试应用的稳定性和性能,压力测试变得至关重要。而其中,Monkey工具以其随机生成事件的方式,成为了开发者进行压力测试的利器。
在使用Monkey进行压力测试时,我们应该如何设置合适的命令参数?测试完成后,又该如何高效地分析测试报告,从而找到潜在的问题呢?
Monkey工具通过模拟用户的操作,随机生成各种事件,如点击、滑动、输入等,以此来检测应用在不同情况下的响应能力。其常用参数包括-p指定包名,--pct-touch设置触摸事件的比例,-s指定随机数种子,-v设置日志级别等。在一次大型APP的压力测试中,开发团队通过精细调整这些参数,发现了在特定场景下应用内存泄漏的问题,并成功优化了应用的性能。
adb的操作命令格式一般为:adb shell monkey +命令参数
PART 01 常用参数
⏩ -p <测试的包名列表>
用于约束限制,用此参数指定一个或多个包。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。
-
不指定包:adb shell monkey 50
-
指定一个包执行50次:adb shell monkey -p 包名 50
-
指定多个包执行50次:adb shell monkey -p 包名1 -p 包名2 50
具体有哪些包名,可以通过adb shell,进入data/data/路径下,ls查看。
⏩ -v 显示日志详细程度
用于指定反馈信息级别(信息级别就是日志的详细程度),差异为-v的数量。总共分3个级别,分别对应的参数:
-
Level 0 : adb shell monkey -p 包名 -v 100 //默认级别,仅提供启动提示、测试完成和最终结果等少量信息
-
Level 1 : adb shell monkey -p 包名 -v -v 100 //提供较为详细的日志,包括每个发送到Activity的事件信息
-
Level 2 : adb shell monkey -p 包名 -v -v -v 100 //最详细的日志,包括了测试中选中/未选中的Activity信息
⏩ -s 伪随机数生成器的种子值
用于指定伪随机数生成器的seed值。如果使用相同的种子值重新运行Monkey,它将生成相同的事件序列,[-s 500 (事件序列) 1000(事件数)]
例如:
test1:adb shell monkey -p com.youdao.dict -s 10 -v 100
test2:adb shell monkey -p com.youdao.dict -s 10 -v 100
⏩ --throttle < 毫秒>
在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被完成。
例如:adb shell monkey -p com.youdao.dict --throttle 200 50 //表示执行50个用户事件数,事件间隔为200毫秒
⏩ --ignore-crashes 忽略崩溃
当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,即使应用程序崩溃,Monkey将继续向系统发送事件,直到事件计数完成。
例如:adb shell monkey -p com.youdao.dict --ignore-crashes 100 //测试过程中即使程序崩溃,Monkey依然会继续发送事件,直到事件数目达到100为止
⏩ --ignore-timeouts 忽略超时
当应用程序发生任何超时错误时(如“Application Not Responding”),Monkey将停止运行。如果设置此选项,即使应用程序发生ANR错误,Monkey将继续向系统发送事件,直到计数完成。
例如:adb shell monkey -p com.youdao.dict --ignore-timeouts 100 //测试过程中即使程序发生ANR错误,Monkey依然会继续发送事件,直到事件数目达到100为止
⏩ --monitor-native-crashes 监视本地崩溃代码
监视并报告Android系统中本地代码的崩溃事件。
例如:adb shell monkey -p com.youdao.dict --monitor-native-crashes 100 //原理同上
⏩ --ignore-security-exceptions 忽略安全异常
当应用程序发生许可错误时(如证书许可,网络许可等),Monkey将停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。
例如:adb shell monkey -p com.youdao.dict --ignore-security-exceptions 100 //原理同上
⏩ --kill-process-after-error 发生错误停止运行并保持当前状态
当应用程序发生错误时,停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。
例如:adb shell monkey -p com.youdao.dict --kill-process-after-error 100 //同上
⏩ --pct-事件类别+事件类别百分比
用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比)
操作事件简介
Monkey所执行的随机事件流中包含11大事件,分别是触摸(touch)、手势(motion)、缩放(pinchzoom)、轨迹(trackball)、屏幕旋转(rotation)、基本导航(nav)、主要导航(mojornav)、系统按键(syskeys)、Activity启动(appswitch)、键盘翻转(flip)、其他事件(anyevent)
Monkey通过这11大事件来模拟用户的常规操作,对手机App进行稳定性测试。
--pct-touch 触摸事件
--pct-motion 手势事件
–pct-pinchzoom 二指缩放事件
–pct-trackball 轨迹事件
–pct-rotation 屏幕旋转事件
–pct-nav 基本导航事件
–pct-majornav 主要导航事件
–pct-syskeys 系统按键事件
–pct-appswitch 启动activity事件
–pct-flip 键盘翻转事件
–pct-anyevent 其他类型事件
PART 02 实例
adb shell monkey -p com.android.gallery3d -s 50 --ignore-crashes --ignore-timeouts --monitor-native-crashes --ignore-security-exceptions --kill-process-after-error --throttle 300 -v -v -v 10000 >D:\monkey_log\monkey_log.txt //将跑完monkey后写入到电脑D盘的指定目录下并生成一个文件
⏩ Monkey日志分析
正常情况,如果Monkey测试顺利执行完成, 在log的最后,会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\
异常情况
Monkey 测试出现错误后,一般的分析步骤
看Monkey的日志 (注意第一个swith以及异常信息等)
⏩ 在日志中搜索 “ANR”
程序无响应的问题: 在日志中搜索 “ANR”,ANR: Application Not Responding 应用程序无响应。
ANR一般有以下三种类型:
-
KeyDispatchTimeout(5 seconds) --主要类型:按键或触摸事件在特定时间内无响应
-
BroadcastTimeout(10 seconds):BroadcastReceiver在特定时间内无法处理完成
-
ServiceTimeout(20 seconds) --小概率类型:Service在特定的时间内无法处理完成
此外当ANR问题发生后我们可以使用adb pull命令(此命令无需root权限)从被测设备的/data/anr目录下导出名为traces.txt的对应log文件。例子: adb pull /data/anr/traces*.txt > C:\
⏩ 崩溃问题搜索 “CRASH”
⏩ 异常问题搜索 “Exception”
(如果出现空指针, NullPointerException,需格外重视,肯定有bug)
下面的属于monkey自己的问题。不用管。
:Sending Flip keyboardOpen=false
Got IOException performing flipjava.io.IOException: write failed: EINVAL (Invalid argument)
// Injection Failed
⏩ 内存泄露问题搜索"GC"(需进一步分析)
当手机提示Out of Memory(内存不足)时基本确定有内存泄露的问题。
当查看logcat时有GC字段,可能有内存泄露问题。与GC相关的字段有如下四个:
-
GC_FOR_ALLOC 在分配内存时内存不够引发
-
GC_EXPLICIT 表明GC被显式请求触发的,如System.gc调用
-
GC_CONCURRENT, 表明GC在内存使用率达到一定的警戒值时,自动触发
-
GC_BEFORE_OOM, 表明在虚拟机抛出内存不够异常OOM之前,执行最后一次回收内存垃圾
当出现内存泄露问题时可以加上--hprof参数再执行一次monkey测试,便可获得对应的profiling报告。
adb shell monkey -p 包名 --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkey.txt
如果指定了这个选项,monkey会在发送时间的前后生成app内存快照文件,一般会在手机设备的/data/misc目录下生成hprof的文件。(注:/data/misc 需要root权限,可以在手机上安装个RE查看或通过手机助手查看)
随着移动应用的功能日益复杂,用户对应用的稳定性和性能要求越来越高。这也使得压力测试成为了开发流程中不可或缺的一部分。Monkey工具的应用,不仅能帮助开发者在早期发现潜在问题,还能避免在应用发布后因崩溃或卡顿而带来的用户流失。
压力测试在应用开发中扮演着重要的角色,而Monkey工具则是其中不可或缺的一环。通过合理设置命令参数并深入分析测试报告,开发者可以有效提升应用的稳定性和用户体验,为产品的成功保驾护航。
精细化的压力测试,是应用稳定性和性能的基石。掌握Monkey的使用技巧,让你的APP在任何压力下,都能表现得游刃有余。
标签:shell,Monkey,--,adb,事件,测试,参数,monkey From: https://www.cnblogs.com/zhuuque23/p/18374740