文章目录

  • 环境配置
    • 1、JDK安装配置
    • 2、Android Studio开发环境安装
    • 3、adb安装配置
  • 使用操作
    • 1、连接真机调试
    • 2、检测连接设备
    • 3、安装测试包
    • 4、执行测试
    • 5、命令介绍
    • 6、日志分析

Monkey是Android中的命令行工具,对app的稳定性和健壮性进行测试。
适用情况:ANR和CRASH异常情况,低概率很难复现的异常;
适用测试类型:
1、盲测:忽略功能和业务逻辑进行随意的测试;
2、压力测试:通过长时间的高频操作,测试app在测试机上的性能(需要其他性能工具辅助,如jmeter)
3、冒烟测试:在进行功能测试之前,通过monkey测试app的基本可用功能

环境配置

1、JDK安装配置

JDK是Java语言的软件开发工具包,主要用于移动设备,嵌入式设备上的java应用程序。
下载地址:https://www.oracle.com/cn/java/technologies/javase-downloads.html
根据所安装的操作系统,选择对应的安装包,这里选择的是macOS

根据提示一步步点即可安装完成
很多开发工具都需要到安装JDK,建议安装前的先在终端输入“javac -version”命令,若弹出版本信息(如下)则说明之前已安装了。如无则执行以上安装,成功后在输入该命令

2、Android Studio开发环境安装

下载地址:https://developer.android.google.cn/studio(网盘工具池有)
下载完安装包后,根据提示一步步点击安装,如下
选择默认项,点击OK


随意,两项都可以,咨询是否发送数据给google,选了“Don’t send”

点击“Cancel”

点击“Next”

选择第一项标准“Standard”,如想要自定义的可选择第二项“Custom”,初入门的建议选择第一项

背景选择,根据自己的喜好选择深色或浅色

点击“Finish”

进入组件下载,下载完成后点击“Finish”

安装完成

使用需要用到虚拟真机,点击左上角“Android Studio”>“Preferences”,下载对应虚拟真机系统SDK

3、adb安装配置

终端输入“adb”,会提示“-bash:abd:command not found”,故我们此时需要配置adb命令
1)终端输入“ touch .bash_profile”,创建文件;
2)输入“vim .bash_profile”,打开文件进行编辑;
3)配置以下内容,保存退出
#Android 开发环境配置

ANDROID_HOME=/Users/XXX/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

4)输入“source .bash_profile”更新文件
5)再次输入”adb”,出现adb命令参数解释,配置成功

使用操作

操作特点
1)测试对象为程序包,有一定局限性;
2)伪随机事件,不能自定义;
3)可设置事件数量、类型、频率

1、连接真机调试

用USB将手机和电脑连接,并在手机端操作
1)USB连接方式选择“传输文件”
2)设置>开发人员选项>勾选"USB调试”

2、检测连接设备

终端输入“adb devices”,此时手机会弹出是否允许使用该电脑进行调试>勾选允许,同时终端会输出设备信息(如下),即已连接成功

  • device状态:这个状态表示设备或者模拟器已经连接到adb服务器上。但是这个状态并不代表物理手机设备或者模拟器已经启动完毕并可以进行操作,因为Android 系统在启动时会先连接到adb服务器上,但android 系统启动完成后,设备或者模拟器通常是这个状态。
  • offline状态:这个状态表明设备或者模拟器没有连接到adb服务器或者没有响应。(此时,插拔USB即可)
  • nodevice状态:这个状态表示没有物理设备或者模拟器连接。
  • unauthorized状态:表示未授权.允许授权即可

3、安装测试包

1)在终端输入待测应用文件夹路径“cd /Users/XXX/Downloads”;
2)输入安装命令“adb install 应用包名.apk”;
3)在手机端会弹出安装提示,点击安装>安装完成;
终端信息

4、执行测试

执行前要先确认需要测试的的应用包名(不是安装包名),可在终端输入以下命令获取

  • adb shell pm list packages #查看你的手机所有的安装包
  • adb shell pm list packages -3 #查看手机上所有的第三方安装包
  • adb shell pm list package -f #将获取手机内所有apk对应的包名和路径,后输入你要查找的app的关键词可快速找到你想要的app包名
  • adb shell “logcat | grep START” #执行该命令,等一小会logcat输出信息完毕,然后点击要查看包名的APP,此时终端输出的信息会包含包名(如在不知道包任何信息下,此方法最快捷)
    在终端输入以下命令执行操作
adb shell monkey -p com.cn.XXXX -v 1000(指定com.cn.XXX包打开并执行1000次乱点乱滑动操作)

