Monkey介绍

Monkey是由Android系统自带,基于Android设备的,模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常和Crash。

Monkey虽然可以根据一个指定的命令脚本发送按键消息,但不支持条件判断,也不支持读取待测界面的信息来执行验证操作。因此具有Monkey的随机性。这种随机给我们带来了一些困扰:

  • 手机困在一个界面出不去,导致测试重点偏移
  • 手机系统设置被调起,比如wifi被关掉,导致APP联网业务测不到
  • 手机在跑Monkey的时候锁屏,导致无法操作了
  • 手机跑Monkey时的运行状态无法查看比如内存

如何优化呢,可以在后面的文章中分析。

 

Monkey 前提

前提一:搭建Android SDK环境

因为monkey是Android SDK里自带的一个工具,因此搭建好adb环境是运行monkey的前提。

搭建的步骤可以参考这篇文章:https://blog.csdn.net/alice_tl/article/details/78363978

前提二:获取待测试APP包名

获取APP包名的方式有多种,可以参考这篇文章:https://blog.csdn.net/alice_tl/article/details/87094030

 

Monkey 启动

Monkey程序在Android文件系统中的存放路径是:/system/framework/monkey.jar

Monkey.jar程序由一个名为monkey的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey

因此:

PC终端窗口:执行adb shell monkey {+命令参数}来进行Monkey测试

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

 

Monkey 命令

默认使用adb shell monkey -p 包名 次数来启动monkey

示例:adb shell monkey -p com.al.office 100

即:对com.al.office的包monkey随机运行一百次

可以通过参数控制测试的APP对象、每个随机操作之间的延迟时间、日志的详尽程度、以及随机数序列。

示例:adb shell monkey –p com.al.office –-throttle 100 –-pct-touch 50 –-pct-tracball 50 –v –v 1000

即:对com.al.office的包monkey执行1000次,其中触摸50%,

monkey的命令参数如下:

-p:允许的包名列表

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

  • 指定一个包:adb shell monkey -p 包名 100
  • 指定多个包:adb shell monkey -p 包名1 –p包名2 100

 

-v:指定反馈信息级别,即日志的详细程度

总共分3个级别,分别对应的参数如下:

  • 缺省值,仅提供启动提示、测试完成和最终结果等少量信息:adb shell monkey -p 包名 -v 100
  • 提供较为详细的日志,包括每个发送到Activity的事件信息:adb shell monkey -p 包名 -v -v 100
  • 最详细的日志,包括了测试中选中/未选中的Activity信息:adb shell monkey -p 包名 -v -v -v 100

 

-s:随机数种子

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

  • monkey测试1:adb shell monkey -p 包名 –s 10 100
  • monkey测试2:adb shell monkey -p 包名 –s 10 100

 

--throttle:毫秒

指定用户操作(即事件)间的时延,单位是毫秒;如果不指定这个参数,monkey会尽可能快的生成和发送消息。

  • adb shell monkey -p 包名 --throttle 3000 100

 

随机事件类型

虽然monkey中输入的事件是随机产生的,但是可以指定输入事件类型的百分比,让其控制在我们需要的范围内。可以设定的事件类型有:

--pct-motion

指定滑动事件的百分比

--pct-trackball

指定轨迹球事件的百分比

--pct-nav

指定导航事件中,up、down、left、right等事件的百分比

--pct-majornav

指定导航事件中,back、menu等事件的百分比

--pct-syskeys

指定系统按键的百分比,包括HOME、Back、音量等。

--pct-appswitch

指定Activity之间切换的比例。

--pct-anyevent

指定任意事件的百分比

 

Monkey 日志分析

正常情况,如果Monkey测试顺利执行完成,在log的最后会打印出当前执行事件的次数和所花费的时间。如图所示:

