一、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,各种事件的具体实现。

2、adb shell monkey       #monkey命令打开

 3、下载应用软件:如网易云

4、adb 命令实战:

(1)adb shell monkey help:monkey命令介绍

usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
[--ignore-crashes] [--ignore-timeouts]
[--ignore-security-exceptions]
[--monitor-native-crashes] [--ignore-native-crashes]
[--kill-process-after-error] [--hprof]
[--pct-touch PERCENT] [--pct-motion PERCENT]
[--pct-trackball PERCENT] [--pct-syskeys PERCENT]
[--pct-nav PERCENT] [--pct-majornav PERCENT]
[--pct-appswitch PERCENT] [--pct-flip PERCENT]
[--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
[--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
[--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
[--wait-dbg] [--dbg-no-events]
[--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
[--port port]
[-s SEED] [-v [-v] ...]
[--throttle MILLISEC] [--randomize-throttle]
[--profile-wait MILLISEC]
[--device-sleep-time MILLISEC]
[--randomize-script]
[--script-log]
[--bugreport]
[--periodic-bugreport]
COUNT

 =================================================================

(2)adb shell monkey 100:对模拟器或真机做100次随机操作

 报错:

// activityResuming(uni.UNIC7A519E)
Events injected: 100      #事件注入100

报错:

Network stats: elapsed time=2730ms (0ms mobile, 0ms wifi, 2730ms not connected)

网络统计:运行时间=2730ms (0ms移动,0ms wifi, 2730ms未连接)  

 (3)

adb shell pm list package -3:显示第三方的app包的名称

 (4)

adb shell monkey –p app包名 100:对指定的app做100随机操作

例如:

adb shell monkey –p  package:com.baidu.yuedu  100

 出现如下问题:

2. Monkey稳定性实战:(有问题)

adb shell monkey –p app包名–throttle 1000 100:  throttle(节流)

对指定的app每隔1秒做1次操作 做100次

(1)如:adb shell pm list package -3  查看所有的包名

package:com.baidu.yuedu

(2)adb shell monkey –p app包名–throttle 1000  60    60次=1分钟

 

adb shell monkey –p app包名 –throttle 1000 36000:

每隔1秒对app随机做1次操作持续10小时(实际工作测app)

案例:adb shell monkey –p   com.baidu.yuedu   --throttle 1000 36000

 

 

=========================================

参数: -p用法:

-p用于约束限制一个或多个包(Package,即App)。

指定包,Monkey将只允许系统启动指定的APP。不指定包,Monkey将允许系统启动设备中的所有APP。

指定一个包:adb shell monkey -p package:com.baidu.yuedu    100    

说明:com.htc.Weather为包名,100是事件计数(即让Monkey程序模拟100次随机用户事件)。

指定多个包:adb shell monkey -p com.dangbeimarket   -p    com.baidu.yuedu    100

不指定包:adb shell monkey 100

说明:Monkey随机启动APP并发送100个随机事件。

 案例1:adb  shell monkey  -p   com.baidu.yuedu  -v 300    300次

 案例2:adb  shell monkey  -p   com.baidu.yuedu  -v 300  > D:\ls\fx\A.txt

========================================

Monkey日志分析:

1. Monkey日志命令:

参数v:日志详细程度

用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:

-v:leve0 除启动提示、测试完成和最终结果之外、提供较少信息

-v -v:leve1 提供较为详细的日志,包括每个发送到Activity的事件信息

-v –v –v:leve2 最详细的日志,包括了测试中选中,未选中的Activity信息

案例1:

==========================================================

2. Monkey日志分析:

adb shell monkey –p app包名 --throttle 1000 –v-v-v 100:

每隔1秒对app做1次随机操作,执行100次,并输出详细日志

案例1:adb shell monkey –p  com.baidu.yuedu   --throttle 1000 –v-v-v 100

 

adb shell monkey –p app包名 --throttle 1000 –v-v-v 100

>C:\Users\Desktop\applog.txt:输出日志文件到本地路径

案例:adb shell monkey –p  com.baidu.yuedu   --throttle 1000 –v-v-v 100  >D:\f\hz15.txt

 

Monkey日志分析:

1. Monkey日志分析:

正常情况:

如果Monkey测试顺利执行完成,在log的最后会打印出当前执行事件的次数

和所花费的时间;

// Monkey finished 代表执行完成

异常情况:

查阅Monkey的输出日志:

1. 程序无响应的问题: 在日志中搜索 “ANR”(anr)

2. 崩溃问题:在日志中搜索 “Exception”(异常)

3. 如果有空指针,搜索“NullPointerException”

4. 如果Monkey执行中断,在log最后也能看到当前执行次数

===============================================

Monkey日志分析:

1. Monkey日志分析:

重现异常以及回归验证:

s参数详解:

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

-s:在命令中加上seed值 确保两次执行的序列号一样

如果第一次稳定性测试时出现了bug,那测试人员就需要重现bug和验证bug

所以需要重复两次操作一样,seed值相同就能确保monkey两次测试所触发的事件

一致

adb shell monkey –p app包名 –s 1001 --throttle 1000 –v-v-v 100

>C:\Users\Desktop\applog.txt:输出日志文件到本地路径

案例:adb shell monkey -p com.baidu.yuedu   -s 1001 --throttle 1000 -v-v-v 100 >  D:\ls\fx\cc.txt

adb shell monkey –p app包名 –s 1001 --throttle 1000 –v-v-v 100

>C:\Users\Desktop\applog1.txt:输出日志文件到本地路径

案例:adb shell monkey -p com.baidu.yuedu   -s 1001 --throttle 1000 -v-v-v 100 >  D:\ls\fx\cc1.txt

两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序

列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随

机的;

=======================================================

Monkey调试:

1. Monkey调试:

在Monkey运行的过程中,我们可以通过结束进程的方式来终止Monkey的运

行,当然在运行的过程中遇到异常、奔溃、等情况Monkey也会停止。为了保证执行

的事件数执行完整我们可以通过调试选项的设置来防止在运行过程中Monkey命令提

前结束

--ignore-crashes 忽略在应用程序出现crash(崩溃)时monkey停止 

--ignore-timeouts 忽略在应用程序出现ANR(无响应)时monkey停止

--ignore-security-exceptions  (security安全 exceptions 异常)

忽略在应用程序出现许可时monkey停止

例如:同时忽略以上三种错误

adb shell monkey -p app包名 -s 1001 --throttle 1000 --ignore-crashes

--ignore-timeouts --ignore-security-exceptions -v-v-v 100

>C:\Users\Desktop\applog1.txt

 案例:adb shell monkey -p  com.baidu.yuedu  -s 1001 --throttle 1000 --ignore-crashes  --ignore-timeouts --ignore-security-exceptions -v-v-v 100  >D:\f\xyz.txt

7-2、Monkey练习题:

1. Monkey练习:

对百度阅读进行稳定性测试,要求:模拟用户的触摸操作,并执行时间12小

时,忽略crashes与anr报错,并输出日志以及稳定性测试报告

===================================================

4) 参数:  --throttle <毫秒>

用于指定用户操作(即事件)间的时延,单位是毫秒;

* 示例:adb shell monkey -p com.htc.Weather –throttle 3000 100

5) 参数:  --ignore-crashes

用于指定当应用程序崩溃时(Force& Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。

*示例1:adb shellmonkey -p com.htc.Weather --ignore-crashes 1000

  测试过程中即使Weather程序崩溃,Monkey依然会继续发送事件直到事件数目达到1000为止;

示例2:adb shellmonkey -p com.htc.Weather 1000

测试过程中,如果Weather程序崩溃,Monkey将会停止运行。

5.禁用进程

如果想中断运行中的monkey CTRL+C

adb shell ps | grep monkey  返回进程号

adb shell kill [刚才查到的进程号]

6.查看包名

A、手机安装包名查看器'

B、aapt命令:  aapt dump badging  *.apk

C、源码下AndroidManifest.xml文件查看(需要将apk解压)

D、adb logcat抓取当前Android机运行的app的包名命令行输入adb logcat > e:\bag.txt

手机操控app,ctrl+c停止,去e:\bag.txt这个文件下搜索关键字如Displayed ,一般都能找到!

 
 

参考:https://www.cnblogs.com/fighter007/p/8249851.html

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