文章目录

  • 一、常见问题
  • 二、测试痛点
  • 三、思考与改进
  • 四、常见的自动遍历工具
  • 五、Maxim的使用
    • 5.1 环境预备
    • 5.2 运行方法
    • 5.3 参数说明
    • 5.4 高级用法详解
    • 5.5 常用的配置
    • 5.6 Appetizer应用

一、常见问题

1、功能问题

  • app 某特定界面崩溃
  • app 某接口报错或修改导致老版本数据显示异常
  • 某页面详情页特定信息字段内容丢失或数据异常
  • 老功能不可用,如微信分享功能

2、兼容性问题

  • 网络慢时发出请求退出该页面,当前页面崩溃
  • 某些界面在 4.4 或 5.5 系统上操作体验不同

二、测试痛点

1、无法用自动化测试覆盖所有测试场景

  • 没有采用合理的分层测试体系,错误的将接口层的测试放在 UI 层
  • 没有采用 PageObject 模式,快速迭代的页面变化导致自动化用例维护成本高
  • 对自动化框架掌握程度不够,弹窗处理,框架不稳定等情况出现就无法应对
  • 自动化测试无法很好支撑一些特殊场景如弱网、某本电子小说翻 1000 页,断言不够灵活

2、测试内容与场景太多导致手工测试无法充分覆盖

  • 界面需要校验的字段多
  • 接口正确性:后端接口传输数据的变化和内容
  • 专项测试回归难度大:内存泄漏、健壮性测试、弱网等测试过程太多
  • 回归工作量大:不回归又会漏测

三、思考与改进

基于以上问题,我们需要进行合理的分层测试设计,比如:

  1. UI自动化测试覆盖核心业务场景和流程,而且主要专注于UI和功能跳转是否正常的验证,接口的验证交给接口自动化测试去做
  2. 手工测试主要覆盖新功能的测试、探索性的测试以及各种专项测试
  3. 自动遍历测试主要覆盖那些人工无法覆盖或者覆盖起来成本非常高的场景,比如内存泄漏检测、基础功能回归、兼容性测试、弱网测试等

四、常见的自动遍历工具

  传统的 monkey 测试只能作为稳定性测试 / 兼容性测试工具,且容易卡在某些简单页面,比如登陆页面这种可操作内容很少的页面,又或者经常停留在同一个页面,导致测试效果不佳。但这也给了我们很多的启发,因此就有很多大厂或开发者就尝试对传统的 monkey 测试进行改造,如下(不完全):

  1. Google 原生Monkey
    Android:https://developer.android.com/studio/test/monkey

  2. Google的App Crawler
    Android:https://developer.android.com/training/testing/crawler

  3. 阿里 Macaca的NoSmoke
    双端:https://macacajs.github.io/NoSmoke/zh/

  4. 熊猫zhangzhao的Maxim
    Android:https://github.com/zhangzhao4444/Maxim

  5. 熊猫zhangzhao的Fastmonkey
    iOS:https://github.com/zhangzhao4444/Fastmonkey

  6. 字节的Fastbot
    Android:https://github.com/bytedance/Fastbot_Android
    iOS:https://github.com/bytedance/Fastbot_iOS

  7. SwiftMonkey
    iOS:https://github.com/zalando/SwiftMonkey

  8. 蚂蚁金服 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对比优势:

  1. 多种随机测试模式:dfs(深度遍历) mix模式(monkey随机测试+控件识别) troy模式(按照控件选择器进行遍历)
  2. 速度快 (每秒10-15个Action事件)
  3. 稳:只进行有意义的操作,防误点状态栏,不会乱断网、卸载应用、防止跳出
  4. 支持脱机运行,错误日志可以记录到手机本地
  5. 支持自定义:控件黑白名单,自定义操作步骤,控件操作优先级
  6. 兼容多个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 高级用法详解

  1. 随机输入max.strings
  2. 黑白名单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
  1. 配置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
  1. 特殊事件序列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 如何查看?

  1. Maxim运行开头会打印出load的Special Event
  2. 解析生成tree结构如0|2|1|2|5|6,…表示index|height|depth|childCount|descendantCount,className,contentDesc,text,xpath,clickable,rect,然后针对xpath进行查找,找到则打印Find it
  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]"}
]
  • 仅配置bounds屏蔽某个区域,在该区域内的控件或坐标不会被点击
  • 仅配置xpath查找匹配的控件,屏蔽点击该控件
  • 同时配置xpath+bounds则查找匹配的控件,当控件存在时屏蔽指定的区域
  1. 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
  • Mix
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
  • DFS
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端的测试提供了便利。

