Monkey 入门

Monkey 入门

1.什么是Monkey

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

2.Monkey的特征

(1)测试的对象仅为应用程序包,有一定的局限性。
(2) Monky测试使用的事件流数据流是随机的,不能进行自定义。
(3)可对MonkeyTest的对象,事件数量,类型,频率等进行设置。

3.关于Monkey测试的停止条件

Monkey Test执行过程中在下列三种情况下会自动停止:
(1)如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
(2)如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
(3)如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
通过多次并且不同设定下的Monkey测试才算它是一个稳定性足够的程序。

4.Monkey的基本用法

4.1基本语法

(1)  $ adb shell monkey [options]
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。
下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:

adb shell monkey -p your.package.name -v 500 。
adb shell monkey -p your.package.name -vvv 500 > monkeytest.txt

-p表示对象包
-v为 verbose的缩写(信息级别就是日志的详细程度),就是详细输出事件等级,这个3个v就是输出等级1至3的所有事件.(使用管道命令将输出结果放到一个文本里面方便查看)。

4.2Monkey命令参数介绍

4.2.1参数 -p

参数-p用于约束限制,用此参数指定一个或多个包(Package,即App)。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。
(1)指定一个包:adb shell monkey -p com.htc.Weather 100
说明:com.htc.Weather为包名,100是事件计数(即让Monkey程序模拟100次随机用户事件)。
(2) 指定多个包:adb shell monkey -p com.htc.Weather –p com.htc.pdfreader-pcom.htc.photo.widgets 100
    执行apk集合:

monkey –pkg-blacklist-file /data/blacklist.txt -c <options> -s <seed><限制语句> --throttle <milliseconds> -v 执行次数> C:\blacklist_test.txt  //执行黑名单以外的应用

monkey –pkg-whitelist-file /data/whitelist.txt -c <options> -s <seed><限制语句> --throttle <milliseconds> -v 执行次数>C:\whitelist_test.txt  //执行白名单的应用

(3)不指定包:adb shell monkey 100
说明:Monkey随机启动APP并发送100个随机事件。

4.2.2 参数-v

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

adb shell monkey -p com.htc.Weather –v 100

说明:缺省值,仅提供启动提示、测试完成和最终结果等少量信息。

(2)日志级别Level 1

示例:

adb shell monkey -p com.htc.Weather –v -v 100

说明:提供较为详细的日志,包括每个发送到Activity的事件信息。

(3)日志级别Level 2
示例:

adb shell monkey -p com.htc.Weather –v -v –v 100

说明:最详细的日志,包括了测试中选中/未选中的Activity信息。

4.2.3 参数:-s

用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。
示例:
   Monkey测试1:adb shell monkey -pcom.htc.Weather –s 10 100
   Monkey测试2:adb shell monkey -pcom.htc.Weather –s 10 100
    两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的。

  ** *   PS: 伪随机测试***

   Monkey test是伪随机测试,也就是说,操作都是随机产生的。我这次发现了bug,但是我再次运行同样的命令,bug就不再出现了。

这里需要简单的讲一下随机和伪随机。真正的随机,是完全不可重复和定义的。也就是说,从理论上是无法定义下一个随机数到底是什么。那么在计算机里,能不能实现随机数呢?  至少到目前,还不行。那我们用的随机数都是哪里来的呢?我们现在常用的是一种伪随机算法,也就是说无限接近随机,但是没法完全达到随机。

伪随机算法都需要一个种子。一系列的随机数,一般的做法就是把上一个随机数作为下一个随机数的种子。可以这么理解,伪随机数算法相当于是一个函数,入口是一个种子,出口是一个伪随机数。我们可以无限逼真的制造种子,例如种子里面加入当前时间的因子,加入计算机一些硬件编码的因子,以保证伪随机数足够的“随机”,但是,我说的是但是,相同的种子,出来的伪随机数还是相同的。
前面说的一切,重点就是最后一句话:相同的种子,出来的伪随机数还是相同的。
    现在,我们再来理解monkey test。测试开始的时候,monkey会根据一个伪随机数种子,后面的序列将根据这个伪随机数种子依次产生。也就是说,第二次操作的种子是第一个操作的伪随机数,第三次操作的种子是第二次操作的伪随机数。也就是说,我们第一个给的种子相同,那么monkey test的操作序列就是一样的。
    我们再来看monkey test的运行结果:
    ** System appears tohave crashed at event 48 of 500 using seed 0
    系统在500个操作的第48个操作里出现了异常,用的种子是0。0就是伪随机数的种子。
    我们下次想用相同的操作序列再现这个异常,只需要monkey -p com.android.browser -s 0 500
    当然,这个操作也是需要相同的起点的。也就是说,第一次monkey test之前,画面是停在空白主页面,第二次monkey test之前,画面停在淘宝网主页,那么即使使用相同的随机数种子,现象还是会不一样的。
    如果条件完全相同,随机数种子也给的是相同的,而现象还是不一样,异常还是不一定,那么,找找程序里是不是有什么不定因素。

