自动化工具 Maxim-高速 Android Monkey 工具使用记录

小马 · February 03, 2018 · Last by jint replied at February 13, 2019 · 6399 hits

一 部署准备

项目地址

https://github.com/zhangzhao4444/Maxim
https://testerhome.com/topics/11719

部署Maxim

快捷打开cmd, 视窗键+r 打开运行窗口后,输入cmd回车
D: 回车进入D:盘 准备直接git clone到D:盘根目录下

D:\>git clone https://github.com/zhangzhao4444/Maxim.git
Cloning into 'Maxim'...
remote: Counting objects: 70, done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 70 (delta 25), reused 60 (delta 15), pack-reused 0
Unpacking objects: 100% (70/70), done.

部署环境介绍

操作系统
快捷查看win系统版本, 视窗键+r 打开运行窗口后, 输入winver回车

Android Sdk
下载地址 http://tools.android-studio.org/index.php/sdk 处下载 android-sdk_r24.4.1-windows.zip
将android-sdk-windows解压到你需要的目录下,笔者是D:\Android\android-sdk-windows

配置android-sdk环境变量:
ANDROID_HOME 变量值为android-sdk的解压目录,笔者为D:\Android\android-sdk-windows
PATH PATH变量值的最后追加 ;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\build-tools;

接下来你便可以用D:\Android\android-sdk-windows 下的SDK Manager.exe下载配置SDK 或AVD Manager.exe 配置 AVD模拟器了。
如果你需要测试android应用的话,请先安装配置好某一版本的SDK及其相关工具。
如下图,SDK manager必要配置:
Tools->Options设置

其它要下载的:
此处为了与Macaca环境兼容,目前稳定没敢乱升级,大家也可用此.

此处的按需选择与AVD模拟器配套使用的

关于Android开发环境的大家可以参考此人的博客

Android SDK Manager和AVD Manager使用

Android开发环境配置

该步骤,主要是为了部署adb工具而已,当然也有独立部署adb的方案.这个你按需选择吧,不过你既然要搞android相关了,android sdk工具的部署最终还是逃不过的.

真机与模拟器
Android模拟器Genymotion
请参考http://www.iplaysoft.com/genymotion.html 自行安装配置

启动一模拟器后,用adb查看连接

D:\>adb devices -l
List of devices attached
192.168.60.101:5555 device product:vbox86p model:Samsung_Galaxy_S7___7_1_0___API_25___1440x2560 device:vbox86p

真机小米Mix2
需要开启真机开发者选项->USB调试, 模式和其他相关,主要是调试这一栏要打开的有

用adb查看连接

D:\>adb devices -l
List of devices attached
12345678 device product:chiron model:MIX_2 device:chiron

二查看使用帮助

Maxim目录下README.md

# Maxim 

> A Kotlin implementation of Monkey TEST(Non-Stub) for Android that runs on Simulator/Android devices.

https://testerhome.com/topics/11719

## 1. Requirements

- Android 5678
- Android5 not support dfs

## 2. Setup

- adb push framework.jar /sdcard
- adb push monkey.jar /sdcard
[- adb push ape.strings /sdcard]
[- adb push awl.strings /sdcard]

## 3. Usage

Maxim can be either started with adb command line.

- adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatordfs 5000

### 3.1 Args

[dfs mode] --uiautomatordfs monkey use DFS algorithm . About 5 action per second.

[mix mode] --uiautomatormix monkey use AccessibilityService resolve tree node and random choose. About 10-20 action per second.

--pct-uiautomatormix uiautomator action ratio in mix mode

--running-minutes n monkey total run time

--act-whitelist-file /sdcard/awl.strings
--act-blacklist-file

other args is same to Android Monkey

Maxim目录下 使用帮助.docx


【环境预备】
支持 android 5678
android 5不支持 dfs mode
framework.jar , monkey.jar push 到手机上某个目录中,比如/sdcard

【执行测试】
cmd 命令
adb shell CLASSPATH=/data/local/tmp/monkey.jar:/data/local/tmp/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatordfs 5000