自动遍历测试方法及常见技术相关推荐

  1. 03-17 APP自动遍历测试技术

    monkey 是一个在模拟器或者设备上运行的程序,用于生成用户事件的伪随机流 安装 Android SDK 自带 使用 基本配置选项 adb shell monkey 100 # 对所有包随机操作 1 ...

  2. 自动化测试的理想境界:AppCrawler自动遍历工具

    内容来源:2017 年 6 月 24 日,TesterHome联合创始人黄延胜在"Testwo第一届测试分享沙龙"进行<App crawler自动遍历工具>演讲分享.I ...

  3. 自动驾驶_测试场景技术发展与应用_2020

    2022.7.8启 本文依据 机械工业出版社--<2020_自动驾驶_测试场景技术发展与应用>进行整合 参考书目:自动驾驶汽车测试技术发展现状与思考--范志翔,孙巍 第一章:绪论 自动驾驶 ...

  4. 合作伙伴常见技术问题集锦

    亲爱的合作伙伴,您是否因遇到一些技术难题而无法解答?您是否需要一个技术专家陪伴?登录"合作伙伴在线技术支持社区(POTC)"在线发帖提问,最短4小时技术专家就将答案告诉您.此外,& ...

  5. 怎么通过name配置button_利器 | AppCrawler 自动遍历测试实践(二):定制化配置

    终于到了"啥也不干躺在家就能给社会做贡献"的时候,但有梦想的测试人从不会让自己的生活变得无聊!与其宅在家里数瓜子壳,还不如利用整块时间提升测试开发技能! 定制化配置 自动遍历测试技 ...

  6. AI实战:垂直领域问答机器人QA Bot常见技术架构

    垂直领域问答机器人QA Bot常见技术架构 对话系统示意图 基于知识图谱的智能问答:点击查看 人机对话体系结构 问答产品知识结构 基于知识图谱的问答系统关键技术研究: 点击查看 研究架构图 对话机器人 ...

  7. 网络攻击常见技术方法及案例分析

    一.网络攻击概述 网络攻击:指损害网络系统安全属性的危害行为,危害行为导致网络系统的机密性.完整性.可控性.真实性.抗抵赖性等受到不同程度的破坏 危害行为的四个基本类型:信息泄露攻击.完整性破坏攻击, ...

  8. 从头开始进行CUDA编程:线程间协作的常见技术

    转载:Deephub Imba 在前一篇文章中,我们介绍了如何使用 GPU 运行的并行算法.这些并行任务是那些完全相互独立的任务,这点与我们一般认识的编程方式有很大的不同,虽然我们可以从并行中受益,但 ...

  9. jquery面试常见技术问题

    面试常见技术问题 ------------           JQ           -----------1.jq常见选择器? ,号选择器,分组选择器.空格,祖父选择器.>大于号,父子选择 ...

最新文章

  1. python TypeError: Expected int32, got list containing Tensors of type '_Message' instead.
  2. android分享软件功能的实现
  3. 微型计算机寻址方式命令,寻址方式与基本指令-微机原理实验报告.docx
  4. Eclipse扩展的轻量级集成测试
  5. iOS多视图代码操作
  6. SpringBoot2.x整合Swagger2 实现API文档实时生成
  7. python 运行时 变量_python运行过程,变量,符号
  8. 抓取Crash不让崩溃
  9. 服务器利用docker搭建CTFd平台、webug靶场,并映射到公网IP
  10. 【渝粤题库】陕西师范大学200621 英语词汇学 作业
  11. Spring中com.sun.proxy.$Proxy12 cannot be cast to 包名.类名错误
  12. Ubuntu下搭建C/C++开发环境
  13. 批量一键删除QQ空间说说软件
  14. FW:一位软件工程师的6年总结
  15. IBM PureApplication System如何使用DNS将工作负载部署到数据中心的网络上
  16. [音乐天堂]Eventide
  17. html+js+css国际象棋,画面超精致!!
  18. 欧几里德算法(求两数最大公因数)
  19. 【程序人生】卡塔尔世界杯元素python海龟绘图(附源代码),世界杯主题前端特效5个(附源码)
  20. CnOpenData中国外观设计专利基本信息数据

热门文章

  1. 苹果快捷键怎么调出来_ps常用10大快捷键
  2. iOS开发实习一周工作和收获记录
  3. 2015年 android 白皮书
  4. Android 获取SIM卡信号
  5. R语言检验时间序列的平稳性:使用tseries包的adf.test函数实现增强的Dickey-Fuller(ADF)检验、检验时序数据是否具有均值回归特性(平稳性)、不具有均值回归特性的案例
  6. SET的社会工程学攻击方法
  7. Android系统之G-sersor调试
  8. SS00007.algorithm——|ArithmeticMachine.v07|——|Machine:监督学习算法.v06|
  9. 显卡GTX295到了
  10. 【转】前端图片该保存为什么格式?png or jpg?