4.2.4 参数: --throttle <毫秒>

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

示例:

adb shell monkey -p com.htc.Weather–throttle 3000 100

4.2.5 参数: --ignore-crashes

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

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

adb shell monkey -pcom.htc.Weather 1000

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

4.2.6 参数: --ignore-timeouts

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

4.2.7 参数:  --ignore-security-exceptions

用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。

4.2.8 参数:  --kill-process-after-error

用于指定当应用程序发生错误时,是否停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。

4.2.9 参数:  --monitor-native-crashes

用于指定是否监视并报告应用程序发生崩溃的本地代码。

4.2.10 参数:  --pct-{+事件类别}{+事件类别百分比}

用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比)。

(1)–pct-touch {+百分比}0

调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)

示例:adb shell monkey -p com.htc.Weather --pct-touch 10 1000

(2)–pct-motion{+百分比}1

调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)

示例:adb shell monkey -p com.htc.Weather --pct-motion 20 1000

(3)–pct-trackball{+百分比}2

调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)

示例:adb shell monkey -p com.htc.Weather --pct-trackball 30 1000

(4)–pct-nav{+百分比}3

调整“基本”导航事件的百分比(导航事件由来自方向输入设备up/down/left/right组成)。

示例:adb shell monkey -p com.htc.Weather --pct-nav 40 1000

(5)–pct-majornav{+百分比}4

调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)。

示例:adb shell monkey -p com.htc.Weather --pct-majornav 50 1000

(6)–pct-syskeys{+百分比}5

调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。

示例:adb shell monkey -p com.htc.Weather --pct-syskeys 60 1000

(7)–pct-appswitch{+百分比}6

调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。

示例:adb shell monkey -p com.htc.Weather --pct-appswitch 70 1000

(8)–pct-flip{+百分比}7

调整“键盘翻转”事件的百分比。

示例:adb shell monkey -p com.htc.Weather --pct-flip 70 1000

(9)–pct-anyevent{+百分比}8

调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等

示例:adb shell monkey -p com.htc.Weather–pct -anyevent 100 1000

  • 指定多个类型事件的百分比:

adb shell monkey -p com.htc.Weather --pct-anyevent 50

–pct-appswitch 50 1000

注意:各事件类型的百分比总数不能超过100%;

**    PS:**绿色的数字对应下面百分比对应的数字。比如下图中0:15.0%,表示分配–pct-touch事件15%。测试100次分配15次测试down-up。

image

**    ##**百分比控制##

如果在monkey参数中不指定上述参数,这些动作都是随机分配的,9个动作其每个动作分配的百分比之和为100%,我们可以通过添加命令选项来控制每个事件的百分比,进而可以将操作限制在一定的范围内。

总结

image

image

工作中为了保证测试数量的完整进行,我们一般不会在发生错误时立刻退出压力测试。    Monkey测试命令如下:

adb shell monkey –pcom.xy.android.junit–s 500 –ignore-crashes –ignore-timeouts –monitor-native-crashes–vv 1000 > /sdcard/log.txt

4.2.11参数 黑白名单

黑名单:不测试的应用。

白名单:只测试这部分应用。

不能同时设置黑名单和白名单。

选项说明

–pkg-blacklist-file

PACKAGE_BlACKLIST_FILE

apk黑名单,屏蔽掉黑名单中的apk

–pkg-whitelist-file

PACK_WHITELIST_FILE

apk白名单,只测试包含在白名单中的apk

以黑名单为例,具体的步骤如下:

(1)查找系统的包,并输出到e盘的pkg文档里。adb shell pm listpackage>e:\pkg.txt

(2)将想要加入黑名单的apk的包名放到blacklist.txt里,最后push进设备。adb push e:\blacklist.txt /data/local/tmp/

