一、什么是monkey?

Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。

二、monkey特点?

Monkey 程序是由 Android 系统自带,使用 Java 语言写成。在Android文件系统中的存放路径是:/system/framework/monkey.jar;

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

也就是说monkey可以直接通过打包进测试工具中,被测试人员直接使用,网络上许多第三方的monkey工具就是通过对原生的Monkey.jar包进行二次开发实现。

三、monkey原理?

  1). adb shell monkey的运行机制: 实际上是执行手机中/system/bin/monkey这个脚本;
  2). Monkey事件注入机制:Monkey注入系统事件是通过 framework 层的 hidenApi (如:activemanager,inputmanager,windowmanager) 获取系统服务。
  Monkey中有11种事件,这些事件在MonkeyEventSource中对事件之间的比例进行设置。Monkey事件根据类型比例生成事件队列,循环查找事件。
    a.触摸事件(inputmanager):包括屏幕以及物理键的触摸,滑动,点击事件。
    b.Activity事件(activemanager):是指我们调用Android系统组件的事件。
    c.Window事件(windowmanager):是指操作Window的事件,例如转屏。
  3).Monkey核心类
    a. Monkey.java, 程序的入口,根据参数选择合适的MonkeyEventSource,并适时触发MonkeyEvent;
    b. MonkeyEventSource.java, MonkeyEvent的工厂,是一个接口;
    c. MonkeyEvent.java,各种事件的具体实现。

四、monkey架构图?

  Monkey 运行在设备或模拟器上面,可以脱离PC运行(一般在一些大公司中都是将其抽离成一个测试专用的APP工具,使用相应的操作来完成测试)

五、测试准备?

  1、首先需要将手机连接到PC,测试连接是否正常,可在cmd里输入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)。

    方法三:启动设备上的测试app,同时输入下列命令查看当前活动的应用包名。  

    Android 7.0:adb shell dumpsys activity activities | findstr mFocusedActivity
    Android 8.0:adb shell dumpsys activity activities | findstr mResumedActivity
          或者:adb shell dumpsys window | findstr mCurrentFocus

  3、对特定APP包进行测试的命令为adb shell monkey -p <pakage.name>

六、monkey命令参数详解?  

  示例:adb shell monkey -p com.chineseall.microbookroom --throttle 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v –s 1540475754297 100

  -help                                     查看monkey参数及说明     adb shell monkey -help
  -p ***                                     指定包名,常用参数
  --throttle  100                             操作间隔100ms:常用参数,一般设置为300毫秒,原因是实际用户操作的最快300毫秒左右一个动作事件,所以此处一般设置为300毫秒。
       --randomize-throttle                      随机延迟,后面接数字如500时表示每次事件间隔在0~500ms之间随机延迟
  --ignore-crashes                            忽略崩溃,继续执行,常用参数
  --ignore-timeouts                           忽略超时,常用参数
  --ignore-security-exceptions         忽略许可错误,常用参数
  --monitor-native-crashes               监视并报告Andorid系统中本地代码的崩溃事件。如果设置--kill-process-after-error,系统将停止运行。
  -s                                                   用于指定伪随机数生成器的seed值,相同则两次事件序列也相同
       -v -v -v 1>D:\monkey.txt 2>D:\error.txt &       存放在电脑路径上,常用参数
    默认1个v(仅提供启动、测试完成和最终结果等少量信息),2个v(包括每个发送到Activity的事件信息),3个v(包括了测试中选中/未选中的Activity信息)比较常用的是3个
    -v,即最多详细信息,一般会保存到指定文件中供开发人员查找bug原因时使用。
  -v -v -v 1>/mnt/sdcard/monkey.txt 2>/mnt/sdcard/error.txt &   存放在手机路径上
    0 :标准输入
    1 :标准输出
               2 :标准错误输出
                &:后台运行,拔掉数据线,不影响测试
                >: 重定向,会覆盖原来文件里的内容
             >>: 重定向,追加到原来文件末尾 
  --pkg-whitelist-file  whitelist.txt     白名单,monkey执行对象
    创建白名单txt文件(含包名,多个包换行输入)后,adb push whitelist.txt /data/local/tmp/, 执行命令:
  • adb shell monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt 100
  --pkg-blacklist-file  blacklist.txt     黑名单,monkey不执行对象,不能与白名单同时使用 

  -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生成事件序列前后生成profilling报告。在data/misc路径下生成大文件(~5Mb),所以要小心使用。不常用。

  --kill-process-after-error          通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。设置此项,将会通知系统停止发生错误的进程。注意,正常(成功)的结束,并没有停止启动的进程,设备只是在结束事件之后简单的保持在最后的状态。

  --wait-dbg             停止执行中的Monkey,直到有调试器和它相连接。

  百分比事件:

  0:--pct-touch <percent>            调整点击事件百分比,即在屏幕某处按下并抬起的操作事件:常用参数,此参数设置要适应当前被测应用程序的操作,比如一个应用80%的操作都是触摸,那就可以将此参数的百分比设置成相应较高的百分比。
  1:--pct-motion <percent>          调整滑动事件百分比。(motion事件是由屏幕上某处一个down事件、一系列伪随机的移动事件和一个up事件组成):常用参数,需注意的是移动事件是直线滑动

  2:--pct-pinchzoom <percent>    调整缩放事件百分比,不常用。
  3:--pct-trackball <percent>       调整滚动球事件百分比。(滚动球事件由一个或多个随机的移动事件组成,有时会伴随着点击事件),不常使用参数,现在手机几乎没有滚动球,但滚动球事件中包含曲线滑动事件,在被测程序需要曲线滑动时可以选用此参数。

  4:-pct-roration <percent>         调整旋转屏幕事件百分比。
  5:--pct-nav <percent>              调整基本的导航事件百分比。(导航事件由方向输入设备的上下左右按键所触发的事件组成),不常用操作。
  6:--pct-majornav <percent>     调整主要导航事件的百分比。(这些导航事件通常会导致UI界面中的动作事件,如5-way键盘的中间键,回退按键、菜单按键),不常用。
  7:--pct-syskeys <percent>       调整系统事件百分比。(这些按键通常由系统保留使用,如Home、Back、Start Call、End Call、音量调节),不常用。
  8:--pct-appswitch <percent>    调整Activity启动的百分比。(在随机的时间间隔中,Monkey将执行一个startActivity()调用,作为最大程度覆盖被测包中全部Activity的一种方法),不常用。

  9:--pct-flip <percent>                调整唤出/隐藏键盘事件百分比。
  10:--pct-anyevent <percent>    调整其他事件的百分比。(这包含所有其他事件,如按键、其他在设备上不常用的按钮等)不常用。

