一、常见问题
1、功能问题
- app 某特定界面崩溃
- app 某接口报错或修改导致老版本数据显示异常
- 某页面详情页特定信息字段内容丢失或数据异常
- 老功能不可用,如微信分享功能
2、兼容性问题
- 网络慢时发出请求退出该页面,当前页面崩溃
- 某些界面在 4.4 或 5.5 系统上操作体验不同
二、测试痛点
1、无法用自动化测试覆盖所有测试场景
- 没有采用合理的分层测试体系,错误的将接口层的测试放在 UI 层
- 没有采用 PageObject 模式,快速迭代的页面变化导致自动化用例维护成本高
- 对自动化框架掌握程度不够,弹窗处理,框架不稳定等情况出现就无法应对
- 自动化测试无法很好支撑一些特殊场景如弱网、某本电子小说翻 1000 页,断言不够灵活
2、测试内容与场景太多导致手工测试无法充分覆盖
- 界面需要校验的字段多
- 接口正确性:后端接口传输数据的变化和内容
- 专项测试回归难度大:内存泄漏、健壮性测试、弱网等测试过程太多
- 回归工作量大:不回归又会漏测
三、思考与改进
基于以上问题,我们需要进行合理的分层测试设计,比如:
- UI自动化测试覆盖核心业务场景和流程,而且主要专注于UI和功能跳转是否正常的验证,接口的验证交给接口自动化测试去做
- 手工测试主要覆盖新功能的测试、探索性的测试以及各种专项测试
- 自动遍历测试主要覆盖那些人工无法覆盖或者覆盖起来成本非常高的场景,比如内存泄漏检测、基础功能回归、兼容性测试、弱网测试等
四、常见的自动遍历工具
??传统的 monkey 测试只能作为稳定性测试 / 兼容性测试工具,且容易卡在某些简单页面,比如登陆页面这种可操作内容很少的页面,又或者经常停留在同一个页面,导致测试效果不佳。但这也给了我们很多的启发,因此就有很多大厂或开发者就尝试对传统的 monkey 测试进行改造,如下(不完全):
-
Google 原生Monkey Android:https://developer.android.com/studio/test/monkey -
Google的App Crawler Android:https://developer.android.com/training/testing/crawler -
阿里 Macaca的NoSmoke 双端:https://macacajs.github.io/NoSmoke/zh/ -
熊猫zhangzhao的Maxim Android:https://github.com/zhangzhao4444/Maxim -
熊猫zhangzhao的Fastmonkey iOS:https://github.com/zhangzhao4444/Fastmonkey -
字节的Fastbot Android:https://github.com/bytedance/Fastbot_Android iOS:https://github.com/bytedance/Fastbot_iOS -
SwiftMonkey iOS:https://github.com/zalando/SwiftMonkey -
蚂蚁金服 vigossjjj 的 smart_monkey iOS:https://github.com/vigossjjj/CrashMonkey4IOS
五、Maxim的使用
??An efficient Android Monkey Tester, available for emulators and real devices 基于遍历规则的高性能Android Monkey,适用于真机/模拟器的APP UI压力测试 官方文档:Maxim官方文档 与monkey对比优势:
- 多种随机测试模式:dfs(深度遍历) mix模式(monkey随机测试+控件识别) troy模式(按照控件选择器进行遍历)
- 速度快 (每秒10-15个Action事件)
- 稳:只进行有意义的操作,防误点状态栏,不会乱断网、卸载应用、防止跳出
- 支持脱机运行,错误日志可以记录到手机本地
- 支持自定义:控件黑白名单,自定义操作步骤,控件操作优先级
- 兼容多个Android版本、截图支持
5.1 环境预备
支持 Android 5,6,7,8,9、10、11真机及模拟器; 将 framework.jar , monkey.jar push 到手机上某个目录中,建议/sdcard
adb push framework.jar /sdcard
adb push monkey.jar /sdcard
5.2 运行方法
cmd 命令 :
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 60 -v -v
tv.panda.test.monkey.Monkey : monkey入口类,不要修改com.panda.videoliveplatform : 被测app包名,需要修改--uiautomatormix : 遍历策略
??运行结束后在结果文件中,搜索crash,not responding,和你测试的包名,找出崩溃卡死等信息。
5.3 参数说明
1、兼容 google 官方 monkey 测试参数,如-p <package_name> --throttle 300 -s 300 -v -v -v 2、测试策略
--uiautomatormix :Mix模式(70% 控件解析随机点击,其余 30% 按原 Monkey 事件概率分布),直接使用底层 accessibiltyserver 获取界面接口解析各控件,随机选取一个控件执行 touch 操作--pct-uiautomatormix n :可自定义混合模式中控件解析事件概率--uiautomatordfs : DFS 模式,深度遍历(除 android 5)--uiautomatortroy :Troy 模式,控件选择策略,按max.xpath.selector配置的高低优先级来进行深度遍历--act-whitelist-file /sdcard/awl.strings :定义白名单,awl.strings控制只在几个特定的 activity 里跑--act-blacklist-file /sdcard/abl.strings :定义黑名单,abl.strings控制跳转不会进入到几个特定的 activity 里--running-minutes 60 :设置执行时间(分钟)
5.4 高级用法详解
- 随机输入max.strings
- 黑白名单awl.strings和abl.strings
对跳转做更细粒度控制,比如控制仅在几个特定 Activity 中跑 monkey adb 命令中需添加参数 --act-whitelist-file /sdcard/awl.strings 定义白名单 --act-blacklist-file /sdcard/abl.string 定义黑名单
com.panda.videoliveplatform.activity.WelcomeActivity
com.panda.videoliveplatform.activity.SplashWakeActivity
com.panda.videoliveplatform.activity.MainFragmentActivity
com.panda.videoliveplatform.activity.LiveRoomActivity
- 配置max.config
控制 app 启动和唤醒后等待时间、开启截图和开启随机输入开关,保存 pagesource 开关,崩溃回溯图片区间张数
max.startAfterNSecondsofsleep = 6000
max.wakeupAfterNSecondsofsleep = 4000
max.takeScreenShot = true
max.flushImagesThreshold = 20
max.savePageSource = false
max.saveCurrentEventPoint = false
max.randomPickFromStringList = true
takeScreenShot :开启截图flushImagesThreshold :崩溃回溯区间图片张数,且需要在 adb 命令中加入参数–imagepolling
- 特殊事件序列max.xpath.actions
指定界面确定性步骤,例如登录(需提前安装 ADBKeyBoard)
[
{
"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:发生概率
- activity:可选,指定则仅在设置的activity(adb shell dumpsys window w | grep mCurrent) 执行action
- xpath:控件的xpath,resource-id,class,text,content-desc或contains模糊定位(可参考博客xpath元素定位方法 )
- action: click,inputtext,touch,swipe,keyevent
特殊事件的 log 如何查看?
- Maxim运行开头会打印出load的Special Event
- 解析生成tree结构如0|2|1|2|5|6,…表示index|height|depth|childCount|descendantCount,className,contentDesc,text,xpath,clickable,rect,然后针对xpath进行查找,找到则打印Find it
- 黑空间和黑区域屏蔽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]"
}
]
- 仅配置bounds屏蔽某个区域,在该区域内的控件或坐标不会被点击
- 仅配置xpath查找匹配的控件,屏蔽点击该控件
- 同时配置xpath+bounds则查找匹配的控件,当控件存在时屏蔽指定的区域
- Troy模式max.xpath.selector
控制控件优先级 控件选择策略会按 1first 2select 3last 执行并屏蔽 black 来执行遍历
[
{
"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')]" }
]
}
]
5.5 常用的配置
adb push framework.jar /sdcard
adb push monkey.jar /sdcard
adb install ADBKeyBoard.apk
adb shell rm -rf /sdcard/Android/data/.dzh
adb shell pm clear com.android.dazhihui
adb shell rm -rf /sdcard/log_error_dzh.txt
adb push max.xpath.actions /sdcard
adb push max.config /sdcard
adb push max.strings /sdcard
adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --throttle 500 --imagepolling --uiautomatormix --running-minutes 60 -v -v>D:/monkey.log
adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --throttle 500 --imagepolling --uiautomatordfs --running-minutes 60 -v -v>D:/monkey.log
5.6 Appetizer应用
??下载 AppetizerIO:APP测试->UI压力测试,支持多种模式,黑白名单,所有配置文件(自动json语法查错),测试开始前自动push配置文件。
??Appstizer是桌面版的Android移动端测试工具,它集成了apk包管理,设备管理,自动化测试等功能,为Android端的测试提供了便利。
|