Monkey稳定性测试初探(一)

Monkey介绍

Monkey程序由Android系统自带,是Android SDK提供的一个命令行工具, 可运行Android模拟器和实体设备上。Monkey会发送伪随机的用户事件流,通过Monkey程序模拟用户触摸屏幕、滑动、 按键等操作来对程序进行压力测试,检测多长时间发生异常、会Crash、以及内存泄露检测可称为随机测试或稳定性测试。

Monkey 命令启动方式

a)可以通过PC机CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试

b)在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数} 来进行Monkey 测试

c ) 在Android机或者模拟器上直接执行monkey 命令,可以在Android机上安装Android终端模拟器

Monkey框架

图片

Monkey命令基本参数

-p

用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。如果丌指定包, monkey将允许系统启动设备中的所有app。

指定一个包:adb shell monkey -p com.shjt.map 100

指定多个包:adb shell monkey -p fishjoy.control.menu –p com.shjt.map 100

-v

用亍指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下 表所示:

Level 0 : adb shell monkey -p com.shjt.map -v 100 // 缺省值,仅提供启动提示、测试完成和最终结果等少量信息

Level 1 : adb shell monkey -p com.shjt.map -v -v 100 // 提供较为详细的日志,包括每个发送到Activity的事件信息

Level 2 : adb shell monkey -p com.shjt.map -v -v -v 100 // 最详细的日志,包括了测试中选中/未选中的Activity信息

—s随机数种子(没有指定此值会默认生成一个seed)

用亍指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。 示例:

monkey测试1:adb shell monkey -p com.shjt.map –s 10 100

monkey测试2:adb shell monkey -p com.shjt.map –s 10 100

—throttle毫秒

每个事件的间隔时间3000毫秒

例:adb shell monkey -p com.shjt.map --throttle 3000 100

实施测试

1、配好sdk、adb环境

2、手机连接电脑,开启开发者模式和调试模式

3、adb devices查看设备连接情况

图片

4、进入要测试的app,查看包名

adb shell dumpsys window | findstr mCurrentFocus

adb shell dumpsys window w |findstr \/ |findstr name=

图片

5、向app发送一些事件

向app发送10个随机事件,adb shell monkey -p com.rabbit.doctor -v 10 仅提供启动提示、测试完成和最终结果等少量信息

向app发送10个随机事件,adb shell monkey -p com.rabbit.doctor -v -v 10 提供较为详细的日志,包括每个发送到Activity的事件信息

向app发送10个随机事件,adb shell monkey -p com.docrab.pro -v -v -v 10 最详细的日志,包括了测试中选中/未选中的Activity信息

指定一个seed值-s 10,相同的seed值执行的操作相同 adb shell monkey -p com.rabbit.doctor -v -s 10 10

向app发送100个随机事件,每个事件间隔3秒 adb shell monkey -p com.docrab.pro --throttle 3000 -v -v -v 50

向app发送10个随机事件,并保存至路径下adb shell monkey -p com.rabbit.doctor -v 10 >c:\monkeylog.txt

向指定设备device压测 adb -s emulator-5554 shell monkey -p your.www.com -v 500 -s 加 device emulator-5554

6、测试结果展示

C:\Windows\system32>adb shell monkey -p com.docrab.pro -v 100 //p表示指定测试程序,v表示monkey生成的详细随机事件名,100事件数
:Monkey: seed=1510018290134 count=100 //开始未指定时,随机生成的seed值
:AllowPackage: com.docrab.pro //包名
: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: -0.0%

// 5: -0.0%

// 6: 25.0%

// 7: 15.0%

// 8: 2.0%

// 9: 2.0%

// 10: 1.0%

// 11: 13.0% //表示跳转到com.example.android.apis 里面的ApiDemos这一个Activity里。

:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.docrab.pro/com.squareup.leakcanary.internal.DisplayLeakActivity;end

// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.docrab.pro/com.squareup.leakcanary.internal.DisplayLeakActivity } in package com.docrab.pro

:Sending Touch (ACTION_DOWN): 0:(501.0,218.0)

// Injection Failed

:Sending Touch (ACTION_UP): 0:(492.16553,221.75143)

// Injection Failed
:Sending Trackball (ACTION_MOVE): 0:(-2.0,-4.0) //发送的一些动作,如点击按下,点击放开,移动。
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
:Sending Touch (ACTION_DOWN): 0:(462.0,51.0)
:Sending Touch (ACTION_UP): 0:(377.56924,0.0)
:Sending Trackball (ACTION_MOVE): 0:(1.0,-1.0)
:Sending Touch (ACTION_DOWN): 0:(451.0,1139.0)
:Sending Touch (ACTION_UP): 0:(445.72433,1140.6277)
:Sending Touch (ACTION_DOWN): 0:(717.0,464.0)
:Sending Touch (ACTION_UP): 0:(720.0,483.52737)
:Sending Trackball (ACTION_MOVE): 0:(-4.0,3.0)
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
:Sending Touch (ACTION_DOWN): 0:(684.0,69.0)
:Sending Touch (ACTION_UP): 0:(691.5189,169.68057)
:Sending Touch (ACTION_DOWN): 0:(376.0,1005.0)