5、命令介绍

1)-p:指定包名,不指定,则不用加-p
例:-p com.cn.XX1 -p com.cn2.XX2(指定多个包)

2)-v:表示查看monkey执行过程的信息(日志级别)(-v 越多越详细,最多三个)
例:adb shell monkey -v -v -v 100(更详细的日志)

3)-s:伪随机数生成器的seed值。(相当于设置一个路径,因为monkey是
随机事件,所以为了使回归路径一致就需要设置相同的seed值)
例:adb shell monkey 100 -s 5
如果想重现上面例子的路径下次执行的-s也必须为5

4)–throttle: 设定两个事件之间一个固定延迟,可以减缓monkey的执行速度。如果不指定,monkey将不会被延迟,事件将尽可能快地生成和发送消息。单位:毫秒
例:adb shell monkey --throttle 2000 -p com.XXX.XX 100(向XX发送1000次随机事件,每次事件间隔为2秒)

5)可通过设置事件百分比,让某些事件按一定比例执行

  • –pct-touch:触摸事件百分比
  • –pct-motion:滑动事件百分比
  • –pct-pinchzoom:缩放事件百分比
  • –pct-trackball:轨迹球事件百分比(轨迹球事件是包含一系列随机移动和单击事件的事件)
  • –pct-rotation:屏幕旋转事件百分比
  • –pct-nav:基本导航事件百分比(基本导航事件是模拟方向性在设备上输入向上、向下、向左、向右的事件)
  • –pct-majornav:主要导航事件百分比(主要导航事件通常会导致UI产生回馈信息,如单击Back键、Home键、Menu键等)
  • –pct-syskeys:系统事件百分比
  • –pct-appswitch:Activity启动事件百分比
  • –pct-flip:键盘翻转事件百分比
  • –pct-anyevent:其他事件百分比
    例: adb shell monkey —throttle 3000 —pct-majornav 40 -p com.XXX.XX 100
    向XXX发送1000次随机事件,每次事件间隔为3秒。其中设定主要导航事件的占比为40%。

6)允许出现某种错误时,忽略该错误继续执行

  • –ignore-crashes:程序崩溃或者发生异常后继续执行事件;
  • –ignore-timeouts:程序发生任何超时错误时(application not responding),继续执行事件;
  • –ignore-security-exceptions:程序发生许可错误时(如证书许可,网络许可等),进行执行事件
    例:adb shell monkey —throttle 3000 —pct-trackball 50 -p com.tXXX.XXX --ignore-security-exceptions 100

6、日志分析

1)指定日志存放目录
存放在电脑上
如下是存放在桌面的Log2020.txt文件上,需要先在桌面创建该空白文件
例:adb shell monkey -p com.XXX.xxx -v-v-v 1000 >/Users/XXX/Desktop/Log2020.txt

存放在手机上(未试过)
进入Android系统adb shell
执行Monkey命令monkey -p com.kugou.android —pct-touch 25 -v -v 200 1>/mnt/sdcard/monkey.txt 2>/mnt/sdcard/error.txt &

  • 0:标准输入
  • 1 :标准输出
  • 2 :标准错误输出
  • &:后台运行
  • "> ": 重定向,会覆盖原来文件里的内容
  • “>>” : 重定向,追加到原来文件末尾

