一 部署准备

项目地址

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 5,6,7,8
  - 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 5,6,7,8
注 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 模式,因5的accessibiltyserver缺少一个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/


↙↙↙阅读原文可查看相关链接,并与作者交流