七、常用测试命令?

  •   adb shell monkey -p com.chineseall.microbookroom -v -v -v 20000 >D:\monkey.txt
  •   adb shell monkey -p com.chineseall.microbookroom --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 20000 >D:\monkey.txt
  • adb shell monkey -s 9372 -p com.chineseall.microbookroom --ignore-crashes --ignore-timeouts --ignore-security-exceptions --pct-trackball 0 --pct-nav 0 --pct-majornav 0 --pct-anyevent 0 -v -v -v --throttle 200 120000000 1> /mnt/sdcard/log.txt & 2>/mnt/sdcard/error.txt &

  • adb shell monkey -s 9372 -p com.chineseall.microbookroom --ignore-crashes --ignore-timeouts --ignore-security-exceptions --pct-trackball 0 --pct-nav 0 --pct-majornav 0 --pct-anyevent 0 -v -v -v --throttle 200 120000000 1> D:\log.txt 2>D:\error.txt &
  • adb shell monkey -s 6738 -p com.chineseall.microbookroom --ignore-crashes --ignore-timeouts --ignore-security-exceptions --pct-trackball 0 --pct-nav 0 --pct-majornav 0 --pct-anyevent 0 -v -v -v --throttle 200 120000000 > /mnt/sdcard/log.txt 2>&1 &    (xuelian)

  停止monkey:

  •   adb shell
  •   ps | grep monkey    //查看monkey对应的进程数
  •   kill pid(前面会输出)  // 杀进程

八、monkey日志分析?                     参考: https://testerhome.com/topics/12212

   测试结果初步判断:

  1.monkey执行时未加--ignore-crashes 参数,就先浏览日志中Events injected: 值,查看当前已执行的次数,就知道有无bug
    a、程序无响应,ANR问题:在日志中搜索“ANR”
    b、崩溃问题:在日志中搜索“CRASH”
    c、其他问题:在日志中搜索”Exception”
    d、内存泄漏问题搜索”GC”,并进一步分析

  2.常见的Java异常:

    算术异常类:ArithmeticExecption
    空指针异常类:NullPointerException     出现空指针,需要重视
    类型强制转换异常:ClassCastException
    文件已结束异常:EOFException
    文件未找到异常:FileNotFoundException
    数组负下标异常:NegativeArrayException
    数组下标越界异常:ArrayIndexOutOfBoundsException
    违背安全原则异常:SecturityException
    字符串转换为数字异常:NumberFormatException
    操作数据库异常:SQLException
    输入输出异常:IOException
    违法访问错误:IllegalAccessError
    内存不足错误:OutOfMemoryError
    堆栈溢出错误:StackOverflowError
    其他,请参考:https://www.cnblogs.com/cvst/p/5822373.html    

  3.找到错误信息后,monkey里面的哪个Activity出错,在switch后面找,两个swtich之间如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。

      查看Monkey里面出错前的一些事件动作,并手动执行该动作。Sleeping for XX milliseconds这是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件,Sending XX 就是代表一个操作,如下图的两个操作 应该就是一个点击事件。

   若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样。