(以下内容有借用他人资料,找不到原文连接,如有问题请联系删除)
2)日志具体显示解析如下
Monkey运行时输出的日志一般包含四类信息,分别是测试命令信息、伪随机事件流信息、异常信息、Monkey执行结果信息。
1.Monkey: seed=1470511671524 count=100
本次测试执行的seed值和随机事件次数
2.AllowPackage: com.UCMobile.x86
可以运行的包名
3.// 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%
分配事件的百分比,事件号可以参考Monkey命令参数部分
4.事件0:触摸事件
Sending Touch (ACTION_DOWN): 0:(572.0,1105.0)
Sending Touch (ACTION_UP): 0:(576.20734,1105.024)
5.事件1:滑动事件
Sending Touch (ACTION_DOWN): 0:(233.0,761.0)
Sending Touch (ACTION_MOVE): 0:(208.49568,736.34766)
Sending Touch (ACTION_MOVE): 0:(202.7063,729.8338)
Sending Touch (ACTION_MOVE): 0:(183.89723,722.677)
Sending Touch (ACTION_UP): 0:(174.83568,721.8229)
6.事件2:缩放事件
Sending Touch (ACTION_DOWN): 0:(107.0,242.0)
Sending Touch (ACTION_POINTER_DOWN 1): 0:(108.14705,248.53061) 1:(270.0,262.0)
Sending Touch (ACTION_MOVE): 0:(110.117355,252.96329) 1:(267.9937,262.25485)
Sending Touch (ACTION_MOVE): 0:(111.30056,261.88846) 1:(261.90106,262.58475)
Sending Touch (ACTION_MOVE): 0:(113.11743,265.60138) 1:(253.92662,263.13382)
Sending Touch (ACTION_POINTER_UP 1): 0:(113.29031,267.4419) 1:(248.60628,263.23257)
7.事件3:轨迹球事件
Sending Trackball (ACTION_MOVE): 0:(3.0,-2.0)
Sending Trackball (ACTION_MOVE): 0:(1.0,-1.0)
8.事件4:屏幕旋转事件(隐藏事件)
Sending rotation degree=0,persist=true
9.事件5:导航事件(上下左右)
Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEF
10.事件6:主要导航事件(menu等)
Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER
11.事件7:系统按键事件(音量,home,返回按键等)
Sending Key (ACTION_UP): 25 // KEYCODE_VOLUME_DOWN
12.事件8:启动应用事件
Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.UCMobile.x86/com.UCMobile.main.UCMobile;end
13.事件9:键盘事件(隐藏显示键盘)
Sending Flip keyboardOpen=true
14.事件10:其他按键
Sending Key (ACTION_DOWN): 66 // KEYCODE_ENTER
Sending Key (ACTION_UP): 66 // KEYCODE_ENTER
15.延时
Sleeping for 300 milliseconds
这是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。
16.结束
Monkey finished
如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间;Monkey finished代表执行完成。(如果Monkey执行中断,在log的最后也能查看到当前已执行的次数。)

3)日志内容分析方法(借用他人资料,找不到原文连接,如有问题请联系删除)
划重点,所有的操作都离不开分析,这是需要重要掌握的,掌握这部分才能找到应用的主要问题,协助开发解决

  • 1.一般测试结果分析-搜索关键字:
    1)程序无响应,ANR问题:在日志中搜索“ANR”
    2)崩溃问题:在日志中搜索“CRASH”
    3)其他异常事件:在日志中搜索”Exception”(如果出现空指针,NullPointerException,需格外重视
    4)内存泄露问题搜索”GC”(需进一步分析)

下面的属于monkey自己的问题。不用管。
:Sending Flip keyboardOpen=false
Got IOException performing flipjava.io.IOException: write failed: EINVAL (Invalid argument)
// Injection Failed

  1. 初步分析法: monkey出现错误后,一般的分析步骤
    1)找到是monkey里面的哪个地方出错
    2)查看Monkey里面出错前的一些事件动作
    3)手动执行事件,复现问题
    4)若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样

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之前,执行最后一次回收内存垃圾

3.发现内存泄露—内存报告分析(利用hprof参数的内存快照生成内存报告)
在发现内存泄露后,可以执行相同的monkey,只需多加一个参数—hprof
adb shell monkey -p 包名 —hprof —throttle 100 —pct-touch 50 —pct-motion 50 -v -v -v 1000 >c:\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链接来生成报告。*

附:各种问题-连接
⚠️注意:连接不成功的原因,可能是因为出现了端口占用(占用了adb的端口:5037)的情况,通过命令:netstat -ano | findstr “5037”去查看哪个应用占用了(通常会是360/手机助手占用)-
⚠️注意,若首次操作成功,但之后存在检测不到连接设备的情况,可能需要重启服务,具体操作是:

a、在终端下,输入‘cd Users/xxx/Library/Android/sdk/platform-tools’来到adb所在目录下;

b、再依次输入‘adb kill-server‘和’adb start-server’来重启服务;

c、之后再输入‘adb devices’,一般便可检测到连接设备。
⚠️另外,部分真机可能存在检测不到的情况,可进行创建、修改adb_usb.ini文件,操作如下:

a、在终端中输入‘system_profiler SPUSBDataType’,找到手机的Vendor ID并记录;

b、在终端中输入‘vi ~/.android/adb_usb.ini’,创建并打开文本,按‘I’键可对文本进行编辑,向文本中添加记录的Vendor ID(若添加多个,需确保每个id占一行且文本中无空行),完成后按‘esc’键,然后键入‘:wq!’,即可保存并退出文本。完成此步后将发现路径/Users/xxx/.android下存在adb_usb.ini文件;

c、将手机拔掉重新接入Mac,重复4.(1)(2),在终端中输入‘adb kill-server’,然后输入‘adb start-server’,再次输入‘adb devices’查看是否识别到设备。

