在本文中,我们将带你了解Android稳定性测试工具Monkey-随机事件在这篇文章中,我们将为您详细介绍Android稳定性测试工具Monkey-随机事件的方方面面,并解答安卓monkey测试常见的
在本文中,我们将带你了解Android 稳定性测试工具 Monkey - 随机事件在这篇文章中,我们将为您详细介绍Android 稳定性测试工具 Monkey - 随机事件的方方面面,并解答安卓monkey测试常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Android Monkey 测试分析、Android Monkey压力测试使用、android monkey压力测试(二)、android monkey测试。
本文目录一览:- Android 稳定性测试工具 Monkey - 随机事件(安卓monkey测试)
- Android Monkey 测试分析
- Android Monkey压力测试使用
- android monkey压力测试(二)
- android monkey测试
Android 稳定性测试工具 Monkey - 随机事件(安卓monkey测试)
Monkey 提供了 11 种不同的事件,包括触摸事件、滑动事件、缩放事件、轨迹球事件、屏幕旋转事件、基本导航事件、主要导航事件、切换 Activity 事件、系统按键事件、其它类型事件。通过这些事件来模拟用户的操作。以下是事件的简要介绍:
–pct-touch 触摸事件
触摸事件是指在屏幕某处按下并抬起的操作,就模拟日常手机使用中的点击操作。日志如下:
:Sending Touch (ACTION_DOWN): 0:(161.0,913.0)
:Sending Touch (ACTION_UP): 0:(104.82977,953.52576)
–pct-motion 滑动事件
滑动事件是指在屏幕某处按下、随机移动、抬起的操作。类似于我们日常的滑动屏幕翻页的操作。日志显示与触摸事件相似:
:Sending Touch (ACTION_UP): 0:(645.69617,159.27142)
:Sending Touch (ACTION_DOWN): 0:(613.0,529.0)
–pct-pinchzoom 缩放事件
缩放事件是指在屏幕上的两处同时按下,并同时移动,最后同时抬起。就是平时我们使用时的放大缩小操作。
–pct-trackball 轨迹球事件
轨迹事件是由一个或多个随机的移动组成的,有时会伴随点击。早起的智能机带有轨迹球,这个时间就是轨迹球的操作。现在几乎没有轨迹球了,但这个轨迹事件包含了曲线滑动事件,如果被测应用程序需要曲线滑动才需要设置该事件百分比。
:Sending trackball (ACTION_MOVE): 0:(-3.0,-4.0)
:Sending trackball (ACTION_MOVE): 0:(4.0,-5.0)
–pct-rotation 屏幕旋转事件
这是一个隐藏事件,用于模拟手机的横竖屏切换。
:Sending rotation degree=1, persist=true
:Sending rotation degree=0, persist=true
:Sending rotation degree=2, persist=false
该事件由 rotation 事件组成, 其中 degree 表示选装方向, 顺时针旋转, 0 表示旋转 90 度,1 表示 180 度, 2 表示旋转 270 度, 3 表示旋转 360 度
–pct-nav 基本导航事件
基本导航事件是指点击方向输入设备的上、下、左、右按键的操作,现在手机上很少有这样的方向键了。因此该事件用得相对很少。
–pct-majornav 主要导航事件
主要导航事件是指点击“主要导航”按钮的操作。这些按键通常会导致 UI 界面的动作。如回退按键、菜单按键等。
–pct-flip 键盘事件
调整键盘事件主要是指一些与键盘相关的操作。如点击输入框、键盘弹起、点击输入框以外区域、键盘收回等
–pct-appswitch 切换 Activity 事件
切换 Activity 事件是指在手机上启动一个 Activity 的操作。 在随机的时间间隔中, Monkey 将执行一个 startActivity() 方法, 作为最大限度上覆盖被测包中全部 Activity 的一种方法。 (Activity 这个概念简单但不准确的理解可以认为就是页面的意思)
如果该事件比例偏低,你将会看到大部分时间的测试都停留在同一个页面上,因此适当设置该事件的比例是很有必要的。
–pct-syskeys 系统按键事件
系统按键事件是指点击系统保留使用的按键操作,如点击 HOME 键、返回键、音量调节键等。
–pct-anyevent 其它类型事件
其它类型事件除了上面的事件以外的其他事件。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。
# 单个参数设置百分比
adb shell monkey -p com.huomaotv.mobile --pct-appswitch 20 10000
# 多个参数设置百分比
adb shell monkey -p com.huomaotv.mobile --pct-appswitch 20 --pct-rotation 20 --pct-touch 30 --pct-motion 20 10000
注意:
参数后面紧接百分比 ,百分比的总量不能大于 100%
在实际工作中,如果简单跑一下稳定性没有必要修改这些参数。如果想测试更精确一些,让 monkey 测试过程中减少一些无效的事件,可以根据项目 App 的特性调整事件的比例。
比如常见的应用中触摸和滑动的操作肯定是最频繁的,那么相对可以提高这两种事件的比例;或者如游戏视频类的 App,会存在横竖屏切换的操作,就适当增加屏幕旋转事件的比例。
# 触摸 40%,滑动 25%,页面切换 10%,屏幕旋转 5%
adb shell monkey -p com.xxx.xxx --pct-touch 40 --pct-motion 25 --pct-appswitch
10 --pct-rotation 5 50000Android 稳定性测试工具 Monkey(2) - 随机事件
Monkey 提供了 11 种不同的事件,包括触摸事件、滑动事件、缩放事件、轨迹球事件、屏幕旋转事件、基本导航事件、主要导航事件、切换 Activity 事件、系统按键事件、其它类型事件。通过这些事件来模拟用户的操作。以下是事件的简要介绍:
--pct-touch 触摸事件
触摸事件是指在屏幕某处按下并抬起的操作,就模拟日常手机使用中的点击操作。日志如下:
:Sending Touch (ACTION_DOWN): 0:(161.0,913.0)
:Sending Touch (ACTION_UP): 0:(104.82977,953.52576)
--pct-motion 滑动事件
滑动事件是指在屏幕某处按下、随机移动、抬起的操作。类似于我们日常的滑动屏幕翻页的操作。日志显示与触摸事件相似:
:Sending Touch (ACTION_UP): 0:(645.69617,159.27142)
:Sending Touch (ACTION_DOWN): 0:(613.0,529.0)
--pct-pinchzoom 缩放事件
缩放事件是指在屏幕上的两处同时按下,并同时移动,最后同时抬起。就是平时我们使用时的放大缩小操作。
--pct-trackball 轨迹球事件
轨迹事件是由一个或多个随机的移动组成的,有时会伴随点击。早起的智能机带有轨迹球,这个时间就是轨迹球的操作。现在几乎没有轨迹球了,但这个轨迹事件包含了曲线滑动事件,如果被测应用程序需要曲线滑动才需要设置该事件百分比。
:Sending trackball (ACTION_MOVE): 0:(-3.0,-4.0)
:Sending trackball (ACTION_MOVE): 0:(4.0,-5.0)
--pct-rotation 屏幕旋转事件
这是一个隐藏事件,用于模拟手机的横竖屏切换。
:Sending rotation degree=1, persist=true
:Sending rotation degree=0, persist=true
:Sending rotation degree=2, persist=false
该事件由 rotation 事件组成, 其中 degree 表示选装方向, 顺时针旋转, 0 表示旋转 90 度,1 表示 180 度, 2 表示旋转 270 度, 3 表示旋转 360 度
--pct-nav 基本导航事件
基本导航事件是指点击方向输入设备的上、下、左、右按键的操作,现在手机上很少有这样的方向键了。因此该事件用得相对很少。
--pct-majornav 主要导航事件
主要导航事件是指点击“主要导航”按钮的操作。这些按键通常会导致 UI 界面的动作。如回退按键、菜单按键等。
--pct-flip 键盘事件
调整键盘事件主要是指一些与键盘相关的操作。如点击输入框、键盘弹起、点击输入框以外区域、键盘收回等
--pct-appswitch 切换 Activity 事件
切换 Activity 事件是指在手机上启动一个 Activity 的操作。 在随机的时间间隔中, Monkey 将执行一个 startActivity() 方法, 作为最大限度上覆盖被测包中全部 Activity 的一种方法。 (Activity 这个概念简单但不准确的理解可以认为就是页面的意思)
如果该事件比例偏低,你将会看到大部分时间的测试都停留在同一个页面上,因此适当设置该事件的比例是很有必要的。
--pct-syskeys 系统按键事件
系统按键事件是指点击系统保留使用的按键操作,如点击 HOME 键、返回键、音量调节键等。
--pct-anyevent 其它类型事件
其它类型事件除了上面的事件以外的其他事件。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。
参数列表查看如下,参数后面紧接着是百分比 0-100:
事件类别 调整事件说明
--pct-touch 调整触摸事件的百分比
--pct-motion 调整滑动事件的百分比
--pct-pinchzoom 调整缩放事件的百分比
--pct-trackball 调整轨迹事件的百分比
--pct-rotation 调整屏幕旋转事件的百分比
--pct-nav 调整基本导航事件的百分比
--pct-majornav 调整主要导航事件的百分比
--pct-flip 调整键盘事件的百分比
--pct-syskeys 调整系统按键事件的百分比
--pct-appswitch 调整启动Activity事件的百分比
--pct-anyevent 调整其它类型事件的百分比
示例:
# 单个参数设置百分比
adb shell monkey -p com.huomaotv.mobile --pct-appswitch 20 10000
# 多个参数设置百分比
adb shell monkey -p com.huomaotv.mobile --pct-appswitch 20 --pct-rotation 20 --pct-touch 30 --pct-motion 20 10000
注意:
参数后面紧接百分比 ,百分比的总量不能大于 100%
在实际工作中,如果简单跑一下稳定性没有必要修改这些参数。如果想测试更精确一些,让 monkey 测试过程中减少一些无效的事件,可以根据项目 App 的特性调整事件的比例。
比如常见的应用中触摸和滑动的操作肯定是最频繁的,那么相对可以提高这两种事件的比例;或者如游戏视频类的 App,会存在横竖屏切换的操作,就适当增加屏幕旋转事件的比例。
# 触摸 40%,滑动 25%,页面切换 10%,屏幕旋转 5%
adb shell monkey -p com.xxx.xxx --pct-touch 40 --pct-motion 25 --pct-appswitch
10 --pct-rotation 5 50000
如果对软件测试有兴趣,想了解更多的测试知识,解决测试问题,以及入门指导,帮你解决测试中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己测试方面学的不够精想要继续学习的,想转行怕学不会的,都可以加入我们644956177。群内可领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!
Android Monkey 测试分析
极力推荐Android 开发大总结文章:欢迎收藏 程序员Android 力荐 ,Android 开发者需要的必备技能
Monkey 在开发中非常常见,本篇主要梳理 monkey
测试相关知识点。主要包括以下内容
- 整机 monkey 测试命令
- app monkey 测试命令
- 判断Monkey 测试方法
- 停止monkey的方法
- Monkey 使用手册
- Monkey Crash Log 分析
- Monkey ANR Log 分析
- Monkey 测试中关机
- Monkey 运行机制
1. 整机 monkey 测试命令
整机 测试 忽略 crash timeout security-exceptions
等导致的monkey测试中断,并将 Log
保存到指定文件中。
adb shell monkey --ignore-crashes --ignore-timeouts --ignore-security-exceptions --throttle 100 -v 999999999 > monkey_log.txt
2. app monkey 测试命令
执行app
测试,如遇到crash
会打印出crash
信息,方便我们解决crash
。 adb shell monkey -p com.qiyi.video(要测试app的包名) 999999
忽略Crash ANR 、安全异常
等测试方法。
adb shell monkey -p com.qiyi.video(要测试app的包名) --ignore-crashes --ignore-timeouts --ignore-security-exceptions --throttle 100 -v 999999999 > monkey_log.txt
3. 判断Monkey 测试方法
/**
* Returns true if Monkey is running.
*/
public static boolean isMonkeyRunning() {
return ActivityManager.isUserAMonkey();
}
4. 停止monkey的方法
- a.通过查看进程,然后
kill
掉monkey
进程 查看手机monkey
进程的命令adb shell ps |findstr monkey
, 通过稍等进程 id(adb shell kill -9 18333(monkey进程ID)
),实现停止monkey
测试。
C:\Users\Administrator>adb shell ps |findstr monkey
shell 18333 273 1627720 34672 binder_thr 759b3b8884 S com.android.commands.monkey
C:\Users\Administrator>adb shell kill -9 18333
- b. 重启手机
此种方案简单暴力。
5. Monkey 使用手册
monkey
使用参数命令帮助手册命令如下:adb shell monkey -help
-
-v
表示Log
信息登记 -
--throttle
表示毫秒数 -
-s
表示发送随机数种子 -
-p
表示测试Monkey app
包名
6 .Monkey Crash Log 分析
在抓取的adb log
中,使用文本编辑器(建议使用Notepad++,匹配大小写
)打开,
搜索一下关键字 CRASH:
7 .Monkey ANR Log 分析
在抓取的adb log
中,使用文本编辑器(建议使用Notepad++,匹配大小写
)打开,
搜索一下关键字 ANR in 或 者 NOT RESPONDING
如有ANR
还需要将 data/anr
下的trace
文件pull
出来辅助分析 ANR
原因。
导出ANR
文件的命令如下: adb pull data/anr .
8.Monkey 测试中关机
Monkey
测试过程中关机可以先从以下方法入手。 1.搜索关键字battery_level 查看电池电量。 通过次关键字可以在events_log
中查看关机时候的电池电量信息、电池电压信息、电池温度信息。
9.Monkey 运行机制
因为系统中已经将monkey.jar
打包到 system/framework/
中 ,故monkey
命令可以在手机上直接运行。
执行monkey
命令的脚本存放地址在system/bin
目录下,通过此脚本,既可以开始执行monkey
相关的命令测试。
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
Android Monkey压力测试使用
一、Monkey简介:
Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发送伪随机的用户事件流(点击、滑动、Application切换、横竖屏、应用关闭)实现对正在开发的应用程序进行压力测试。monkey测试是一种为了测试软件的稳定性,健壮性的快速有效的方法。只针对Activity做测试,不能对Service做测试。
简单的理解:
Monkey 是一个 Android 自动化测试小工具。主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash.
Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试。 猴子什么都不懂, 只知道乱敲。通过Monkey程序模拟用户触摸屏幕、滑动Trackball、 按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。
二、质量要求:
三、使用Monkey:
在cmd命令或者AndroidStudio中的Terminal中都可以使用adb(注意adb的位置,在SDK的tools文件夹下)
1、首先需要将手机连接到PC,测试连接是否正常,找到adb的位置,一般在sdk的tools文件下 ,找到位置然后输入adb devices来进行验证;
2、因测试多针对一个特定的APP包,所以需要知道需要测试包的包名;可以直接问开发,也可以通过 adb shell pm list packages 列出所有包名来进行查找
(不确定包是否已安装,可以用adb shell pm list packages [options] <INTENT> 来进行确认,它的含义是列举出所有包含<INTENT>的package。 e.g. adb shell pm list packages com.taobao.taobao)
3、对特定APP包进行测试的命令为adb shell monkey -p <pakage.name>
三、Monkey的基本参数:
1、允许启动手机里面所有的 App , 随机操作 1000 次
adb shell monkey 1000
2、-p : 允许启动 App 的包名
- 启动一个包名的应用
QQ 的包名为: com.tencent.mobileqq
adb shell monkey -p com.tencent.mobileqq 1000
随机操作 手机 QQ 1000 次
- 启动指定的多个 App
微信的包名为:com.tencent.mm
adb shell monkey -p com.tencent.mobileqq -p com.tencent.mm 1000
随机操作 手机 QQ 和 微信 1000 次
3、-v : 操作日志记录
命令行的每一个-v将增加反馈信息的级别。
- -v:Level 0(缺省值)除 启动提示、测试完成和最终结果之外,提供较少信息。
- -v -v :Level 1提供较为详细的测试信息,如逐个发送到Activity的 事件。
- -v -v -v :Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。
adb shell monkey -p com.tencent.mobileqq -v -v -v 100
4、-s : 伪随机数生成器的seed值
如果用相同的seed值再次运行monkey,将生成相同的事件序列。
adb shell monkey -s 12345 -v 10
5、--ignore-crashes : 忽略操作是崩溃异常
通常,应用发生崩溃或异常时Monkey会停止运行。如果设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
adb shell monkey --ignore-crashes -v 1000
6、--ignore-timeouts : 忽略超时
通常,应用程序发生任何超时错误(如“Application Not responding”对话框)Monkey将停止运行,设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
adb shell monkey --ignore-timeouts -v 1000
7、--ignore-security-exceptions : 忽略程序发生许可异常
通常,当程序发生许可错误(例如启动一些需要许可的Activity)导致的异常时,Monkey将停止运行。设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
adb shell monkey --ignore-security-exceptions -v 1000
8、--throttle : 插入固定延迟
在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被执行。
adb shell monkey --throttle 500 -v 500
随机执行 500 个事件,每个事件之间延迟 500 毫秒被执行。
9、--help : 列出简单的用法
adb shell monkey -help
四、将log日志文件保存到指定位置:
android studio 的terminal 下执行命令并且将测试结果保存到指定文件下:
adb shell monkey -p 包名 -s 100 --ignore-crashes --ignore-timeouts 1000000 >C:\Users\dingchao\Desktop\testlog.txt
五、日志分析:
1)正常情况:顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\
详细分析参考:
http://blog.sina.com.cn/s/blog_44d19b500102vefp.html
http://blog.csdn.net/huangyabin001/article/details/38442359
2)异常情况:
其中adb shell procrank 查询各进程内存使用情况;adb shell cat /proc/meminfo 查看当前的内存情况...
Monkey 测试出现错误后,一般的分析步骤
看Monkey的日志 (为了进一步分析问题的来源,可以找到Log中出现问题处的前一次Switch,随后根据Log主要是查看相关的Activity)
1、程序无响应的问题:在日志中搜索 “ANR”
可能原因:当前有耗时操作在UI线程指定,导致卡UI了;在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸);BroadcastReceiver在10秒内没有执行完毕
2、崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug
3、搜索"crash" 、"error"
Monkey 执行中断, 在log最后也能看到当前执行次数;若以上步骤还不能定位问题,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样
可能出现Crash的场景
1)图片放大缩小
2)输入框无限输入各种类型字符
3)快速操作
4)和系统的交互等等
什么时候会有Log文件的产生 ?
Log的产生大家都知道 , 大家也都知道通过DDMS来看log , 但什么时候会产生log文件呢 ?一般在如下几种情况会产生log文件 。
1,程序异常退出 , uncaused exception
2,程序强制关闭 ,Force Closed (简称FC)
3,程序无响应 , Application No Response (简称ANR) , 顺便,一般主线程超过5秒么有处理就会ANR
4,手动生成 。
拿到一个日志文件,要分成多段来看 。 log文件很长,其中包含十几个小单元信息,但不要被吓到 ,事实上他主要由三大块儿组成 。
1,系统基本信息 ,包括 内存,CPU ,进程队列 ,虚拟内存 , 垃圾回收等信息 。------ MEMORY INFO (/proc/meminfo) ------
------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------
------ PROCRANK (procrank) ------
------ VIRTUAL MEMORY STATS (/proc/vmstat) ------
------ VMALLOC INFO (/proc/vmallocinfo) ------
格式如下:
------ MEMORY INFO (/proc/meminfo) ------
MemTotal: 347076 kB
MemFree: 56408 kB
Buffers: 7192 kB
Cached: 104064 kB
SwapCached: 0 kB
Active: 192592 kB
Inactive: 40548 kB
Active(anon): 129040 kB
Inactive(anon): 1104 kB
Active(file): 63552 kB
Inactive(file): 39444 kB
Unevictable: 7112 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 44 kB
Writeback: 0 kB
AnonPages: 129028 kB
Mapped: 73728 kB
Shmem: 1148 kB
Slab: 13072 kB
SReclaimable: 4564 kB
SUnreclaim: 8508 kB
KernelStack: 3472 kB
PageTables: 12172 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 173536 kB
Committed_AS: 7394524 kB
VmallocTotal: 319488 kB
VmallocUsed: 90752 kB
VmallocChunk: 181252 kB
2,时间信息 , 也是我们主要分析的信息 。
------ VMALLOC INFO (/proc/vmallocinfo) ------
------ EVENT INFO (/proc/vmallocinfo) ------
格式如下:
------ SYSTEM LOG (logcat -b system -v time -d *:v) ------
01-15 16:41:43.671 W/PackageManager( 2466): Unknown permission com.wsomacp.permission.PROVIDER in package com.android.mms
01-15 16:41:43.671 I/ActivityManager( 2466): Force stopping package com.android.mms uid=10092
01-15 16:41:43.675 I/UsageStats( 2466): Something wrong here, didn''t expect com.sec.android.app.twlauncher to be paused
01-15 16:41:44.108 I/ActivityManager( 2466): Start proc com.sec.android.widgetapp.infoalarm for service com.sec.android.widgetapp.infoalarm/.engine.DataService: pid=20634 uid=10005 gids={3003, 1015, 3002}
01-15 16:41:44.175 W/ActivityManager( 2466): Activity pause timeout for HistoryRecord{48589868 com.sec.android.app.twlauncher/.Launcher}
01-15 16:41:50.864 I/KeyInputQueue( 2466): Input event
01-15 16:41:50.866 D/KeyInputQueue( 2466): screenCaptureKeyFlag setting 0
01-15 16:41:50.882 I/PowerManagerService( 2466): Ulight 0->7|0
01-15 16:41:50.882 I/PowerManagerService( 2466): Setting target 2: cur=0.0 target=70 delta=4.6666665 nominalCurrentValue=0
01-15 16:41:50.882 I/PowerManagerService( 2466): Scheduling light animator!
01-15 16:41:51.706 D/PowerManagerService( 2466): enableLightSensor true
01-15 16:41:51.929 I/KeyInputQueue( 2466): Input event
01-15 16:41:51.933 W/WindowManager( 2466): No focus window, dropping: KeyEvent{action=0 code=26 repeat=0 meta=0 scancode=26 mFlags=9}
3,虚拟机信息 , 包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方 。
------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------
------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------
格式如下 :
----- pid 21161 at 2011-01-15 16:49:01 -----
Cmd line: com.android.mms
DALVIK THREADS:
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 s=N obj=0x4001d8d0 self=0xccc8
| sysTid=21161 nice=0 sched=0/0 cgrp=default handle=-1345017808
| schedstat=( 4151552996 5342265329 10995 )
at android.media.MediaPlayer._reset(Native Method)
at android.media.MediaPlayer.reset(MediaPlayer.java:1218)
at android.widget.VideoView.release(VideoView.java:499)
at android.widget.VideoView.access$2100(VideoView.java:50)
at android.widget.VideoView$6.surfaceDestroyed(VideoView.java:489)
at android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:572)
at android.view.SurfaceView.updateWindow(SurfaceView.java:476)
at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206)
at android.view.View.dispatchDetachedFromWindow(View.java:6082)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
at android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:2296)
at android.view.ViewGroup.removeAllViews(ViewGroup.java:2254)
at com.android.mms.ui.SlideView.reset(SlideView.java:687)
at com.android.mms.ui.SlideshowPresenter.presentSlide(SlideshowPresenter.java:189)
at com.android.mms.ui.SlideshowPresenter$3.run(SlideshowPresenter.java:531)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
---------------------------------------------------------------------------------------------------------------------------------------
闲话少说, 我总结了观察log文件的基本步骤 。 1,如果是ANR问题 , 则搜索“ANR”关键词 。 快速定位到关键事件信息 。
2,如果是ForceClosed 和其它异常退出信息,则搜索"Fatal" 关键词, 快速定位到关键事件信息 。
3,定位到关键事件信息后 , 如果信息不够明确的,再去搜索应用程序包的虚拟机信息 ,查看具体的进程和线程跟踪的日志,来定位到代码 。
用这种方法,出现问题,根本不需要断点调试 , 直接定位到问题,屡试不爽 。
下面,我们就开始来分析这个例子的log 。
打开log文件 , 由于是ANR错误,因此搜索"ANR " , 为何要加空格呢,你加上和去掉比较一下就知道了 。 可以屏蔽掉不少保存到anr.log文件的无效信息 。
关闭Monkey
在monkey运行中,断开USB连接,mokey仍可继续运行
1. ps命令查找进程
adb shell ps | grep monkey 返回来的第一个数字,即是monkey的进程号
2.kill 命令结束进程
adb shell kill [刚才查到的进程号]
android monkey压力测试(二)
一、什么是Monkey
顾名思义,Monkey就是猴子, Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试。 猴子什么都不懂, 只知道乱敲
通过Monkey程序模拟用户触摸屏幕、滑动Trackball、 按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。
二、Monkey简介
- monkey官方文档(需要翻墙)
- monkey源码
- monkey程序由Android系统自带,使用java语言写成,在Android文件系统中存放路径:/system/framework/monkey.jar;
- monkey.jar程序由一个名为“monkey”等shell脚本来启动执行,shell脚本在Android文件系统中的存放路径:/system/bin/monkey;
- 因为monkey测试是一种为了测试软件的稳定性、健壮性(是否会发生闪退、崩溃和无响应问题)的快速有效方法
- 基本语法
$adb shell monkey [option] <event-count>
如果不指定options,即类似于使用adb shell monkey 1000,那么将会对整个系统中安装的package发送事件流,换种说法就是对整个Android系统进行monkey压力测试
这是一个对指定应用(Android自带的系统设置应用)进行monkey测试的栗子,发送的事件流数量为1000:
三、Monkey架构
Monkey 运行在设备或模拟器上面,可以脱离PC运行(普遍做法是将monkey作为一个像待测应用发送 随机按键消息的测试工具。验证待测应用在这些随机性的输入面前是否会闪退或者崩溃)
四、Monkey的弱点
Monkey虽然可以根据一个指定的命令脚本发送按键消息,但其不支持条件判断,也不支持读取待测界面的信息来执行验证操作。
五、参数大全
六、monkey命令选项
- 获取选项列表,Android9版本中输入adb shell monkey,会显示选项列表如下:
常用选项及参数说明-p 允许的包名列表,可同时指定多个包名,每个包都需要使用“-p”参数指定。
- —ignore-timeouts 用于指定当应用程序发生ANR错误时,monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,monkey依然会发送事件,直到事件计数完成。
- —ignore-security-exceptions 用于指定当应用程序发生许可错误时,monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,monkey依然会发送事件,直到事件计数完成。
- —ignore-crashes 用于指定当应用程序崩溃时,monkey是否停止运行。如果使用此参数,即使应用程序崩溃,monkey依然会发送事件,直到事件计数完成。
- —kill-process-after-error 用于指定应用程序发生错误时,是否停止运行。如果使用此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态,注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程。
- —pct-touch 触摸事件是指在屏幕某处按下并抬起的操作,可通过--pct-touch参数来配置其事件百分比。
- —pct-trackball 调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)
- —pct-syskeys 系统按键事件是指点击系统保留使用的按键的操作,如点击Home键、返回键、音量调节键等。可通过--pct-syskeys参数来配置其事件百分比。
- —pct-nav 基本导航事件是指点击方向输入设备的上、下、左、右按键的操作,现在手机上很少有上、下、左、右按键,这种事件一般用得比较少。可通过--pct- nav参数来配置其事件百分比。
- —pct-appswitch 启动Activity事件是指在手机上启动一个Activity的操作。在随机的时间间隔中,Monkey将执行一个startActivity()方法,作为最大限度上覆盖被测包中全部Activity的一种方法。可通过--pct-appswitch参数来配置其事件百分比。
- —pct-anyevent 其他类型事件包括了除前面提到的10种事件外其他所有的事件,如按键、其他不常用的设备上的按钮等。可通过--pct-anyevent参数来配置其事件百分比。
- -s 设定种子数,方便用于重现 bug
- -v用于指定反馈信息级别(信息级别就是日志的详细成都)总共分为3个级别,分别对应的参数如下所示:
- Level0:-v //缺省值,仅提供启动提示、测试完成和最终结果等少量信息,
- Level1:-v -v //提供较为详细的日志,包括每个发送到Activity的事件信息
- Level2:-v -v -v //最详细的日子,包括了测试中选中/未选中的Activity信息
- —throttle 设定事件之间的延时,单位为毫秒
- 如果不指定这个参数,monkey会尽可能快的生成和发送消息
- 命令:adb shell monkey -p 包名 --throttle 3000
- COUNT 事件数目
七、Monkey实例 场景1:在PC端执行monkey命令,将日志保存至D盘monkey.log
场景1:在PC端执行monkey命令,将日志保存至手机sdcard
注意:双引号
>adb shell "monkey -p +包名 1000 > sdcard/monkey.log"
场景2:在PC端执行monkey命令,将日志保存至电脑硬盘
>adb shell monkey -p +包名 -v -v -v --throttle 10 --pct-touch 50 --pct-trackball 50 --ignore-timeouts --ignore-crashes --kill-process-after-error 5000000 > F:/monkey.log
八、日志分析
1.在日志中搜索关键字:
1)搜索报告中的关键字“ANR”,看有无应用无响应的事件(Application Not Responding)
2)搜索报告中的关键字“crash”,看有无崩溃的事件
3)搜索报告中的关键字“exception”,看有无其他异常事件。(如果出现空指针, NullPointerException,需格外重视)
下面的属于monkey自己的问题。不用管。
:Sending Flip keyboardOpen=false
Got IOException performing flipjava.io.IOException: write failed: EINVAL (Invalid argument)
// Injection Failed
4)内存泄露问题搜索"GC"(需进一步分析)
2. 初步分析法: monkey出现错误后,一般的分析步骤
1)先找到出现错误的位置
2)查看出现错误之前2个switch之间的activity
3)手动执行事件,复现问题
4)若以上步骤还不能找出,产生错误时,有会seed值,输入相同的seed值,重新按照之前命令跑monkey
3.详细分析法:
1) ANR问题:在日志中搜索“ANR”(“Application Not Responding"),说明有bug,出现ANR,一般是主线程的响应超过5秒,或者BroadcastReceiver没有在10秒内作出响应。这个就是一个比较严重的缺陷。把耗时的操作另起线程来处理就可以了。
2)分析log中的具体信息:
查看log中第一个Switch,主要是查看Monkey执行的是那一个Activity,譬如下面的log中,执行的是com.tencent.smtt.SplashActivity,在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
:Switch:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.tencent.smtt/.SplashActivity;end
// Allowing start of Intent {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]cmp=com.tencent.smtt/.SplashActivity } in package com.tencent.smtt
3)内存泄漏
1. 内存泄漏弹出out of memory对话框
2. 对于有内存泄漏但是没有单出out of memory对话框的情况,可以通过logcat文件GC出信息,(GC:java的垃圾回收机制)
GC_FOR_ALLOC: 因为在分配内存时候内存不够引起的
GC_EXPLICIT 表明GC被显式请求触发的,如System.gc调用,
GC_CONCCURRENT: 表明GC在内存使用率达到一定的警戒值时候,自动触发
GC_BEFORE_OOM 表明在虚拟机抛出内存不够异常oom之前,执行最后一次回收内存垃圾
2.发现内存泄露--内存报告分析(利用hprof参数的内存快照生成内存报告)
在发现内存泄露后,可以执行相同的monkey,只需多加一个参数--hprof
adb shell monkey -p 包名 --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 > F:\monkey.txt
如果指定了这个选项,monkey会在发送时间的前后生成app内存快照文件,一般会在手机设备的/data/misc目录下生成hprof的文件。(注: /data/misc 需要root权限,可
以在手机上安装个RE查看或通过手机助手查看)
ps:文件转换:配置monkey测试时的sdk-tools下查看是否hprof-conv命令,在命令行输入hprof-conv -help得知文件转化用法,直接转化就行,由.hprof转化成.conv格式。
转化后的文件用eclipse的Memory Analyzer tool(MAT)查看(此插件可以下载),可以点击 Reports->Leak Suspects链接来生成报告。
九、必须重视Crash
虽然Monkey测试有部分缺陷,我们无法准确地得知重现步骤, Monkey测试所出现的NullPointException, 都是可以在用户使用时出现的, 何时出现只是时间问题
理论上来说, Monkey所有的Crash 都需要在发布前修复掉
结束Monkey进程
执行 Monkey 的过程中如果想中途停止 Monkey 程序的运行,需要将 Monkey 的进程杀掉。
1.ps命令查找monkey进程(com.android.commands.monkey)
>adb shell
>ps -ef | grep monkey 返回得到第一个数字,即monkey进程号
2.kill命令结束进程继
>
adb shell kill -9 进程ID
或暴力重启手机
>reboot
最后Crash异常实例:
跑Monkey实践总结:
1、去掉锁屏密码
2、下拉通知栏把wifi、移动网络及飞行模式移出
3、根据实际情况配置事件百分比
4、上班期间不想跑monkey时播放音乐,建议删除本地音乐文件
5、在跑monkey前建议打开app到对应的tab页面
.....
android monkey测试
android monkey是一种初级的android 程序自动化测试方法,它随机产生各种各样的命令,提交给android程序执行,通过大量的操作来检测程序的健壮性。
windows下,安装android sdk,将adb命令的路径加入环境变量,测试adb shell是否可以连接上手机。连上手机,进入android shell界面,android的程序包一般在 /data/data 里,cd进入查看手机安装了哪些包,找到自己要测试的包(可能需要root权限,怎么办,大家都懂的),假设包名叫做yeetrack.apk, 我们可以在android 的shell下直接运行monkey命令,也可以回到windows的cmd下执行monkey命令,这里用cmd,adb shell monkey -p 软件包名 -v 次数(num), 这是最基本的命令,会随机模拟num个动作,交给手机去执行。可以把日志输出到外部文件中 adb shell monkey -p 软件包名 -v 次数 > log.txt 。
还有另外的一些参数,解释如下:
常规
–help
列出简单的用法。
-v
命令行的每一个-v将增加反馈信息的级别。Level 0(缺省值)除启动提示、测试完成和最终结果之外,提供较少信息。Level 1提供较为详细的测试信息,如逐个发送到Activity的事件。Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。
事件
-s <seed>
伪随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件序列。
–throttle <milliseconds>
在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被产成。
–pct-touch <percent>
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)。
–pct-motion <percent>
调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)。
–pct-trackball <percent>
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)。
–pct-nav <percent>
调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)。
–pct-majornav <percent>
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)
–pct-syskeys <percent>
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。
–pct-appswitch <percent>
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。
–pct-anyevent <percent>
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。
约束限制
-p <allowed-package-name>
如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity。如果你的应用程序还需要访问其它包里的Activity(如选择取一个联系人),那些包也需要在此同时指定。如果不指定任何包,Monkey将允许系统启动全部包里的Activity。要指定多个包,需要使用多个-p选项,每个-p选项只能用于一个包。
-c <main-category>
如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选项只能用于一个类别。
调试
–dbg-no-events
设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。
–hprof
设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要小心使用它。
–ignore-crashes
通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。
–ignore-timeouts
通常,当应用程序发生任何超时错误(如“Application Not Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。
–ignore-security-exceptions
通常,当应用程序发生许可错误(如启动一个需要某些许可的Activity)时,Monkey将停止运行。如果设置了此选项,Monkey将继续向系统发送事件,直到计数完成。
–kill-process-after-error
通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。
–monitor-native-crashes
监视并报告Android系统中本地代码的崩溃事件。如果设置了–kill-process-after-error,系统将停止运行。
–wait-dbg
停止执行中的Monkey,直到有调试器和它相连接。
PS: log.txt的日志输出如下
:Monkey: seed=0 count=2000
:AllowPackage: qsbk.app
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: 25.0%
// 5: 15.0%
// 6: 2.0%
// 7: 2.0%
// 8: 1.0%
// 9: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=qsbk.app/.Splash;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=qsbk.app/.Splash } in package qsbk.app
:Sending Flip keyboardOpen=false
:Sending Touch (ACTION_DOWN): 0:(313.0,419.0)
:Sending Touch (ACTION_UP): 0:(313.19876,419.49512)
:Sending Touch (ACTION_DOWN): 0:(427.0,730.0)
:Sending Touch (ACTION_UP): 0:(432.7109,728.9021)
:Sending Trackball (ACTION_MOVE): 0:(-1.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(1.0,-3.0)
:Sending Trackball (ACTION_MOVE): 0:(-1.0,-2.0)
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
// Rejecting start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] cmp=com.miui.home/.launcher.Launcher } in package com.miui.home
:Sending Touch (ACTION_DOWN): 0:(257.0,101.0)
:Sending Touch (ACTION_UP): 0:(248.47726,92.060104)
:Sending Trackball (ACTION_MOVE): 0:(-1.0,-2.0)
:Sending Touch (ACTION_DOWN): 0:(353.0,825.0)
:Sending Touch (ACTION_UP): 0:(367.02255,824.70325)
:Sending Touch (ACTION_DOWN): 0:(460.0,36.0)
:Sending Touch (ACTION_UP): 0:(478.2656,91.67999)
:Sending Trackball (ACTION_MOVE): 0:(-1.0,-4.0)
//[calendar_time:2012-09-01 19:08:33.522 system_uptime:13608870]
// Sending event #100 ……
我们今天的关于Android 稳定性测试工具 Monkey - 随机事件和安卓monkey测试的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android Monkey 测试分析、Android Monkey压力测试使用、android monkey压力测试(二)、android monkey测试的相关信息,请在本站查询。
本文标签: