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…

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

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

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

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

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…

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 …

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

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

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

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

jmeter环境部署

win环境下&#xff1a; 1、复制jmeter整个包到本地解压、安装jdk 2、jdk环境环境变量配置&#xff08;电脑-属性-高级系统设置-环境变量&#xff09; 系统变量JAVA_HOME 变量值C:\Program Files\Java\jdk1.8.0_101 用户变量path 变量值%JAVA_HOME%\bin cmd下输java或jav…

【Python】pdf2image模块+poppler将PDF转换为图片

有时我们需要将PDF转换成图片&#xff0c;今天我们主要说的是pdf2imagepoppler对PDF转换成图片格式。 pdf2image是个包装器&#xff0c;真正的转换工具是poppler GitHub地址&#xff1a;https://github.com/Belval/pdf2image &#xff0c;上面也有相关的配置说明。 1、安装pdf…

jmeter五种参数化方式之CSV Data Set Config参数化

一、用户定义的变量 一般会设置全局不变的参数&#xff0c;如host、账号、密码等 设置名称username&#xff0c;password 值王荔&#xff0c;123456 线程设置2次和循环设置2次&#xff0c;2次采样器传参和结果一样 二、用户参数 添加用户参数 设置3组参数 参数化 当线程设置…

【Liunx服务器】阿里云服务器下部署多个tomcat服务

现在有这样一个场景&#xff0c;一个阿里云服务器上面已经有tomcat项目和多个maven项目&#xff0c;现在需要在一个新项目中配置一个空的tomcat&#xff0c;现将具体流程记录下来。 1.下载tomcat包或者找到已下载的包 2.将tomcat的包解压到指定项目目录&#xff1a;/data/proj…

python 按照当前日期创建文件

import time import os.path#获得当前系统时间的字符串 localtimetime.strftime(%Y-%m-%d %H:%M:%S,time.localtime(time.time())) print(localtimelocaltime) #系统当前时间年份 yeartime.strftime(%Y,time.localtime(time.time())) #月份 monthtime.strftime(%m,time.localti…

数据结构二叉树遍历求后序

注意左右子树的递归 参考自https://blog.csdn.net/hou_blog/article/details/50015503

【数据库】Mysql函数DATE_ADD() 增加日期/时间

有这样一个场景&#xff1a;数据库还款计划表有到期还款日字段&#xff0c;正常是每月2日。但这个字段有些是每月1日&#xff0c;现需要统一改成2日&#xff0c;可以用到DATE_ADD函数&#xff0c;但是执行时需要注意&#xff1a;只能执行一次 DATE_ADD(date,INTERVAL expr type…

【数据库】Mysql函数DATE_FORMAT() 显示日期/时间

上一篇文章介绍了Mysql函数DATE_ADD()&#xff0c;这篇文章主要是为了解决上次遗留的问题&#xff1a; 把问题变得更复杂一点&#xff1a;假设有两个借款&#xff0c;其中一个借款1的到期还款日为2日&#xff0c;借款2的到期还款日为10日。这个字段loan_pmt_due_date日期有多个…

fiddler抓包工具使用技巧

一、快速找所有post、get、Result code200请求 1、所有post请求的图标都是带有向右的小箭头的那种&#xff0c;如果能让所有向右的小箭头都高亮显示就好了解决方案&#xff1a;输入命令&#xff1a;post 然后点击enter键回车&#xff0c;可以看到所有的post请求都是以蓝色的底…

【数据库】Mysql的CONCAT()函数拼接字符串

mysql CONCAT()函数用于将多个字符串连接成一个字符串&#xff0c;是最重要的mysql函数之一&#xff1a; mysql CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL &#xff0c;则返回值为 NULL。 回到上一篇文章的问题&#xff1a;假设有两个借款…

Jmeter中JDBC Connection Configuration实现MySQL JDBC Request数据库处理

一、JDBC Connection Configuration数据库配置元件 线程组-添加-配置元件-JDBC Connection Configuration Name:元件命名空间&#xff0c;请随意 Comments:注释&#xff0c;请随意 Variable Name:数据库连接池的名称&#xff0c;因为一个测试计划可以有多个JDBC Connection …