GVKun编程网logo

Android 稳定性测试工具 Monkey - 随机事件(安卓monkey测试)

6

在本文中,我们将带你了解Android稳定性测试工具Monkey-随机事件在这篇文章中,我们将为您详细介绍Android稳定性测试工具Monkey-随机事件的方方面面,并解答安卓monkey测试常见的

在本文中,我们将带你了解Android 稳定性测试工具 Monkey - 随机事件在这篇文章中,我们将为您详细介绍Android 稳定性测试工具 Monkey - 随机事件的方方面面,并解答安卓monkey测试常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Android Monkey 测试分析、Android Monkey压力测试使用、android monkey压力测试(二)、android monkey测试

本文目录一览:

Android 稳定性测试工具 Monkey - 随机事件(安卓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 Monkey 测试分析

极力推荐Android 开发大总结文章:欢迎收藏 程序员Android 力荐 ,Android 开发者需要的必备技能

Monkey 在开发中非常常见,本篇主要梳理 monkey 测试相关知识点。主要包括以下内容

  1. 整机 monkey 测试命令
  2. app monkey 测试命令
  3. 判断Monkey 测试方法
  4. 停止monkey的方法
  5. Monkey 使用手册
  6. Monkey Crash Log 分析
  7. Monkey ANR Log 分析
  8. Monkey 测试中关机
  9. 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 信息,方便我们解决crashadb 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.通过查看进程,然后killmonkey进程 查看手机monkey 进程的命令adb shell ps |findstr monkey, 通过稍等进程 idadb 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

停止monkey 测试的方法

  • b. 重启手机

此种方案简单暴力。

5. Monkey 使用手册

monkey 使用参数命令帮助手册命令如下:adb shell monkey -help Monkey 参数使用手册

  • -v 表示Log信息登记

  • --throttle 表示毫秒数

  • -s 表示发送随机数种子

  • -p 表示测试Monkey app 包名

monkey 部分参数

6 .Monkey Crash Log 分析

在抓取的adb log中,使用文本编辑器(建议使用Notepad++,匹配大小写 )打开,

搜索一下关键字 CRASH:

Monkey log 分析举例

7 .Monkey ANR Log 分析

在抓取的adb log中,使用文本编辑器(建议使用Notepad++,匹配大小写 )打开,

搜索一下关键字 ANR in 或 者 NOT RESPONDING

ANR Log 分析

如有ANR 还需要将 data/anr 下的trace 文件pull 出来辅助分析 ANR原因。

导出ANR 文件的命令如下: adb pull data/anr . 导出 ANR 文件

8.Monkey 测试中关机

Monkey 测试过程中关机可以先从以下方法入手。 1.搜索关键字battery_level 查看电池电量。 通过次关键字可以在events_log 中查看关机时候的电池电量信息、电池电压信息、电池温度信息。

电池相关信息

9.Monkey 运行机制

因为系统中已经将monkey.jar打包到 system/framework/中 ,故monkey 命令可以在手机上直接运行。

monkey jar 包文件

手机 monkey  jar包存放路径

执行monkey 命令的脚本存放地址在system/bin目录下,通过此脚本,既可以开始执行monkey 相关的命令测试。

monkey 脚本

手机monkey命令脚本存放地址

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

微信关注公众号:  程序员Android,领福利

Android Monkey压力测试使用

Android Monkey压力测试使用

 

 

 

 

 

一、Monkey简介:

Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发送伪随机的用户事件流(点击、滑动、Application切换、横竖屏、应用关闭)实现对正在开发的应用程序进行压力测试。monkey测试是一种为了测试软件的稳定性,健壮性的快速有效的方法。只针对Activity做测试,不能对Service做测试。

简单的理解:

Monkey 是一个 Android 自动化测试小工具。主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash.

Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试。 猴子什么都不懂, 只知道乱敲。通过Monkey程序模拟用户触摸屏幕、滑动Trackball、 按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。

二、质量要求:

版本release(发布)前,Monkey跑出来的结果中crash要为0,final release前,Monkey跑完的总次数应为25W,结果里不允许有nullPointException出现。

三、使用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压力测试(二)

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 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测试的相关信息,请在本站查询。

本文标签: