目录
前言·声明
学习自动化的初衷不是为了提高代码可靠性,而是为了作弊——数据造假。既然有绩效考核指标,软件的使用率或是转化率需要达到**,否则就扣钱。但最终,我摒弃了初衷,改为学习自动化测试技术。希望看到此文的人,可以正确的使用它。
Monkey介绍
猴子乱跳,Monkey则像猴子一样在APP上乱点。如果程序出现崩溃,基于出现过的问题就有可能再次出现的理论,发版前必须关闭这些出现的崩溃。因此,Monkey是压力和稳定性测试的功能。其位于手机上的/system/bin/monkey.jar,是Android系统自带的。
Monkey命令行参数说明
配置完Android SDK 后,在Dos下运行:adb shell monkey 得到结果如下:

提示没有设备或模拟器。此处可以说明Monkey是在手机上的,而不在Android SDK内部。接上设备或模拟器再试,结果如下:

要说明的参数都在上方的截图里了。
https://www.android-doc.com/tools/help/monkey.html 官网API接口说明,可查阅。
adb shell monkey [options] COUNT
其中最后的是执行次数,必填!
参数分为三类(完全按个人理解私自分类,换句话讲,不为官方类别):
1.只带一个横线的参数:
-h :帮忙
-p :限定特定的包名==限定特定的应用(当然是想测试那款,而不是设备上所有的应用)
-c :类别名,是特定的Activity,即<main-category>参数。如果不指定,monkey选择Intent.CATEGORY_LAUNCHER 和 Intent.CATEGORY_monkey里的Activity。
-s :种子值,“乱跳”也是伪随机,它需要一个种子值。用于复现问题。因为相同的种子值会产生相同的随机事件。若不加,结果内会自动生成一个值。
-v :Log日志等级,最高三级,即:-v -v -v
-f :后面加Monkey脚本路径,执行Monkey脚本。
2.带两个横线的事件参数:
--ptc-touch : 后面接点击事件百分比。即:点击事件的次数等于百分比乘以COUNT。
--ptc-*** : 对应相应事件的百分比,再如:动作、导航、滑动、按键等事件。
所以--ptc-***事件后跟的百分比累加不可超过1.
3.带两个横线的调试参数:
--dbg-no-events : 进行初始启动,进入到某个测试Activity中不会进一步生成事件。
--hprof : 慎用。生成的分析报告会很大,再不明确需要的时候不用使用。
--ignore-crashes : 程序发生崩溃,脚本继续执行,忽略异常。不加的话,程序异常时,脚本退出执行。建议添加。
--ignore-*** :同上,如超时、权限。
--kill-process-after-error :出错进,将通知系统停止发生错误的进程。
--monitor-native-crashes :监视并报告崩溃事件。
--throttle <milliseconds> 每条指令间加上固定的间隔时间,单位ms
命令行实践:
adb shell monkey -p com.hello.monkey.test -v -v -v --ignore-crashes 10
Monkey脚本编写说明
当前的知识还不能满足的我初衷,我需要执行特定的操作,而且要执行好多好多次。所以需要学习下Monkey脚本,让Monkey执行特定的“伪随机”事件。
type = raw events
count = 10
speed = 1.0
start data >>
LaunchActivity(com.hello.monkey,com.hello.monkey.splash.SplashActivity)
#等待splash加载完成
#点击搜索框
captureDispatchPointer(10,10,0,550,130,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,550,130,1,1,-1,1,1,0,0)
#进入搜索页
UserWait(2000)
#点击搜索框,弹出键盘
captureDispatchPointer(10,10,0,550,130,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,550,130,1,1,-1,1,1,0,0)
UserWait(1000)
#进行搜索框内容输入
captureDispatchString(gcg)
#发送Enter键
captureDispatchPress(66)
#发送搜索键
captureDispatchPress(84)
#等待搜索响应,进行结果页
UserWait(1000)
#点击进行播放
captureDispatchPointer(10,10,0,1000,130,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,1000,130,1,1,-1,1,1,0,0)
#跳转播放等待
UserWait(5000)
captureDispatchPointer(10,10,0,500,460,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,500,460,1,1,-1,1,1,0,0)
UserWait(5000)
#从播放页返回到搜索结果页
captureDispatchPress(4)
UserWait(3000)
#从搜索结果页返回到首页
captureDispatchPress(4)
UserWait(3000)
#双back退出app
captureDispatchPress(4)
然后运行脚本:
adb shell monkey -f /mnt/sdcard/hellomonkey -v -v -v 10
【注】:此处有坑,必须把脚本放于手机上,否则会报错。脚本命名可以不加文件后缀
adb push hellomonkey /mnt/sdcard
怎样写出这样的脚本,这要从源码说起。源码也是官方API的来源(或许也是唯一来源)
源码位置:/development/cmds/monkey/src/com/android/commands/monkey/
其中MonkeySourceScript.java在类开头有一段如下注释:
33/**
34 * monkey event queue. It takes a script to produce events sample script format:
35 *
36 * <pre>
37 * type= raw events
38 * count= 10
39 * speed= 1.0
40 * start data >>
41 * captureDispatchPointer(5109520,5109520,0,230.75429,458.1814,0.20784314,0.06666667,0,0.0,0.0,65539,0)
42 * captureDispatchKey(5113146,5113146,0,20,0,0,0,0)
43 * captureDispatchFlip(true)
44 * ...
45 * </pre>
46 */
函数说明:
// event key word in the capture log
90 private static final String EVENT_KEYWORD_POINTER = "DispatchPointer";
91
92 private static final String EVENT_KEYWORD_TRACKBALL = "DispatchTrackball";
93
94 private static final String EVENT_KEYWORD_ROTATION = "RotateScreen";
95
96 private static final String EVENT_KEYWORD_KEY = "DispatchKey";
97
98 private static final String EVENT_KEYWORD_FLIP = "DispatchFlip";
99
100 private static final String EVENT_KEYWORD_KEYPRESS = "DispatchPress";
101
102 private static final String EVENT_KEYWORD_ACTIVITY = "LaunchActivity";
103
104 private static final String EVENT_KEYWORD_INSTRUMENTATION = "LaunchInstrumentation";
105
106 private static final String EVENT_KEYWORD_WAIT = "UserWait";
107
108 private static final String EVENT_KEYWORD_LONGPRESS = "LongPress";
109
110 private static final String EVENT_KEYWORD_POWERLOG = "PowerLog";
111
112 private static final String EVENT_KEYWORD_WRITEPOWERLOG = "WriteLog";
113
114 private static final String EVENT_KEYWORD_RUNCMD = "RunCmd";
115
116 private static final String EVENT_KEYWORD_TAP = "Tap";
117
118 private static final String EVENT_KEYWORD_PROFILE_WAIT = "ProfileWait";
119
120 private static final String EVENT_KEYWORD_DEVICE_WAKEUP = "DeviceWakeUp";
121
122 private static final String EVENT_KEYWORD_INPUT_STRING = "DispatchString";
123
124 private static final String EVENT_KEYWORD_PRESSANDHOLD = "PressAndHold";
125
126 private static final String EVENT_KEYWORD_DRAG = "Drag";
127
128 private static final String EVENT_KEYWORD_PINCH_ZOOM = "PinchZoom";
129
130 private static final String EVENT_KEYWORD_START_FRAMERATE_CAPTURE = "StartCaptureFramerate";
131
132 private static final String EVENT_KEYWORD_END_FRAMERATE_CAPTURE = "EndCaptureFramerate";
133
134 private static final String EVENT_KEYWORD_START_APP_FRAMERATE_CAPTURE =
135 "StartCaptureAppFramerate";
136
137 private static final String EVENT_KEYWORD_END_APP_FRAMERATE_CAPTURE = "EndCaptureAppFramerate";
中文整理可见:
https://www.cnblogs.com/yizhou-xu/p/8072813.html
https://blog.youkuaiyun.com/liming066/article/details/82462878
https://www.cnblogs.com/YatHo/p/7205162.html
Monkey脚本使用必备点
getevent 和 input keyevent
脚本编写最难的就是获取位置信息,之前Monkey是乱点,现在你想定制下它的行为,那么就需要告诉它应该点哪吧。这就需要了解getevent。输入内容则需求了解keyevent。
DOS下运行:
adb shell getevent
此时界面光标处于等待状态,然后在待测应用上点击,此时DOS会打印出一行行信息。


信息格式:设备名 Type Code Value
TYPE = 0000 是同步事件;
TYPE = 0003是绝对坐标(源码中EV_ABS变量)
关注下绝对坐标类型下的Code,Code = 0035:椭圆中心绝对坐标X;Code = 0036:椭圆中心绝对坐标Y;
由此可知刚才的点击位置是(851,4aa)。当前是十六进制的坐标值。
DOS下运行:adb shell getevent -p


找到了对应设备的X和Y坐标取值范围。在分辨率不同的手机上可以直接计算转化。转化思想就是百分比。
接下来就是键值了keyevent。从哪查到的呢?当然也是源码。
详见:https://www.android-doc.com/reference/android/view/KeyEvent.html
小结:
到此,所有的Monkey知识点都包括了,当然,我也实现了初衷,只是并没有应用。开心的是我除了了解Monkey外,还想了解MonkeyRunner。下一篇吧
本文详细介绍Android平台上的Monkey自动化测试工具,包括Monkey的基本概念、命令行参数、脚本编写及使用技巧等内容。通过学习,读者可以掌握如何利用Monkey进行有效的压力和稳定性测试。
4万+

被折叠的 条评论
为什么被折叠?



