关于移动端稳定性测试之Maxim自动化测试框架的使用
一、介绍
Maxim是基于 Android Monkey 二次开发,实现高速点击的 Android Monkey 自动化工具
优点:
a. 速度快 每秒10-15个Action事件
b. Android全平台兼容
c. 防跳出
d. 防休眠
e. 熔断机制
f. 场景细粒度
g. 随机自动输入
h. 崩溃堆栈自动保存
二、下载
下载地址:https://github.com/zhangzhao4444/Maxim
安装jdk,android sdk,配置环境变量
vi ~/.bash_profile
#Setting PATH for Python 3.11
export PATH=${PATH}:/Library/Frameworks/Python.framework/Versions/3.11/bin
alias python="/Library/Frameworks/Python.framework/Versions/3.11/bin/python3.11"
export PATH=${PATH}:/Library/Frameworks/Python.framework/Versions/3.11/bin
alias pip="/Library/Frameworks/Python.framework/Versions/3.11/bin/pip3"
export PATH="$PATH:/usr/local/bin/python3.11"
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home
JMETER_HOME=/Applications/apache-jmeter-5.5
PATH=$JAVA_HOME/bin:$JMETER_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/bin/tools.jar:$JAVA_HOME/lib/dt.jar:$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar
ANDROID_HOME=/Users/smzdm/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/tools/lib
export PATH=$PATH:$ANDROID_HOME/build-tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/build-tools/33.0.1
export ANDROID_HOME
export JAVA_HOME
export PATH
export CLASSPATH
将 framework.jar, monkey.jar push 到手机上某个目录中,比如/sdcard
adb push framework.jar /sdcard
adb push monkey.jar /sdcard
查看连接
smzdm@smzdmdeMacBook-Pro ~ % adb devices
List of devices attached
b330895b device
执行命令
smzdm@smzdmdeMacBook-Pro ~ % adb shell
cepheus:/ $ CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p uni.UNI996F7C0 --uiautomatormix --running-minutes 120 --throttle 300 -v -v -v >/sdcard/monkeyout.txt 2>/sdcard/monkeyerr.txt
tv.panda.test.monkey.Monkey: monkey入口类,不要修改
uni.UNI996F7C0: 为包名,根据实际情况更改
--uiautomatormix: 遍历策略
--running-minutes 120: 执行时长120分钟
2>/sdcard/monkeyerr.txt:如果运行过程中出现崩溃卡死,错误文件会保存在这里
三、策略支持
模式 DFS
--uiautomatordfs 增加深度遍历算法
模式 Mix
--uiautomatormix 直接使用底层accessibiltyserver获取界面接口 解析各控件,随机选取一个控件执行touch操作。 同时与原monkey 其他操作按比例混合使用 默认accessibilityserver action占比50%,其余各action分剩余的50% accessibilityserver action占比可配置 --pct-uiautomatormix n
模式Troy
--uiautomatortroy 控件选择策略按max.xpath.selector配置的高低优先级来进行深度遍历,会按 1first 2select 3last 执行并屏蔽 black 来遍历。
保留原始monkey
通过黑白名单控制,限定在某些场景内执行自动遍历。如只测试某几个相关页面,awl.strings文件配置如下,添加上需要运行或者不运行的activity,配置好后别忘记adb push awl.strings /sdcard
查看当前Activity
adb shell dumpsys activity | grep ResumedActivity
com.panda.videoliveplatform.activity.WelcomeActivity
com.panda.videoliveplatform.activity.SplashWakeActivity
com.panda.videoliveplatform.activity.MainFragmentActivity
com.panda.videoliveplatform.activity.LiveRoomActivity
--act-whitelist-file /sdcard/awl.strings 定义白名单,只执行awl.strings文件配置的Activity
--act-blacklist-file /sdcard/awl.strings 定义黑名单,跳过awl.strings文件配置的Activity的执行
其他
对于需要登录才能进入的app,可以先手动进行登录;
登录后可能会自动退出,可以屏蔽掉登出按钮,或者通过脚本方式执行,屏蔽掉该登出坐标。
四、配置
1.随机输入
前置条件:需要在设备上安装支持的ADBKeyBoard.apk,并启动该输入法,会显示 ADB Keyboard{ON}
1.拉取apk
git clone https://github.com/senzhk/ADBKeyBoard.git
2.安装apk
adb -s 设备号 install ADBKeyboard.apk
3.测试是否正常:设备屏幕上进入到有可输入文本组件的Activity,然后PC端执行
smzdm@smzdmdeMacBook-Pro test % adb devices
List of devices attached
b330895b device
smzdm@smzdmdeMacBook-Pro test % adb -s b330895b install ADBKeyBoard.apk
Performing Streamed Install
Success
smzdm@smzdmdeMacBook-Pro test % adb -s b330895b shell input text "123"
smzdm@smzdmdeMacBook-Pro test % adb -s b330895b shell input text "000"
smzdm@smzdmdeMacBook-Pro test %
4.配置 max.config 中 max.randomPickFromStringList = true
5.在max.strings文件上配置默认支持输入的字符内容
666666
2333
good
备注:max.strings配置文件需要发到设备机上
adb push max.strings /sdcard
2.max.config
# 启动后sleep 6秒
max.startAfterNSecondsofsleep = 6000
# 唤醒页面后sleep 4秒
max.wakeupAfterNSecondsofsleep = 4000
# 是否开启截图,默认false
# 默认存储在设备上/sdcard文件夹下
# 也可参数自定义存储路径,执行命令添加参数--output-directory /sdcard/max
max.takeScreenShot = false
# 崩溃回溯式截图:当崩溃发生时 进行截图保存,实现可回溯崩溃场景,默认会在 /sdcard/crash_$timestamp
# 回溯区间大小 xx 张;配合--imagepolling 参数使用
max.flushImagesThreshold =xx
# 是否保存当前页面PageSource,默认xml格式
max.savePageSource = false
max.saveCurrentEventPoint = false
1.截图及dump xml
max.takeScreenShot = true 开启截图
max.savePageSource = true 保存xml
截图的生效条件: throttle > 200 && max.takeScreenShot = true
案例: adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatormix --running-minutes 6 -v -v --throttle 400 --output-directory /sdcard/max1/
备注:每分钟100-200截图,故因大量截图对手机空间要求较高,仅为复现崩溃时建议开启截图
2.崩溃回溯截图
max.takeScreenShot =True 开启截图
max.flushImagesThreshold =50 回溯区间大小xx张
运行时shell增加 --imagepolling 参数 , 开启崩溃回溯截图、关闭原截图逻辑
当崩溃发生时 进行截图保存,实现可回溯崩溃场景,默认会在 /sdcard/crash_$timestamp/图
截图的生效条件: throttle > 200 && max.takeScreenShot = true && --imagepolling
3.特殊事件max.xpath.actions 配置
[
{
"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
}]
},
{
"prob": 1,
"actions": [
{
"xpath": "//*[@class='android.view.View']",
"index": 0,
"action": "KEYEVENT",
"keycode": 4,
"throttle": 1000
}]
}
]
上述包含3个特殊事件
发生概率prob =1 为100%发生
仅当 当前activity 为 `tv.panda.account.activity.WebLoginActivity` 时或无activity配置时做事件查找
xpath 为待查找控件的xpath 支持复杂型xpath,支持 index 索引选择
throttle 为该特殊步骤执行完后sleep n 毫秒
Action 支持
Click 点击匹配到的xpath控件
INPUTTEXT 在匹配到的xpath控件中输入 text 指定字符,输入需要提前安装adbkeyboard
TOUCH 点击指定坐标 args = (x,y)
SWIPE 按执行路径滑动 args = (x1,y1,x2,y2,step)
KEYEVENT 执行键盘事件 keycode
注 配置完成后请贴在 json.cn 检查格式,注意” : , 非中文
将该文件 push 到 `/sdcard/max.xpath.actions`
adb push max.xpath.actions /sdcard
4.屏蔽黑控件或黑区域max.widget.black
1.配置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时 做黑检查 三种方式:
仅配置bounds 屏蔽某个区域,在该区域内的控件或坐标不会被点击。
配置xpath 查找匹配的控件,屏蔽点击该控件。
xpath+bounds 查找匹配的控件,当控件存在时屏蔽指定的区域。
注 配置完成后请贴在 json.cn 检查格式,注意” : , 非中文
2.配置完成后,将文件推送到设备上:
adb push max.widget.black /sdcard
5.控件优先级max.xpath.selector
参考Troy模式配置max.xpath.selector json文件
[
{
"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')]" }
]
}
]
配置完成后,一定要文件推送到设备上:
adb push max.xpath.selector /sdcard
指定命令
CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p uni.UNI996F7C0 --uiautomatortroy --running-minutes 5 --throttle 300 -v -v -v >/sdcard/monkeyout.txt 2>/sdcard/monkeyerr.txt
6.随机测试多个app
adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey --uiautomatormix --running-minutes 150 -v -v --system /sdcard/apps.strings
apps.strings格式如下:
com.panda.videoliveplatform
com.google.android.calculator
com.android.chrome
其中每个app随机跑5-15分钟
更多推荐
所有评论(0)