Android自动化测试(一)——Monkey

本文详细介绍Android平台上的Monkey自动化测试工具,包括Monkey的基本概念、命令行参数、脚本编写及使用技巧等内容。通过学习,读者可以掌握如何利用Monkey进行有效的压力和稳定性测试。

目录

 

前言·声明

Monkey介绍

Monkey命令行参数说明

Monkey脚本编写说明

Monkey脚本使用必备点

小结:


前言·声明

学习自动化的初衷不是为了提高代码可靠性,而是为了作弊——数据造假。既然有绩效考核指标,软件的使用率或是转化率需要达到**,否则就扣钱。但最终,我摒弃了初衷,改为学习自动化测试技术。希望看到此文的人,可以正确的使用它。

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说明可参见:http://androidxref.com/8.0.0_r4/xref/development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java

怎样写出这样的脚本,这要从源码说起。源码也是官方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 &gt;&gt;
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。下一篇吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值