(base) alicedembp:~ alice$ adb shell monkey -p com.al.office --pct-motion 15 --pct-trackball 30 -v -v  10 >/Users/alice/Downloads/output.txt  bash arg: -p  bash arg: com.al.office  bash arg: --pct-motion  bash arg: 15  bash arg: --pct-trackball  bash arg: 30  bash arg: -v  bash arg: -v  bash arg: 10args: [-p, com.al.office, --pct-motion, 15, --pct-trackball, 30, -v, -v, 10] arg: "-p" arg: "com.al.office" arg: "--pct-motion" arg: "15" arg: "--pct-trackball" arg: "30" arg: "-v" arg: "-v" arg: "10"data="com.al.office"arg="--pct-motion" mCurArgData="null" mNextArg=3 argwas="--pct-motion" nextarg="15"data="15"arg="--pct-trackball" mCurArgData="null" mNextArg=5 argwas="--pct-trackball" nextarg="30"data="30":Monkey: seed=1558282689229 count=10:AllowPackage: com.al.office:IncludeCategory: android.intent.category.LAUNCHER:IncludeCategory: android.intent.category.MONKEY// Selecting main activities from category android.intent.category.LAUNCHER//   + Using main activity com.al.fstandard.activity.SplashActivity (from package com.al.office)// Selecting main activities from category android.intent.category.MONKEY// Seeded: 1558282689229// Event percentages://   0: 11.0%//   1: 15.0%//   2: 1.4666667%//   3: 30.0%//   4: -0.0%//   5: -0.0%//   6: 18.333334%//   7: 11.0%//   8: 1.4666667%//   9: 1.4666667%//   10: 0.73333335%//   11: 9.533334%:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.al.office/com.al.fstandard.activity.SplashActivity;end    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.al.office/com.al.fstandard.activity.SplashActivity } in package com.al.officeSleeping for 0 milliseconds:Sending Key (ACTION_DOWN): 21    // KEYCODE_DPAD_LEFT:Sending Key (ACTION_UP): 21    // KEYCODE_DPAD_LEFTSleeping for 0 milliseconds:Sending Trackball (ACTION_MOVE): 0:(-3.0,3.0):Sending Trackball (ACTION_MOVE): 0:(4.0,-1.0):Sending Trackball (ACTION_MOVE): 0:(0.0,-1.0):Sending Trackball (ACTION_MOVE): 0:(-1.0,4.0):Sending Trackball (ACTION_MOVE): 0:(-3.0,-2.0):Sending Trackball (ACTION_MOVE): 0:(2.0,-4.0):Sending Trackball (ACTION_MOVE): 0:(-1.0,0.0)Events injected: 10:Sending rotation degree=0, persist=false:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0## Network stats: elapsed time=19ms (0ms mobile, 0ms wifi, 19ms not connected)// Monkey finished

Monkey finished 代表执行完成

这时查看 >/Users/alice/Downloads/output.txt 文件中已经有日志了~,即使Monkey 执行中断, 在log最后也能看到当前执行次数
测试结果分析

  • ANR问题(程序无响应):在日志中搜索“ANR"(application no response)
  • 闪退问题:在日志中搜索"crash"
  • 异常:搜索"Exception",如果出现空指针,"NullPointerException"肯定是有bug
  • 强制退出:搜索"force closed"

更多相关文章

  1. Git使用规范 Android(安卓)版
  2. Android开发实战之——ProgressDialog的使用(一)
  3. EventBus源码详解(一):基本使用
  4. Android添加appcompat_v7包
  5. 小猪浅谈Android屏幕适配
  6. Android滑动冲突的完美解决方案
  7. Android(安卓)activity简单的跳转
  8. 浅谈android view事件分发机制
  9. Android(安卓)事件传递机制的理解

随机推荐

  1. php做接口+android 请求API接口并展示到L
  2. 用Eclipse开发Android项目
  3. Android dumpsys命令详细使用
  4. android中的显示单位(px,dip/dp,sp)
  5. Android中使用ALSA声卡及alsa.conf asoun
  6. Android之ActivityManagerService启动详
  7. Android中Context简介
  8. 关于android软键盘enter键的替换与事件监
  9. Windows环境下Android(安卓)Sdk源码下载
  10. 传智播客Android视频教程——第九天