(3)执行Monkey命令。adb shell monkey --pkg-blacklist-file /data/local/tmp/blacklist.txt–throttle 200 200

5.使用Monkey流程

总的来说使用monkey进行测试是比较简单的,只是需要做一些比较复杂的准备工作。下面详解测试步骤(很简单的哦),所讲内容是建立在已经配置好ADB环境的基础上(如果这部分不清楚请先google一下先配置好环境,这里不做描述)。

1、搭建环境:jdk&SDK for windows(http://blog.csdn.net/u011649536/article/details/36187645)

2、ADB连接Android测试设备。

3、确定你要测试的应用的PackageName。

4、使用Monkey发一条测试命令。

5.1 ADB连接Android测试设备.

5.1.1.使用模拟器

那么启动后通常是已经连在ADB上了。

Adb devices

5.1.2.使用真机

(1)方式一:使用USB把Android设备接到PC上,然后装上驱动(不好找驱动的话就用豌豆荚吧)。

(2)方式二:首先得确保你的Android已经成功root了,那么可以使用wifi无线连接。

①下载一个wifi adb应用装在你的android设备上;

②在android上打开wifi adb;

③在pc上的命令行中输入wifi adb中显示的那部分内容:adb connect 192.168.x.x,命令行中显示connected 192.168.x.x那么说明连接好了。

比较推荐方式二,这样可以不用去下载驱动(主要是驱动很多都不稳定),而且不伤害电池。长时间插在USB上对电池始终是不好的。只不过这种方式设备一旦休眠那么就可能需要重连。

5.2 确定要测试的应用的PackageName。

5.2.1 通用的方法

(1)在android设备上点击一下你要测试的设备,然后就不用操作设备了。

(2)在PC上的命令行输入:adb logcat>D:/log.txt *:I

在这里的D:/log.txt可以改成其他的路径,但是一定要先确保路径下没有这个文件,不然的话以前的文件就被改掉了,一定要小心。且log日志是在保存在手机,而不是PC。

(3)按下Ctrl+c先停掉(为了避免过多的新信息)。打开刚刚的那个文件D:/log.txt。  从文件最下面开始找下面格式的信息。

I/ActivityManager(数字): Displayed 包名/类名: +数字ms

例如信息如下:

I/ActivityManager(272): Displayed com.vane/.act.ActLauncher:+315ms

不过可能会发现有很多这种格式的信息,到底哪个才是你需要的呢,如果严格按照刚刚的步骤做的话,那么很可能是最下面那条信息,即使不是那么也肯定是最下面几条信息中的某一条,这需要你根据应用进行辨别。

(4)记下刚刚得到的包名,例子中的包名为“com.vane”。马上就会用。

5.2.2 root后的设备查找PackageName

Adb shell cd data/data

5.3使用Monkey发一条测试命令。

直接在pc上的命令行输入:adb shell monkey -p com.vane -v 50

备注:上面命令中的com.vane就是之前获得的包名;命令中的参数你可以自己根据需要参考上面的参数文档进行修改。

5.4 观察android设备,直到Monkey停止。

如果应用崩溃的话就好分析一下Monkey中的信息。

5.5 检查测试是否完成

通过info.txt文件,可以查看Monkey是否执行成功。如下图

image

6 adbserver is out of date的解决办法

6.1出错原因

adb的端口被其他程序的进程占领了,所以要做的就是找到并kill该进程。一般情况下,使用adb的时候最好不要使用各种手机助手、手机管家一类的软件,如果PC上有类似软件,先关闭对应进程,会大大减少这类问题出现。

6.2解决方案

(1)在cmd中执行adbnodaemon server,查看adb的端口号是多少,一般情况下是5037。

(2)再执行netstat -ano |

findstr “5037”(端口号)。

image

这里稍微解释一下,显示的从左到右的意思分别是,连接类型(TCP)、本地地址和端口、外部地址和端口、连接状态、进程的PID号。这里有两个进程占据着 5037端口,其中一个占据的是本地的5037端口,另外一个占据的是外部的5037端口,要kill的就是那个本地的PID为240的端口。

(3)打开任务管理器。点击进程,现在要找的是PID为240的进程。(有时候可能会发现任务管理器里没有进程PID的信息显示,这时候只要点击任务管理器的查看–>选择列,如下图,然后把PID勾选上即可。)把PID为240的进程kill掉。然后再运行adb命令。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值