:Sending Touch (ACTION_UP): 0:(382.10815,1030.8892)

Events injected: 100 //完成次数
:Sending rotation degree=0, persist=false

:Dropped: keys=0 pointers=2 trackballs=0 flips=0 rotations=0 //丢弃的,键=0,指针=2,轨迹球=0,翻转=0。

##Network stats: elapsed time=327ms (0ms mobile, 0ms wifi, 327ms not connected) //花费时间

// Monkey finished //完成

Monkey日志分析

1、正常情况, 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间;// Monkey finished 代表执行完成

2、异常情况

Monkey 测试出现错误后,一般的分析步骤

看Monkey的日志 (注意第一个swith以及异常信息等)

  1. 程序无响应的问题: 在日志中搜索 “ANR”,ANR: Application Not Responding 应用程序无响应。ANR一般有以下三种类型:

    A:KeyDispatchTimeout(5 seconds) --主要类型:按键或触摸事件在特定时间内无响应

    B:BroadcastTimeout(10 seconds):BroadcastReceiver在特定时间内无法处理完成

    C:ServiceTimeout(20 seconds) --小概率类型:Service在特定的时间内无法处理完成

    图片

此外当ANR问题发生后我们可以使用adb pull命令(此命令无需root权限)从被测设备的/data/anr目录下导出名为traces.txt的对应log文件。例子:adb pull /data/anr/traces*.txt > C:

2. 崩溃问题搜索 “CRASH”   

图片

3、异常问题搜索 “Exception”(如果出现空指针, NullPointerException,需格外重视,肯定有bug)。

图片

4、内存泄露问题搜索"GC"(需进一步分析)

   A、当手机提示Out of Memory(内存不足)时基本确定有内存泄露的问题

   B、当查看logcat时有GC字段,可能有内存泄露问题。

     与GC相关的字段有如下四个:

     GC_FOR_ALLOC 在分配内存时内存不够引发

     GC_EXPLICIT 表明GC被显式请求触发的,如System.g

     GC_CONCURRENT, 表明GC在内存使用率达到一定的警戒值时,自动触发

     GC_BEFORE_OOM, 表明在虚拟机抛出内存不够异常OOM之前,执行最后一次回收内存垃圾

当出现内存泄露问题时可以加上--hprof参数再执行一次monkey测试,便可获得对应的profiling报告。

如果指定了这个选项,monkey会在发送时间的前后生成app内存快照文件,一般会在手机设备的/data/misc目录下生成hprof的文件。【/data/misc 需要root权限,可以在手机上安装个RE查看或通过手机助手查看

图片

BUG实例1:

图片

BUG实例2:

图片

adb指令:

关闭adb服务 adb kill-server

开启adb服务 adb start-server

上传文件:adb push <本地文件><远程路径> 例:adb push d:\3.txt storage/sdcard

下载文件:adb pull <远程路径><本地路径> 例:adb pull storage/sdcard/3.txt d:

输出调试的信息:adb bugreport

android list targets #显示系统中全部android平台

adb install -r 应用程序.apk #安装apk程序

adb push D:Test.apk/syste/app/ #安装apk程序

adb push D:file.txt/system/temp/ #向手机写入文件

adb pull /system/temp/ D:file.txt #从手机获取文件

adb logcat #查看日志

adb logcat | find "com.rabbit.doctor" >c:\hello.txt #记录日志到电脑上

adb logcat -v time > d:/sss.log #当前日志输出到d盘的sss.log中

打印日志保存下来

adb logcat | find "com.koubeigongzuo.ck" >C:/logg.txt

实时监控对应app日志

adb logcat | find "com.koubeigongzuo.ck"

实时监控对应app报错日志

adb logcat *:E | find "com.koubeigongzuo.ck"

显示所有优先级大于等于错误(Error)的日志

adb logcat *:E

显示所有优先级大于等于严重错误的日志

adb logcat *:F

查看安卓版本号

adb shell pm dump com.koubeigongzuo.ck | findstr "versionName

apk的应用信息、版本信息

adb shell dumpsys package com.koubeigongzuo.ck

获取应用执行时的内存等相关信息

adb shell dumpsys meminfo com.koubeigongzuo.ck

点击

adb shell input tap 250 250

滑动

adb shell input swipe 250 250 300 300

图片