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一般有以下三种类型:

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

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

                          3: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"(需进一步分析)

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

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

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

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

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

                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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】使用前准备工作配置环境变量

我们要使用java前&#xff0c;必须先安装JDK并且配置相关的环境变量&#xff0c;如果我们未配置环境变量&#xff0c;那么我们在cmd命令中&#xff0c;输入javac&#xff0c;会提示“javac”不是内部或外部命令&#xff0c;这里主要介绍如何配置jdk的环境变量。 JDK官网下载&a…

怎么在html的img src=src的值这里调用js方法或变量获取图片地址

<html> <head>参考自 </head> <body> <img src"?" id"img"> </body> <script language"javascript"> var adres"图片地址"; document.getElementById(img).src adres; </sc…

Jmeter性能测试工具Timer定时器详解

jmeter提供了很多元件&#xff0c;帮助我们更好的完成各种场景的性能测试&#xff0c;其中&#xff0c;定时器&#xff08;timer&#xff09;是很重要的一个元件&#xff0c;jemter提供了9种定时器&#xff0c;下面一一介绍&#xff1a; 一、定时器的作用域 1、定时器是在每个…

js/jq进行日期格式化为:yyyy-MM-dd 如2017-05-08

设置日期为yyyy-MM-dd,代码如下&#xff1a; function setDefaultDate() {var mydate new Date();var month myDate.getMonth() 1;var day myDate.getDate();month (month.toString().length 1) ? ("0" month) : month;day (day.toString().length 1) ? (…

【Maven】Java项目管理工具

一、为什么要Maven 在开发中经常需要依赖第三方的包&#xff0c;包与包之间存在依赖关系&#xff0c;版本间还有兼容性问题&#xff0c;有时还里要将旧的包升级或降级&#xff0c;当项目复杂到一定程度时包管理变得非常重要。 Maven是当前最受欢迎的Java项目管理构建自动化综合…

fiddler抓包工具配置详解

没有解决不了的问题&#xff0c;只是没有找到合适的方法 fiddler官网 https://www.progress.com/ 官网下载fiddler https://www.telerik.com/download/fiddler/fiddler4 fiddler插件下载 https://www.telerik.com/fiddler/add-ons 最近看到很多人都在问的一个问题&#xff0…

js 截取字符串

本文为大家介绍三种 js 截取字符串的方法&#xff1a; substring() 方法&#xff1b;substr() 方法&#xff1b;slice() 方法&#xff1b; 方法1&#xff1a;substring() 方法 string.substring(from, to) 方法从 from 位置截取到 to 位置&#xff0c;to 可选&#xff0c;没有…

【Maven】Eclipse中的Maven项目安装与配置

上一篇文章我们了解到了Maven的基本信息和如何在电脑本地安装Maven&#xff0c;这篇文章主要介绍如何在Eclipse关联Maven的配置和本地仓储地址&#xff0c;并且如何创建一个Maven项目、关联依赖包等。 一、关联Eclipse和Maven 点击Windows菜单栏下的Preference&#xff0c;找…

python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别

1、#类方法classmethod&#xff0c;只能访问类变量&#xff0c;不能访问实例变量&#xff0c;通过cls参数传递当前类对象&#xff0c;不需要实例化&#xff0c;直接【类名.方法名()】&#xff0c;可通过类对象和类对象实例访问 类方法&#xff1a;第一个参数强制为类对象&…

python两个字典合并,两个list合并

python两个字典合并&#xff0c;两个list合并 1.两个字典&#xff1a;a{a:1,b:2,c:3} b {aa:11,bb:22,cc:33} 合并1&#xff1a;dict(a,**b) 操作如下&#xff1a; 合并2&#xff1a;dict(a.items()b.items()) 如下&#xff1a; 合并3&#xff1a;c {} c.update(a) c.up…

【Python】time内置模块处理时间信息

python内置time模块&#xff0d;&#xff0d;时间获取和转换 time模块提供各种时间相关的功能 与时间相关的模块有&#xff1a;time,datetime,calendar 这个模块的功能不是适用于所有的平台 这个模块中定义的大部分函数是调用C平台上的同名函数实现 一些术语和约定的解释&#…

python反射详解

反射 #hasattr(obj,name_str)判断一个对象obj里是否有对应的name_str字符串的方法 #getattr(obj,name_str)根据字符串去获取obj对象里的对应的方法的内存地址 #setattr(object, name, value) setattr(x,“foobar”,123)相当于x.foobar 123。 #delattr(object, name) 该函数删…

C++ 一个字符串只包含K和D。K表示杀人,D表示死亡。计算连续杀敌次数,阵亡则归零。

题&#xff1a; 首先笔者的第一思路是前后两个字符串比较。如果相同index。 #include<iostream> #include<stdio.h> #include<string> using namespace std; int main() {string s;cout << "6请输入字符串&#xff1a;" << endl;cin …

【Python】datetime内置模块处理日期和时间

datetime库定义了2个常量和5个类。 2个常量分别是MINYEAR1和MAXYEAR9999。 5个类分别是&#xff1a; date类&#xff1a;表示日期的类 time类&#xff1a;表示时间的类 datetime类&#xff1a;表示时间日期的类 timedelta类&#xff1a;表示两个datetime对象的差值&#xff1b;…

进程与线程区别

进程概念 进程是表示资源分配的基本单位&#xff0c;又是调度运行的基本单位。例如&#xff0c;用户运行自己的程序&#xff0c;系统就创建一个进程&#xff0c;并为它分配资源&#xff0c;包括各种表格、内存空间、磁盘空间、I/O设备等。然后&#xff0c;把该进程放人进程的就…

【业务办理】广州市户口市内迁移流程

一、申办条件 符合下列条件之一的本市户籍人员&#xff08;除学校学生集体户口外&#xff09;&#xff0c;可办理户口市内迁移。 1.迁入本人合法住宅房屋地址。 2.投靠直系亲属&#xff0c;迁入其合法住宅房屋地址&#xff0c;或迁入其家庭户内。 3.因离婚、房屋所有权发生转移…

python多线程threading之阻塞线程(join)线程同步和守护线程(setDaemon(True))实例详解

一、多线程&#xff08;主线程和子线程同时执行&#xff09; 1、主线程是程序本身&#xff0c;看不到的,主线程和子线程没有依赖关系&#xff0c;同步执行的&#xff0c;若主线程先执行完&#xff0c;会等子线程执行完毕&#xff0c;程序结束 2、启动一个线程就是把一个函数传…

【Python】pyCryptodome模块实现AES加密、解密

高级加密标准&#xff08;英语&#xff1a;Advanced Encryption Standard&#xff0c;缩写&#xff1a;AES&#xff09;&#xff0c;在密码学中又称Rijndael加密法&#xff0c;是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES&#xff0c;已经被多方分析且广…

python多线程之线程锁(Lock)和递归锁(RLock)实例

一、线程锁 Threading模块为我们提供了一个类&#xff0c;Threading.Lock锁。我们创建一个该类对象&#xff0c;在线程函数执行前&#xff0c;“抢占”该锁&#xff0c;执行完成后&#xff0c;“释放”该锁&#xff0c;则我们确保了每次只有一个线程占有该锁。这时候对一个公共…

并发编程:进程,线程,协程,异步

并发编程&#xff08;不是并行&#xff09;目前有四种方式&#xff1a;多进程、多线程、协程和异步。 多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库多线程编程python中有Thread和threading异步编程在linux下主要有三种实现select&#xff0c;po…