认识Monkey
什么是Monkey
- 又指“猴子测试”,是指没有测试经验对计算机根本不了解的人,不知道任何程序的交互知识,给他一个程序,就会针对他看到的页面进行操作。这种测试方式在产品早期会找到很多bug,为用户节省不少的时间。
- Android的SDK 里面,Monkey的tools是一个命令行工具,当连接Android设备时,只要在命令行里输入相应命令就能运行tools。
- Monkey是Androld中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。
Monkey在哪里
每台android手机里都有Monkey工具,但是我们是看不到的,因为在普通用户的手机上Monkey不是一个可视化的工具,例如手机里的微信,这是一个可视化的,能打开,有图形化界面,但是Monkey没有,除非我们手机能进入工程模式,因为在各个厂家中有不同的内部monkey可视化工具。
Money优缺点
优点:
- 简单易用;
- 方便快捷;
- 理论上只要运行事件次数足够多可以测试到所有bug。
缺点:
遍历界面有限, 在monkey测试中,由于事件的随机性,使得monkey容易卡在某些简单页面,比如登陆页面这种可操作内容很少的页面。导致测试效果不佳。测试有效性大打折扣;
无法得知Bug的复现步骤。由于Monkey的随机性,如果Bug是由于事件发生的特定序列产生的,往往很难复现Bug;
路径回环,由于monkey太过随机,最后根本无法控制,很容易陷于一个页面无法出来,或者陷入某个无关紧要的地方无法出来,导致测试结果并不具有很好的意义。这也是导致遍历界面有限的原因。
什么是Monkey Test
- Monkey test是一项压力测试,可以在规定的次数范围内做任何随机的操作,随机操作包括点击、滑动、应用切换、横竖屏、应用关闭等等,用户能做的操作统统可以模拟。
- Monkey test跑出来crash的bug等级永远为1,版本release前,Monkey跑出的结果中crash要为0。业内标准:final release前,Monkey跑完的总次数应为25W次,其结果里不允许有nullPointException出现。
- 用于进行压力测试, 开发人员结合monkey 打印的日志 和系统打印的日志,得到测试中出现的问题。
Monkey 测试策略
单个apk的验收测试时,使用单一apk且不忽略异常的命令执行
单个apk的解决问题的测试时,使用单一apk且忽略异常的命令执行。这样可以在一次执行的过程中发现应用程序中的多个问题。
单个apk的应用程序的压力/健壮性测试时,主要缩短monkey测试中事件与事件之间的延迟时间,验证在快速的事件响应的过程中,程序是否能正常运行。将–throttle的值设定为500或者更小,一般都使用500毫秒的延迟事件。
在进行apk的集合测试(测试对象为多个APP)时,对于高频率使用的apk、长时间使用的apk都要包含在执行的应用程序中
APK分类具体:
高频率使用的apk如:Phone、Contacts、Message、Settings、File Manager、Gallery、Input Method
长时间使用的apk如:Phone、Browser、Music player、Camera、Video player、Email、Chat
其他的apk如:Calendar、Notepad、Calculator、FM Radio、Google Search
Monkey与电脑、手机的关系
借助ADB
才能与Monkey进行通讯。
所需环境搭建
搭建环境
SDK下载
1、下载jdk:https://blog.csdn.net/weixin_43731532/article/details/125204502?spm=1001.2014.3001.5501
2、下载sdk:https://blog.csdn.net/weixin_45638642/article/details/122139997手机环境
1、打开手机的开发者调试工具,用usb数据线连接你的手机
2、通过adb命令连接手机
在CMD下输入:
adb connect 127.0.0.1:21503
(具体端口看模拟器上的端口,真机连接可以百度查找方法);检查是否连接成功:
adb devices
;
前期准备
1、执行Monkey测试前,一定要确保屏幕处于解锁状态。
2、设置屏幕超时时间为最大时间(设置->显示->休眠->30分钟或者从不)。以防测试过程中手机锁屏,影响Monkey测试。
3、抓取adb log,(如果出现anr,需要将/data/anr下的anr log拿出来,需要手机有root权限)。
4、在连接模拟器/真机后,查看手机所有安装包和安装的所有第三方安装包。
查看所有安装包:adb shell pm list packages
查看所有的第三方安装包:adb shell pm list packages -3
Monkey测试命令
基本命令
1 | adb shell monkey -s 1080 -p 包名 –hprof --ignore-timeouts --ignore-crashes --ignore-security-ecxeptions -v -v --throttle 200 1000000 |
拆分讲解:
1)-p
用于约束限制,用此参数指定一个或多个包(Package)。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。
2)–ignore-crashes
用于指定当应用程序崩溃时(Force & Close 错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,知道事件计数完成。
3)–ignore-timeouts
用于指定当应用程序发生ANR(APPlication No Responding)错误时Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。
4)–ignore-security-ecxeptions
用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。
5)-v
用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下所示:
①日志级别:Level0
示例:adb shell monkey -p com.android.contacts -v –throttle 200 1000000
缺省值,仅提供启动提示、测试完成和最终结果等少量信息。
②日志级别:Level1
示例:adb shell monkey -p com.android.contacts -v -v –throttle 200 1000000
提供较为详细的日志,包括每个发送到Activity的事件信息。
③日志级别:Level2
示例:adb shell monkey -p com.android.contacts -v -v -v –throttle 200 1000000
提供最详细的日志,包括了测试中选中/未选中的Activity信息。
6)–throttle
在每次操作(即事件)间的延时,单位是毫秒,一般我们设置延时时间为500ms。比较接近人的手动操作,如果在测试中发生了anr,可以将间隔设置为500ms,进行测试验证。
7)-s
s其实就是seed,它是随机数的事件序列定一个值,若出现问题下次可以重复同样的序列进行排错。例如上面其实就是指定了一个seed为1080的随机事件序列
8)–hprof
指定了该参数,Monkey会在发送事件序列的前、后,生成性能分析报告。通常会在data/misc目录下生成一个5MB左右大小的文件
- APP在操作过程中会存在崩溃、超时、异常等情况,导致monkey直接停止测试。忽略这些异常崩溃可继续执行,直到执行随机时间次数达到设定值。
- 我们在测试过程中,建议不要忽略这些异常,尽可能的暴露出app中存在的问题,如果选择忽略出现crach,anr等现象,手机中就不会有提示,不便于判断测试是否正常。忽略异常是想要对此模块执行完成,尽可能多的发现更多问题,但是这个问题的判断只能通过log去分析,不便于测试的判断。所以我们测试建议使用下边的命令:
adb shell monkey -p 包名 -v -v -v –throttle 500 360000 >D:monkeylog.txt
事件参数解释
Event percentages:
0:–pct-touch
events percentage触摸事件百分比(触摸事件是一个在屏幕单一位置的按下-抬起事件)
1:–pct-motion
events percentage手势事件百分比(手势事件是由一个在屏幕某处的按下事件、一系列的伪随机移动、一个抬起事件组成)即一个滑动操作,但是是直线的,不能拐弯
2:–pct-pinchzoom
zoom events percentage二指缩放百分比,即智能机上的放大缩小手势操作
3:–pct-trackball 即单纯的Move(ACTION_MOVE)
events percentage轨迹球事件百分比(轨迹球事件包括一个或多个随机移动,有时还伴有点击。轨迹球现在智能手机上已经没有了,就是类似手柄的方向键一样)
4:–pct-rotation
rotation events percentage屏幕旋转百分比,横屏竖屏
5:–pct-nav 基本导航事件。即来自于方向输入设备的上下左右操作。
events percentage”基本”导航事件百分比(导航事件包括上下左右,如方向输入设备的输入)老手机的上下左右键,智能机上没有
6:–pct-majornav 即Navigation Bar的确认,菜单,返回键等
nav events percentage”主要”导航事件百分比(这些导航事件通常会引发UI的事件,例如5-way pad的中间键、回退键、菜单键)
7:–pct-syskeys(key)
operations percentage”系统”按钮事件百分比(这些按钮一般专供系统使用,如Home, Back, Start Call, End Call,音量控制)
8:–pct-appswitch
switch events percentage 启动activity事件百分比。在随机的间隔里,Monkey会执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法
9:–pct-flip
flip percentage键盘轻弹百分比,如点击输入框,键盘弹起,点击输入框以外区域,键盘收回
10:–pct-anyevent 该事件可能包含其他上述事件。
percentage其他类型事件百分比。包括了其他所有的类型事件,如按键、其他不常用的设备上的按钮等等
当不作任何配置的时候,默认为–pct-anyevent
,此时所有事件的触发均为随机的。当所有事件的百分比加起重来小于100%的时候,多余的随机事件也将被转化为–pct-anyevent 事件。超过时,系统会重新运算相应的比例
其他参数
1 -c: activity必须至少包含一个指定的category,才能被启动,否则启动不了;
2 –dbg-no-events:初始化启动的activity,但是不产生任何事件。为了得到最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换
3 –kill-process-after-error:发生错误后直接杀掉进程
4 –monitor-native-crashes:跟踪本地方法的崩溃问题
5 –wait-dbg:直到连接了调试器才执行monkey测试。
6 –help:打印帮助信息
完整例子
1 | adb shell monkey -p oct.mama -s 100 --throttle 10 --ignore-crashes --ignore-timeouts --monitor-native-crashes --pct-appswitch 30 --pct-majornav 20 --pct-nav 20 --pct-touch 20 --pct-motion 10 -v -v -v 10000 > D:\monkey_log.txt |
手动结束测试
目标:当压力测试运行时间较长时,我们可能希望手动停止压力测试。
背景:假设我们设置了运行50万个随机事件,然后断开电脑和手机的连接,发现monkey还在跑。
原因:PC端只用于输入配置参数和启动命令,手机作为运行命令,即使断开连接也不影响手机端运行。
1 | adb shell monkey -p com.example.hello 500000 |
步骤:
用数据线把手机和电脑连接
进入adb shell
查看monkey进程id
1
ps|grep monkey
杀掉monkey进程
1
kill 28734(id)
确认monkey进程是否还在
1
ps|grep monkey
结果分析
一般的错误分析步骤:
- 找到是monkey里面的哪个地方出错
- 查看Monkey里面出错前的一些事件动作,并手动执行该动作
- 若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样–复现
一般的测试结果分析:
ANR问题:在日志中搜索“ANR”
崩溃问题:在日志中搜索“Exception”
基本内容解析:Monkey运行时输出的日志一般包含四类信息,分别是测试命令信息、伪随机事件流信息、异常信息、Monkey执行结果信息。
测试命令信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28-----随机种子,执行事件的数目-----
:Monkey: seed=1639214805777 count=100
-----可运行的应用列表-----
:AllowPackage: com.ss.android.article.news
-----表示启动的活动-----
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
-----表示打开的活动-----
// Selecting main activities from category android.intent.category.LAUNCHER
// Seeded: 1639214805777
-----各事件的百分比-----
// 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%日志中会显示进行各种操作的百分比:其含义会随着Android版本的不同而不同,为了了解其含义,首先使用如下命令查看Android版本
1
adb shell getprop ro.build.version.release
查询结果
通过阅读对应版本的money源码中的MonkeySourceRandom.java文件,可以看到其Event序列是
1
2
3
4
5
6
7
8
9
10
11
12public static final int FACTOR_TOUCH = 0;
public static final int FACTOR_MOTION = 1;
public static final int FACTOR_PINCHZOOM = 2;
public static final int FACTOR_TRACKBALL = 3;
public static final int FACTOR_ROTATION = 4;
public static final int FACTOR_NAV = 5;
public static final int FACTOR_MAJORNAV = 6;
public static final int FACTOR_SYSOPS = 7;
public static final int FACTOR_APPSWITCH = 8;
public static final int FACTOR_FLIP = 9;
public static final int FACTOR_ANYTHING = 10;
public static final int FACTORZ_COUNT = 11;所以对应的事件解释为
1
2
3
4
5
6
7
8
9
10
11// 0: 15.0% 触摸事件TOUCH,--pct-touch
// 1: 10.0% 手势事件MOTION, --pct-motion
// 2: 2.0% 两指缩放事件PINCHZOOM,--pct-pinchzoom
// 3: 15.0% 轨迹球事件TRACKBALL,--pct-trackball
// 4: -0.0% 屏幕旋转事件ROTATION, --pct-rotation
// 5: 25.0% 基本导航事件nav, --pct-nav
// 6: 15.0% 主要导航事件majornav, --pct-majornav
// 7: 2.0% 系统按钮事件sysops, --pct-syskeys
// 8: 2.0% 启动activity事件appswitch, --pct-appswitch
// 9: 1.0% 键盘轻弹事件flip, --pct-flip
// 10: 13.0% 其它事件,包括按键和不常用的按键,--pct-anyevent伪随机时间流信息
Monkey开始执行测试后,会顺序输出执行的事件流信息。
1
2
3
4
5
6
7
8
9
10
11-----跳转到com.android.article.news里的activity.MainActivity这个活动-----
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.ss.android.article.news/.activity.MainActivity;end
-----允许启动com.android.article.news里的activity.MainActivity这个活动-----
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.ss.android.article.news/.activity.MainActivity } in package com.ss.android.article.news
-----延迟(可以在命令参数中设置延迟)-----
Sleeping for 0 milliseconds
-----触摸事件-----
:Sending Touch (ACTION_DOWN): 0:(842.0,1801.0)执行结果信息
1
2
3
4
5
6
7
8
9
10-----产生了100次事件-----
Events injected: 100
-----表示屏幕旋转信息-----
:Sending rotation degree=0, persist=false
-----表示丢弃的事件信息-----
:Dropped: keys=1 pointers=0 trackballs=0 flips=0 rotations=0
-----网络状态-----
# Network stats: elapsed time=700ms (0ms mobile, 0ms wifi, 700ms not connected)
-----最终执行结果-----
// Monkey finished详细分析monkey日志
将执行Monkey生成的log,从手机中导出并打开查看该log;
在log的最开始都会显示Monkey执行的seed值、执行次数和测试的包名;
分析log中的具体信息,方法如下:
查看log中第一个Switch,主要是查看Monkey执行的是那一个Activity,譬如下面的log中,执行的是com.tencent.smtt.SplashActivity,在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在;
1
2
3: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.smttSending Pointer ACTION_MOVE 代表当前执行了一个滑动界面的操作。
1
2:Sending Pointer ACTION_DOWN x=47.0 y=438.0
:Sending Pointer ACTION_MOVE x=-2.0 y=-4.0如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间;**// Monkey finished**代表执行完成。Monkey执行中断,在log的最后也能查看到当前已执行的次数。Monkey执行完成的log具体如下:
1
2
3
4Events injected: 6000
:Dropped: keys=0 pointers=9 trackballs=0 flips=0
\## Network stats: elapsed time=808384ms (0ms mobile, 808384ms wifi, 0msnot connected)
// Monkey finishedSending Pointer ACTION_DOWN和Sending Pointer ACTION_UP代表当前执行了一个单击的操作;
Sleeping for 500 milliseconds这句log是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件;
SendKey(ACTION_DOWN) //KEYCODE_DPAD_DOWN 代表当前执行了一个点击下导航键的操作;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=wfh.LessonTable/.MainTable;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=wfh.LessonTable/.MainTable } in package wfh.LessonTable
Sleeping for 0 milliseconds
:SendKey (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT
:SendKey (ACTION_UP): 21 // KEYCODE_DPAD_LEFT
Sleeping for 0 milliseconds //--------用--throttle来设置一个起效的事件发生后时延时。
:Sending Pointer ACTION_DOWN x=0.0 y=0.0
:Sending Pointer ACTION_UP x=0.0 y=0.0
Sleeping for 0 milliseconds
:Sending Pointer ACTION_MOVE x=0.0 y=0.0当测试到ACTION_MOVE x=0.0 y=0.0这个动作时,发生了FC(Force Close)错误,以下为输出错误信息。同时在LogCat里面也有错误输出,而且LogCat里面的错误信息更为详细,在实际的测试中应该结合两者输出的信息进行调试程序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33// CRASH: wfh.LessonTable (pid 1973)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException
// Build Label: android:generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/test-keys
// Build Changelist: 35983
// Build Time: 1273161972
// ID:
// Tag: AndroidRuntime
// java.lang.NullPointerException:
// at android.widget.TabHost.dispatchKeyEvent(TabHost.java:279)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)
** Monkey aborted due to error.
Events injected: 190
:Dropped: keys=0 pointers=11 trackballs=0 flips=0
# Network stats: elapsed time=27954ms (27954ms mobile, 0ms wifi, 0ms not connected)
** System appears to have crashed at event 190 of 200 using seed 0开始monkey测试时android的LogCat输出的信息:
1
2
3
4
511-01 08:52:53.712: DEBUG/AndroidRuntime(2077): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
11-01 08:52:53.742: DEBUG/AndroidRuntime(2077): CheckJNI is ON
11-01 08:52:54.453: DEBUG/AndroidRuntime(2077): ---以下为LogCat输出的错误信息,在以下的信息中首先从自己的包中找错误,如果没有自己的包的话就再找发生错误的包的第一个发生了异常。由错误提示可以看出很大的可能是因为TabHost引发的异常。经过查看代码发现是由于TabHost的编写不规范,TabHost与其中一个view放在了一起,在monkey测试做滚球上下滚动时当滚到TabHost时就发生了异常了。所以把TabHost与Activity分开写就不会出现些问题了。
1
2
3
4
5
6
711-01 08:53:27.113: ERROR/AndroidRuntime(1973): Uncaught handler: thread main exiting due to uncaught exception
11-01 08:53:27.133: ERROR/AndroidRuntime(1973): java.lang.NullPointerException
11-01 08:53:27.133: ERROR/AndroidRuntime(1973): at android.widget.TabHost.dispatchKeyEvent(TabHost.java:279)
11-01 08:53:27.133: ERROR/AndroidRuntime(1973): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)其他分析方法
在日志中搜索关键字
1)搜索报告中的关键字“ANR”,看有无应用无响应的事件(Application Not Responding)
2)搜索报告中的关键字“crash”,看有无崩溃的事件
3)搜索报告中的关键字“exception”,看有无其他异常事件。(如果出现空指针, NullPointerException,需格外重视)
下面的属于monkey自己的问题。不用管。
1
2
3
4
5:Sending Flip keyboardOpen=false
Got IOException performing flipjava.io.IOException: write failed: EINVAL (Invalid argument)
// Injection Failed4)内存泄露问题搜索”GC”(需进一步分析)
初步分析法: monkey出现错误后,一般的分析步骤
1)先找到出现错误的位置
2)查看出现错误之前2个switch之间的activity
3)手动执行事件,复现问题
4)若以上步骤还不能找出,产生错误时,有会seed值,输入相同的seed值,重新按照之前命令跑monkey
详细分析法
1) ANR问题:在日志中搜索“ANR”(“Application Not Responding”),说明有bug,出现ANR,一般是主线程的响应超过5秒,或者BroadcastReceiver没有在10秒内作出响应。这个就是一个比较严重的缺陷。把耗时的操作另起线程来处理就可以了。
2)分析log中的具体信息:
查看log中第一个Switch,主要是查看Monkey执行的是那一个Activity,譬如下面的log中,执行的是com.tencent.smtt.SplashActivity,在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
1
2
3: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.smtt3)内存泄漏
a、内存泄漏弹出out of memory对话框
b、对于有内存泄漏但是没有单出out of memory对话框的情况,可以通过logcat文件GC出信息,(GC:java的垃圾回收机制)
GC_FOR_ALLOC:因为在分配内存时候内存不够引起的
GC_EXPLICIT:表明GC被显式请求触发的,如System.gc调用,
GC_CONCCURRENT:表明GC在内存使用率达到一定的警戒值时候,自动触发
GC_BEFORE_OOM:表明在虚拟机抛出内存不够异常oom之前,执行最后一次回收内存垃圾c、发现内存泄露–内存报告分析(利用hprof参数的内存快照生成内存报告)
1
2在发现内存泄露后,可以执行相同的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查看或通过手机助手查看
- 文件转换:配置monkey测试时的sdk-tools下查看是否hprof-conv命令,在命令行输入hprof-conv -help得知文件转化用法,直接转化就行,由.hprof转化成.conv格式。
- 转化后的文件用eclipse的Memory Analyzer tool(MAT)查看(此插件可以下载),可以点击 Reports->Leak Suspects链接来生成报告。
结果分析脚本
首先第一步安装Android SDK,完成后。编写测试脚本,此脚本已经编写好来源于网络。具体大家可以从网上Google针对自己的情况再进行详细的编改。
新建一个文件命名为:xxx.bat
复制粘贴以下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162@ECHO OFF
ECHO.:::::::::::::::::::::::::::::::::::::::::::::::::
ECHO.:: 分析Monkey日志 ::
ECHO.:: 版本:V1.0.0 ::
ECHO.:::::::::::::::::::::::::::::::::::::::::::::::::
REM 设置Monkey日志路径
SET monkeyLogFile=%cd%\%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%.txt
REM 方法二:直接将Monkey日志拖到此bat文件上
IF NOT "%1"=="" (
SET monkeyLogFile=%1
) ELSE (
ECHO.[ INFO ] Monkey执行中...
REM Monkey执行命令
adb shell monkey -p com.jd.b2r --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 30000 > "%monkeyLogFile%"
)
ECHO.[ INFO ] Monkey日志: %monkeyLogFile%
ECHO.[ INFO ] 开始分析
SET blnException=0
ECHO.
ECHO.
REM 如果觉得分析太快,没有感觉,把下面注释去掉假装分析中,有停顿感
ping -n 2 127.0.0.1>nul
::ANR日志
FOR /F "delims=" %%a IN ('FINDSTR /C:"ANR" %monkeyLogFile%') DO (
SET strANR=%%a
)
::崩溃日志
FOR /F "delims=" %%a IN ('FINDSTR /C:"CRASH" %monkeyLogFile%') DO (
SET strCRASH=%%a
)
::异常日志
FOR /F "delims=" %%a IN ('FINDSTR /C:"Exception" %monkeyLogFile%') DO (
SET strException=%%a
)
::正常
FOR /F "delims=" %%a IN ('FINDSTR /C:"Monkey finished" %monkeyLogFile%') DO (
SET strFinished=%%a
)
IF NOT "%strANR%" == "" (
ECHO.[ INFO ] 分析Monkey日志存在: ANR
ECHO.[ INFO ] ------------------------------------
ECHO. "%strANR%"
SET /a blnException+=1
ECHO.
)
IF NOT "%strCRASH%" == "" (
ECHO.[ INFO ] 分析Monkey日志存在: CRASH
ECHO.[ INFO ] ------------------------------------
ECHO. "%strCRASH%"
SET /a blnException+=1
ECHO.
)
IF NOT "%strException%" == "" (
ECHO.[ INFO ] 分析Monkey日志存在: 异常
ECHO.[ INFO ] ------------------------------------
ECHO. "%strException%"
SET /a blnException+=1
)
IF NOT "%strFinished%" == "" (
ECHO.[ INFO ] 分析Monkey日志存在: 执行成功标记
ECHO.[ INFO ] ------------------------------------
ECHO. "%strFinished%"
ECHO.
) ELSE (
IF %blnException% EQU 0 ECHO.[ INFO ] 分析Monkey日志结果: Monkey执行异常中断,请重新执行Monkey脚本!
ECHO.
)
REM 如果blnException不为0,说明存在异常,改变字体为淡紫色
IF %blnException% NEQ 0 (
Color 0D
ECHO.[ INFO ] 分析Monkey日志结果:存在异常日志,请手工再仔细检查!
ECHO.
) ELSE (
ECHO.[ INFO ] 分析Monkey日志结果:正常
ECHO.
)
ECHO.
ECHO.[ EXIT ] 按任意键关闭窗口...
PAUSE>nul对脚本进行二次编辑
1)获取包名:
①aapt dump badging [XXaaayy.apk],例如:package: name=’com.jddl.rbr’
②只记得大概,不记得详细包名。例如adb shell pm list packages b2
2)修改命令
adb shell monkey -p com.jddl.rbr --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 100000 > "%monkeyLogFile%"
中的包名,如:com.jddl.rbr3)修改monkey执行次数:-v -v -v 100000,这个100000代表执行100000次点击。
4)保存,连接手机,打开手机开发调试模式
5)Monkey命令停止:cmd命令下输入adb shell 进入命名模式,执行命令ps | grep monkey 查看进程ID,kill +进程ID,杀掉进程
- 本文作者: 小邓同学
- 本文链接: https://dyasher.github.io/2022/10/18/Monkey——自动化测试/
- 版权声明: 该文章版权归作者DYaher所有,未经授权其他任何机构和个人不得以盈利为目的非法转载和使用。违反此声明者,本人将依法追究其法律责任。