蓝: monkey入口类
红: 被测app
绿: 测试策略

策略支持:

1. 模式 DFS
--uiautomatordfs
增加深度遍历算法

2. 模式 Mix
--uiautomatormix
直接使用底层accessibiltyserver获取界面接口 解析各控件,随机选取一个控件执行touch操作。
同时与原monkey 其他操作按比例混合使用
默认accessibilityserver action占比50%,其余各action分剩余的50%
accessibilityserver action占比可配置 --pct-uiautomatormix n

3. 保留原始monkey

4. 总运行时长
--running-minutes 3 运行3分钟

5. --act-whitelist-file /sdcard/awl.strings 定义白名单
--act-blacklist-file

其他参与与原始monkey一致

20180112 增加防跳出及切回、防误点状态栏及下拉状态栏
20180115 增加防睡眠及睡眠唤醒、防假死及自拉活机制
20180116 增加随机输入
随机输入 需要提前安装adbkeyboard
https://github.com/senzhk/ADBKeyBoard
随机输入默认随机输入字符,内容可自定义配置,格式如ape.strings文件,每行为随机输入项。
20180118 增加Activity黑白名单 格式如awl.strings,可对跳转做更细粒度控制,比如控制仅在几个特定Activity中跑monkey

20180119 framework兼容 Android5, 6, 7, 8.0
Android5 不支持dfs 模式,因5accessibiltyserver缺少一个api。故不支持
增加 APP崩溃时自动保存堆栈信息到 /sdcard/crash-dump.log 追加保存

参数说明

tv.panda.test.monkey.Monkey 主调入口  无需修改
-p com.panda.videoliveplatform 待测appid
策略模式

