压力测试Monkey命令参数和报告分析

在移动应用的开发过程中,确保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在任何压力下,都能表现得游刃有余。

 

posted @ 2024-08-22 20:53  WanWuJieKeLian  阅读(4)  评论(0编辑  收藏  举报