【附】.android是隐藏目录,需要开启隐藏目录显示,开启方式为:

在终端中输入‘defaults write com.apple.finder AppleShowAllFiles -bool true’,退出终端;然后单击窗口左上角的苹果标志->强制退出->Finder->重新启动,选择‘这台Mac’,搜索框中输入user,来到用户->xxx(当前用户名)下即可看到隐藏文件们。

Monkey工具使用-安卓压测工具相关推荐

  1. linux tcp压测工具,02.监控和压测工具 - 2.4.压测工具 - 《Linux性能调优指南》 - 书栈网 · BookStack...

    压测工具其它有用工具 在这里,我们会讨论主要的压力测试工具,选择合适的压测工具,才能准确衡量系统性能.好的压测工具有很多,可能的功能如下: 发起压力 监控性能 监控系统使用率 生成报告 基准测试无非就 ...

  2. python 压测工具_流量压测工具 | 亚马逊AWS官方博客

    (可用于测试AWS ELB.EC2.Auto Scaling.HA) 一群勤劳的小蜜蜂 很多时候我们需要进行负载均衡.Web服务器的并发式压力测试,但像Siege, JMeter等工具都是从一个源IP ...

  3. web版本 开源压测工具_免费压测工具

    很多的web应用在搭建服务器完成后,为了让搭建的服务能够满足用户的访问需求,通常需要测试自己应用的并发连接能力.需要使用一些压测工具,本文介绍一些免费的开源的压测工具,可以用于简单的压力测试(实验均在 ...

  4. web版本 开源压测工具_siege--Web性能压测工具

    -V, --version    VERSION, prints the version number. -h, --help    HELP, prints this section. -C, -- ...

  5. python服务端多进程压测工具

    本文描述一个python实现的多进程压测工具,这个压测工具的特点如下: 多进程 在大多数情况下,压测一般适用于IO密集型场景(如访问接口并等待返回),在这种场景下多线程多进程的区分并不明显(详情请参见 ...

  6. 常用的HTTP服务压测工具

    文章目录 一.压测介绍 1.简介 2.压测相关术语 3.压测常用工具 二.压测工具介绍 1.ab压测 1.1 介绍 1.2 ab压测使用 2.wrk压测 2.1 介绍 2.2 安装 2.3 wrk压测 ...

  7. 基于python的压测工具_Python Locust性能测试简介及框架实践

    Locust(俗称 蝗虫), 一个轻量级的开源压测工具,用Python编写.使用 Python 代码定义用户行为,也可以仿真百万个用户: Locust 非常简单易用,是分布式,用户负载测试工具.Loc ...

  8. Http压测工具wrk使用指南【转】

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  9. Http压测工具wrk使用指南

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

最新文章

  1. 绕过安卓SSL验证证书的四种方式
  2. ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)
  3. PLSQL 执行 for update 语句被锁定的解决办法
  4. 容器宿主机数据库_解决Docker容器内访问宿主机MySQL数据库服务器的问题
  5. 新版易支付源码支持即时到账功能
  6. ORACLE数据库定时任务自动停止(broken)的原因分析及解决办法
  7. 论文翻译 | ORB-SLAM3:一个用于视觉、视觉惯性和多地图SLAM系统
  8. oauth2 token为空拦截_OAuth2 Token 一定要放在请求头中吗?
  9. 微信小程序-获取微信用户手机号码
  10. 去除图片上文字的方法(6种)
  11. 一次和前端的相互甩锅的问题记录
  12. 微软宣布Azure DNS全面通用
  13. Android开发 ConstraintLayout布局的详解
  14. 国内数藏造富只是个例,散户见好就收
  15. K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示
  16. UMLChina建模竞赛题大全-题目全文+分卷自测(10套100题)
  17. 指针在c语言中起什么作用,编程中指针的作用是什么?
  18. 忧伤岁月、挡不住四季的温暖……
  19. JD狗东邀新活动余额兑换软件及使用教程
  20. pandas杭州市出租房分析

热门文章

  1. 14.Excel股票分析工具-北向资金持股变化
  2. js合并两个数组对象并且去掉重复的内容(map结合find)
  3. ​区块链3.0时代的文件系统TCFS, 你还不知道吗?
  4. Python 3.10 和 Python 3.9 之间的差异
  5. SCI论文写作常见连词及适用情况
  6. React Strict Mode
  7. Java String截取
  8. SQL 分组排序后取值
  9. 弯头lisp_cad 吊顶 怎么画
  10. 机械师T90安装win10和Ubuntu双系统遇到的坑