monkey学习总结笔记的更多相关文章

  1. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  2. DSP28377S - ADC学习编程笔记

    DSP28377S -  ADC学习编程笔记 彭会锋 2016-08-04  20:19:52 1 ADC类型导致的配置区别 F28377S的ADC类型是Type 4类型,我的理解是不同类型的ADC采 ...

  3. 学习ReactNative笔记整理一___JavaScript基础

    学习ReactNative笔记整理一___JavaScript基础 ★★★笔记时间- 2017-1-9 ★★★ 前言: 现在跨平台是一个趋势,这样可以减少开发和维护的成本.第一次看是看的ReactNa ...

  4. 深度学习word2vec笔记之算法篇

    深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...

  5. 强化学习读书笔记 - 02 - 多臂老O虎O机问题

    # 强化学习读书笔记 - 02 - 多臂老O虎O机问题 学习笔记: [Reinforcement Learning: An Introduction, Richard S. Sutton and An ...

  6. 强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods)

    强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods) 学习笔记: Reinforcement Learning: An Introduction, Richard S ...

  7. 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)

    强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...

  8. (转)深度学习word2vec笔记之基础篇

    深度学习word2vec笔记之基础篇 声明: 1)该博文是多位博主以及多位文档资料的主人所无私奉献的论文资料整理的.具体引用的资料请看参考文献.具体的版本声明也参考原文献 2)本文仅供学术交流,非商用 ...

  9. 深度学习word2vec笔记之基础篇

    作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...

随机推荐

  1. 【最小生成树之Kruskal例题-建设电力系统】-C++

    前置知识点Kruskal最短路算法,如果没掌握的请先去掌握! 描述 小明所在的城市由于下暴雪的原因,电力系统严重受损.许多电力线路被破坏,因此许多村庄与主电网失去了联系.政府想尽快重建电力系统,所以, ...

  2. weblogic安装时检查监视器: 必须配置为至少显示 256 种颜色,实际空间未知→失败

    1.首先如果你出现的结果是[未通过],则设置DISPLAY环境变量. 按网上方法:export DISPLAY=:0.0 然后继续安装你的东西……若成功则恭喜你~ 若[失败],按网上方法让你去看日志 ...

  3. 个人永久性免费-Excel催化剂功能第105波-批量调整不规范的图形对象到单一单元格内存储

    在日常制表过程中,一个不得不面对的问题,许多的工作起点是基于其他人加工过的表格,无论自己多大的本领,面对不规范的其他人的制作的表格,经过自己的手,该擦的屁股还是要自己去亲手去擦,而带出来的也只会是一堆 ...

  4. [剑指offer] 40. 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. 思路: 解法一: 哈希表 class Solution { public: void Find ...

  5. 小白开学Asp.Net Core 开篇

    开学Asp.Net Core 开篇 一.准备工作 1.操作环境:Win10 2.开发工具:VS2019 3.运行环境:.Net Core 2.2 4.数据库:SqlServer2012 二.项目搭建 ...

  6. 简单分析线程获取ReentrantReadWriteLock 读锁的规则

    1. 问题 最近有同事问了我一个问题,在Java编程中,当有一条线程要获取ReentrantReadWriteLock的读锁,此时已经有其他线程获得了读锁,AQS队列里也有线程在等待写锁.由于读锁是共 ...

  7. Hadoop学习(3)-mapreduce快速入门加yarn的安装

    mapreduce是一个运算框架,让多台机器进行并行进行运算, 他把所有的计算都分为两个阶段,一个是map阶段,一个是reduce阶段 map阶段:读取hdfs中的文件,分给多个机器上的maptask ...

  8. [译]为任意网格计算tangent空间的基向量

    +BIT祝威+悄悄在此留下版了个权的信息说: [译]为任意网格计算tangent空间的基向量 Computing Tangent Space Basis Vectors for an Arbitrar ...

  9. nginx CRLF(换行回车)注入漏洞复现

    nginx CRLF(换行回车)注入漏洞复现 一.漏洞描述 CRLF是”回车+换行”(\r\n)的简称,其十六进制编码分别为0x0d和0x0a.在HTTP协议中,HTTP header与HTTP Bo ...

  10. liunx基本操作操作与文件和目录的管理

    一.基本操作 Tab键: 自动补全ctrl + u: 清空至行首ctrl + k: 清空至行尾 ctrl + l: 清屏 ctrl + c: 取消本次命令编辑重启:rebootsystemctl re ...