--uiautomatormix 混合模式(70%控件解析随机点击,其余30%按原Monkey事件概率分布)
--pct-uiautomatormix n 可自定义混合模式中控件解析事件概率
--uiautomatordfs DFS深度遍历算法(优化版)(注 Android5不支持dfs
非以上两种为原始Monkey策略

执行时长
--running-minutes 60 执行60分钟monkey

场景细粒度控制
--act-whitelist-file /sdcard/awl.strings 自定义Activity白名单
例:

com.panda.videoliveplatform.activity.WelcomeActivity
com.panda.videoliveplatform.activity.SplashWakeActivity
com.panda.videoliveplatform.activity.MainFragmentActivity
com.panda.videoliveplatform.activity.LiveRoomActivity
锁定跳转只可进入其中的某个Activity
--act-blacklist-file 同上

其他参数及用法同原始Monkey

三 测试

向手机部署Maxim相关

D:\>cd Maxim

D:\Maxim>dir
D:\Maxim 的目录

2018/02/03 10:08 <DIR> .
2018/02/03 10:08 <DIR> ..
2018/02/03 09:55 20 ape.strings
2018/02/03 09:55 447 ape.xpath.actions
2018/02/03 09:55 223 awl.strings
2018/02/03 09:55 1,149,240 framework.jar
2018/02/03 09:55 121,367 monkey.jar
2018/02/03 09:55 1,093 README.md
2018/02/03 09:55 33,644 使用帮助.docx
7 个文件 1,306,034 字节
2 个目录 85,022,330,880 可用字节

D:\Maxim>adb push framework.jar /sdcard
framework.jar: 1 file pushed. 5.1 MB/s (1149240 bytes in 0.214s)

D:\Maxim>adb push monkey.jar /sdcard
monkey.jar: 1 file pushed. 0.0 MB/s (121367 bytes in 2.628s)

执行

确认被测app packagename
这个请参考帖子Android 获取包名和 Activity 的几种方法

去替换掉 -p com.panda.videoliveplatform 为你的packagename

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.sinacp.ggaicai --uiautomatormix --running-minutes 3

走你~~~~~~~~~~~~~~~~~

我只能说太特么快了,快到本家的app,界面都来不及响应.
效果不错,这样我们的测试方案又多了一种了,以前的Appcrawler 这种适合做随机遍历 或者 定制业务流遍历,
加上Appetizer插桩后又可以性能捕获和分析监控了.
个人觉得,这种暴力遍历+性能捕获 更能测试App 稳定性,捕获的Appetizer分析报告,开发用了都说参考意义很大的咧.

剩下的要研究下那两个配置文件ape.strings和awl.strings,默认还支持mokey原生命令行参数.
稍后更新.

附上原生Monkey:
https://developer.android.com/studio/test/monkey.html
http://shark.farbox.com/post/xing-neng-ce-shi/monkeyyong-fa-zong-jie

四 更新补充

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.sinacp.ggaicai --uiautomatormix --running-minutes 3 --throttle 300 -v -v

太快的话,可以加上--throttle 300
--throttle作用:在事件之间插入固定的时间(毫秒)延迟,你可以使用这个设置来减缓Monkey的运行速度,如果你不指定这个参数,则事件之间将没有延迟,事件将以最快的速度生成。一般设置为300毫秒,原因是实际用户操作的最快300毫秒左右一个动作事件,所以此处一般设置为300毫秒

加上-v -v 可以调整日志输出级别
-v -v 作用:Level1(-v -v),提供了较为详细的测试信息,如逐个发送到Activity的事件信息。 这样在执行过程日志中,便可以看到遍历到的currentActivity当前被执行Activity名.

这个可以放入 黑白名单文件中awl.strings .如
--act-whitelist-file /sdcard/awl.strings 或 --act-blacklist-file /sdcard/awl.strings

整个工具并不难

五 (MIX模式) 增加支持 特殊事件序列

2018.02.23 update
需要配置 max.xpath.action 文件
案例:

[
{
"prob": 1,
"activity":"tv.panda.account.activity.WebLoginActivity",
"actions": [
{
"xpath": "//*[@class='android.widget.EditText']",
"action": "INPUTTEXT",
"text": "13810751000",
"index": 0,
"throttle": 300
},
{
"xpath": "//*[@class='android.widget.EditText']",
"action": "INPUTTEXT",
"text": "123400",
"index": 1,
"throttle": 300
},
{
"xpath": "//*[@content-desc='登录' and @class='android.view.View']",
"index": 0,
"action": "CLICK",
"throttle": 1000
}]
},
{
"prob": 1,
"actions": [
{
"xpath": "//*[@class='android.view.View']",
"index": 0,
"action": "SWIPE",
"args": "10,1000,800,1000,100",
"throttle": 3000
}]
},
{
"prob": 1,
"actions": [
{
"xpath": "//*[@class='android.view.View']",
"index": 0,
"action": "TOUCH",
"args": "500,1000",
"throttle": 1000
}]
}
]

上述包含3个特殊事件
发生概率 prob =1 为100%发生
仅当 当前activity 为 tv.panda.account.activity.WebLoginActivity 时或无activity配置时做事件查找
xpath 为待查找控件的xpath 支持复杂型xpath,支持 index 索引选择
throttle 为该特殊步骤执行完后sleep n 毫秒
Action 支持
1.Click 点击匹配到的xpath控件
2.INPUTTEXT 在匹配到的xpath控件中输入 text 指定字符,输入需要提前安装adbkeyboard
3.TOUCH 点击指定坐标 args = (x,y)
4.SWIPE 按执行路径滑动 args = (x1,y1,x2,y2,step)

注 配置完成后请贴在 json.cn 检查格式,注意” : , 非中文

以上是作者的更新,接下来我们来体验

D:\Maxim>git pull
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 21 (delta 7), reused 13 (delta 7), pack-reused 8
Unpacking objects: 100% (21/21), done.
From https://github.com/zhangzhao4444/Maxim
2fcc38f..d406b60 master -> origin/master
Updating 2fcc38f..d406b60
Fast-forward
README.md | 2 ++
max.config | 2 ++
ape.strings => max.strings | 0
ape.xpath.actions => max.xpath.actions | 0
monkey.jar | Bin 121367 -> 131805 bytes
test/ADBKeyBoard.apk | Bin 0 -> 163634 bytes
"test/max.xpath.actions \346\241\210\344\276\2131" | 27 ++++++++++++++++
"test/max.xpath.actions \346\241\210\344\276\2132" | 35 +++++++++++++++++++++
...5\277\347\224\250\345\270\256\345\212\251.docx" | Bin 33644 -> 102828 bytes
9 files changed, 66 insertions(+)
create mode 100644 max.config
rename ape.strings => max.strings (100%)
rename ape.xpath.actions => max.xpath.actions (100%)
create mode 100644 test/ADBKeyBoard.apk
create mode 100644 "
test/max.xpath.actions \346\241\210\344\276\2131"
create mode 100644 "
test/max.xpath.actions \346\241\210\344\276\2132"

在工程目录下D:\Maxim git pull 更新后,我们需要重新向连接的手机push framework.jar 和 monkey.jar

D:\Maxim>adb push framework.jar /sdcard
framework.jar: 1 file pushed. 5.1 MB/s (1149240 bytes in 0.214s)

D:\Maxim>adb push monkey.jar /sdcard
monkey.jar: 1 file pushed. 0.0 MB/s (121367 bytes in 2.628s)

先优先编辑好max.xpath.actions配置 注意格式 和 英文符号编写

[
{
"prob": 1,
"activity":"com.huasheng.stock.ui.usercenter.LoginUI",
"actions": [
{
"xpath": "//*[@resource-id='com.huasheng.stock:id/account_num']",
"action": "INPUTTEXT",
"text": "13699901888",
"index": 0,
"throttle": 760
},
{
"xpath": "//*[@resource-id='com.huasheng.stock:id/pwd']",
"action": "INPUTTEXT",
"text": "hshshshs",
"index": 0,
"throttle": 760
},
{
"xpath": "//*[@text='登录' and @class='android.widget.Button']",
"index": 0,
"action": "CLICK",
"throttle": 1600
}]
}
]

书写该配置需要学习使用界面元素捕获工具,主要是为了获取xpath该值

1 android sdk工具自带的 ** \tools\uiautomatorviewer.bat

2 appium-desktop 桌面版appium带的 inspector

3 Macaca 的 app-inspector

以上均可.

我遇到的问题是,这些元素捕获工具好像没有展示当前所捕获界面的Activity,所以我只能先 带参数-v -v 来从Maxim的执行过程日志里找到,登录界面的Activity

[Maxim] // : debug, currentActivity is com.huasheng.stock.ui.usercenter.LoginUI

同时注意,目前该Maxim版本,若要使用该max.xpath.actions配置,还需要将配置好的max.xpath.actions push到手机

 D:\Maxim>adb push max.xpath.actions /sdcard
max.xpath.actions: 1 file pushed. 0.0 MB/s (744 bytes in 0.101s)

同时注意,INPUTTEXT 在匹配到的xpath控件中输入 text 指定字符,输入需要提前安装adbkeyboard , 且还需要在手机中手动设置为当前输入法
该输入法工具 在工程目录D:\Maxim\test\ADBKeyBoard.apk 下.

D:\Maxim\test>adb install ADBKeyBoard.apk
Success

然后我们可以开始执行了:

D:\Maxim>adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.huasheng.stock --uiautomatormix --running-minutes 2 --throttle 680 -v -v

需要注意观察 Special Event该段读入特殊事件的日志 ,是否读入配置成功.

[Maxim] // Special Event:
[Maxim] // Event1:
[Maxim] // Prob: 1.0
[Maxim] // Actvity: com.huasheng.stock.ui.usercenter.LoginUI
[Maxim] // Step0:
[Maxim] // XPath: //*[@resource-id='com.huasheng.stock:id/account_num']
[Maxim] // XPathExpression: org.apache.xpath.jaxp.XPathExpressionImpl@d4cb746
[Maxim] // Action: INPUTTEXT
[Maxim] // Text: 13699901888
[Maxim] // Throttle: 760
[Maxim] // Step1:
[Maxim] // XPath: //*[@resource-id='com.huasheng.stock:id/pwd']
[Maxim] // XPathExpression: org.apache.xpath.jaxp.XPathExpressionImpl@fa58d07
[Maxim] // Action: INPUTTEXT
[Maxim] // Text: hshshshs
[Maxim] // Throttle: 760
[Maxim] // Step2:
[Maxim] // XPath: //*[@text='鐧诲綍' and @class='android.widget.Button']
[Maxim] // XPathExpression: org.apache.xpath.jaxp.XPathExpressionImpl@4df5e34
[Maxim] // Action: CLICK
[Maxim] // Text:
[Maxim] // Throttle: 1600

还有,该段日志来确认是否正确启用了adbkeyboard输入法

[Maxim] // InputMethod ID: InputMethodInfo{com.android.adbkeyboard/.AdbIME, settings: null}.id

OK 效果出来了.

六 (MIX模式)支持黑控件 黑区域屏蔽

2018.02.28 update

1.(MIX模式)支持黑控件 黑区域屏蔽

配置max.widget.black
案例

[
{
"activity":"com.panda.videoliveplatform.activity.MainFragmentActivity",
"xpath": "//[@class='android.widget.TextView' and @text='我的校园' and @resource-id='com.panda.videoliveplatform:id/tv_title']"
},
{
"activity":"com.panda.videoliveplatform.activity.MainFragmentActivity",
"xpath": "//
[@class='android.widget.TextView' and @text='车队' and @resource-id='com.panda.videoliveplatform:id/tv_title']",
"index": 0,
"bounds": "[0,633][900,789]"
},
{
"activity":"com.panda.videoliveplatform.activity.MainFragmentActivity",
"bounds": "[0,1107][900,1263]"
}
]
当且仅当 当前activity == 所配activity 或未配activity时 做黑检查
三种方式:
1.仅配置bounds
屏蔽某个区域,在该区域内的控件或坐标不会被点击。
2.配置xpath
查找匹配的控件,屏蔽点击该控件。
3.xpath+bounds
查找匹配的控件,当控件存在时屏蔽指定的区域。

注 配置完成后请贴在 json.cn 检查格式,注意” : , 非中文
将该文件 push 到 /sdcard/max.widget.black

以上是作者的更新,接下来我们来体验:
在工程目录下D:\Maxim git pull 更新后,我们需要重新向连接的手机push framework.jar 和 monkey.jar
先优先编辑好max.widget.black配置 注意格式 和 英文符号编写
xpath 就不多说了
今天来指导下什么是bounds属性,实际就是坐标值,在appium API 我们经常会用到 tap模拟手指点击
tap(self,positions,duration=None) 中的positions就是bounds属性坐标值.

如确定按钮的bounds属性坐标值.

如退出提示弹窗的bounds属性坐标值. 同样某一区域也有bounds属性坐标值,这样就可以屏蔽不点击某一activity下属的某一区域了.

编辑完同样需要将该文件 push 到 /sdcard
adb push max.xpath.actions /sdcard
好了 剩下的 就很简单了. 我就不啰嗦了.

七 TROY模式(支持特殊事件、黑控件等)

2018.03.22 update

TROY模式(支持特殊事件、黑控件等) 配置 max.xpath.selector troy控件选择子来定制自有的控件选择优先级,例子如下
[
{
"firstList":
[
{ "xpath": "//[contains(@text,'绝地求生')]" }
],
"selectList":
[
{ "xpath": "//
[@clickable='true']" },
{ "xpath": "//[@clickable='true']//[contains(name(),'Text')]" },
{ "xpath": "//[@clickable='true']//[contains(name(),'Button')]" },
{ "xpath": "//[@clickable='true']//[contains(name(),'Image')]" }
],
"lastList":
[
{ "xpath": "//[../[@selected='true']]" },
{ "xpath": "//[../..//[@selected='true']]" },
{ "xpath": "//
[../..//[@selected='true'] and contains(@resource-id,'tab_')]" },
{ "xpath": "//[contains(@resource-id,'HorizontalScrollView')]" }
],
"blackList":
[
{ "xpath": "//
[contains(@resource-id,'wrapper_in_custom_title_bar')]//[contains(@resource-id,'right_button')]" },
{ "xpath": "//
[contains(@resource-id,'share')]" }
]
}
]

控件选择策略 会按 1first 2select 3last 并屏蔽black 来执行遍历操作。

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatortroy --running-minutes 15 -v -v
另注 max.xpath.selector 需要push 到/sdcard/

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 19 条回复 时间 点赞

用户登录和九宫格解锁一块是支持的吗

卡斯 回复

登录属于特殊事件,现在还没实现好、后续会支持。

终于看到一个不用root手机的了,很赞,学习了

我用这个运行完一次之后,再次运行就运行不起来了,提示没有设备,杀掉adb后再重启adb服务也不行。是我的adb版本不匹配吗。
C:\Users\Administrator>adb start-server
adb server version (32) doesn't match this client (39); killing...
could not read ok from ADB Server

  • failed to start daemon error: cannot connect to daemon
zhanglimin 回复

C:\Users\cmd>adb devices -l
List of devices attached

  • daemon not running. starting it now on port 5037 * error: could not install smartsocket listener: cannot bind to 127.0.0.1:5037: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048) could not read ok from ADB Server
  • failed to start daemon * error: cannot connect to daemon

C:\Users\cmd>adb kill-server

  • server not running *

C:\Users\cmd>taskkill /f /im adb.exe
成功: 已终止进程 "adb.exe",其 PID 为 10480。
成功: 已终止进程 "adb.exe",其 PID 为 2740。
成功: 已终止进程 "adb.exe",其 PID 为 14784。
成功: 已终止进程 "adb.exe",其 PID 为 10364。

请尝试以上命令 adb kill-server 或 taskkill /f /im adb.exe

小马 回复

在我的进程里没有找到adb这个 重启电脑后好用了 谢谢

小马 回复

还有monkey的输出,Network stats: elapsed time= 115976 ms ( 0 ms mobile, 0 ms wifi, 115976 ms not connected ),我一直在连wifi,是不是这个时间不准确呢

zhanglimin 回复

这个确实有个bug 但一直没时间修改

zhanglimin 回复

Adb被占用 大概率是91或360手助占用了。杀掉进程就好

小马 回复

嗯 没有扣这么细 只是好奇。。没有把我的wifi给关掉,大部分时间在我指定的应用中已经挺好用了👍

14Floor has been deleted

Appetizer 可以生成本地报告集成到jenkins么 目前我看的是必须去Appetizer的客户端查看报告

小马 #18 · May 18, 2018 作者
HellenGo 回复

你走错片场了,这里是Maxim.... 你得去Appetizer区询问..

楼主写的这个使用记录好赞,试用的时候看这个好清楚👏 👏 👏

黑控件的话,光push max.widget.black就可以吗?
还需要添加命令参数吗

app 登录自带的键盘,怎么处理啊,目前登录一直过不了

小马 #22 · October 25, 2018 作者
Nicole 回复

同时注意,INPUTTEXT 在匹配到的xpath控件中输入 text 指定字符,输入需要提前安装adbkeyboard , 且还需要在手机中手动设置为当前输入法
该输入法工具 在工程目录D:\Maxim\test\ADBKeyBoard.apk 下.

D:\Maxim\test>adb install ADBKeyBoard.apk
Success

楼主在吗?
请教下:--act-blacklist-file 是起什么作用啊?我在--act-blacklist-file 的文件中加入activity,执行过程中,看到可以跳转到其他activity,并没有一直停留在配置的activity的操作

ovwane 移动专项测试学习总结_20190309 中提及了此贴 09 Mar 22:49
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up