monkey测试_用 Instrumentation 改良 Monkey 工具实战
作者:杭州城西费德勒 - 曾中华
这里 Monkey 不是猴子,而是 Android 系统中用来做自动化测试的工具,即盲点、压力测试。
在之前的移动端产品迭代中,Monkey 工具一直没有利用起来。开发同学忙于需求,测试同学资源较少,自动化测试工具欠缺,重视不够。版本发布的流程,压力测试这一环节是完全缺失的。Crash 没有在发版前提前发现,也造成我们线上产品 crash 率较高。
App 不同于 H5,一旦发布版本,其更新成本、周期是比较高的。所以应当将发版前的质量保证作为第一要务,确保可靠性。
1. 问题及分析
1.1 现象
Monkey 工具的用法,网上有很多资料,在此不作介绍,可参考:UI/Application Exerciser Monkey
用法很简单,但是我们在初步使用 Monkey 的过程中,几乎必然进入一个较深的路径中,再也无法跳出来 --- 可能是在两个页面、或者 Dialog、Input 面板间不断的切换,始终没法关闭页面、逐级跳出。在我测试的过程中,发现几乎都是进入了一个 Webview 页面:
1.2 探索
Monkey 的实现原理,参考源码:https://android.googlesource.com/platform/development/+/master/cmds/monkey
可以通过 adb shell 来启动 Monkey 测试:
adb shell monkey -p PACKAGE_NAME --throttle XX --pct-touch XX --pct-motion XX --pct-syskeys XX --pct-appswitch XX -s XX -v -v COUNT > monkey_text.txt
以上指令实际是通过执行一段 shell 脚本来启动 monkey.jar,入口在 Monkey.java:main() 方法当中。
通过调整 –pct-touch / –pct-motion / –pct-syskeys / –pct-appswitch 等参数比例,Monkey 会随机生成相应事件。
MonkeySourceRandom.java
Monkey 产生 touch 事件的坐标位置是完全随机的:
1.3 结论分析
所以,到这里,基本上可以对上面的问题做一个解答,即:为什么 Monkey 会进入几个页面后无法跳出?
原因有以下几点:
- touch 事件点击的位置是全屏幕随机的。
- Webview 中页面几乎是每个地方都可以点击,并且点击后跳到另一个页面。
- 虽然页面左上角有返回键、也有物理 Back 键,但是返回键所占的区域只是屏幕上很小一部分,大约只占屏幕点击事件总数的 1/80(按面积计算), 物理 Back 键也只占所有 SYS_KEYS 中的 1/7。这里多么类似于生物蚁群算法,进入死循环就仿佛是找到了最短路径。但遗憾的是,Monkey 的目的是希望能够最大程度覆盖所有可能的执行路径。继续进入下一个页面的可能性永远比退出去更多,除非这个页面的有效点击区域变小才能增大退出来的可能性。
有赞微商城 App 中一个典型的 Webview 页面:
2. 解决方案
如果监听每个 Activity 的启动过程,并且判断它的存活时间,当认为已经太长了,主动将其 finish 掉。这似乎是个可行的方案。由此想到了通过 Instrumentaion 启动 App,然后开启 Monkey 测试,如此一来就可以控制页面深度及存活时间。
这里需要特别注意的是:关闭 Activity 的策略,该如何定制?如果策略不合理,很可能造成一下问题:
- 比较深的页面跑不到
- 单页面的点击,测试完整度不够
目前我所使用的策略是:
- Top Activity 在没有切换的情况下最长存活时间为15s
- 当前 Activity 栈中,从上往下,第一层存活时间 30s,每层递增 30s,超过时间后依次 finish 弹出
- 每个 task 最长存活时间 10 分钟
MonkeyInstrumentation 源码附上:
public
3. 使用
① 将 MonkeyInstrumentation 集成进 App 项目代码中,并在 AndroidManifest.xml 中声明:
<instrumentation
其中 MONKEY_TEST_PACKAGE 为待测包名,另注意修改 MonkeyInstrumentaion 所在包名。
② 编译安装好 Apk ③ 启动 Instrumentation, 目标进程启动并监听 Activity 栈存活状态
adb shell am instrument MONKEY_TEST_PACKAGE/RUNNER_CLASS
其中 RUNNER_CLASS 即为 MonkeyInstrumentation
④ 启动monkey测试
300 --pct-touch
⑤ 结果查看
4. 总结
Monkey 这个工具,看起来很简单,但使用起来还是会遇到这样的坑。以前有专职的测试同学替我们完成 Monkey,测试,导致对遇到的问题也没有去深究。
发版前的自动化测试,包括 UT、UI 测试、Monkey、内存、性能及流畅度、Apk Size 等等,越来越成为上线发版流程中不可或缺的一环,我们在不断的建设完善当中。
我们积极拥抱新技术,不给自己设边界,勇于跳出舒适区
iOS/Android 开发可投简历至 liangfei@youzan.com(微信:feelang )
monkey测试_用 Instrumentation 改良 Monkey 工具实战相关推荐
- android开发之Monkey测试_自动化测试_看看你的应用够不够健壮
上篇提到让应用自动抓取Crash日志提交到服务器,如果发布之前没有经过严格测试(个人练手做的一些小应用),会发现有很多异常都是显而易见的错误,只是没有严格测试忽略了而已,其实android自带了一个自 ...
- monkey测试_安卓测试之monkey
安卓手机最简单的随机压力测试工具monkey真的是测试的福星,人人都可以用,只需要敲一串命令即可: 举例:adb shell monkey -p com.android.camera --ignore ...
- monkey测试_爱码小士丨 APP稳定性测试(附视频详解)
在实际的测试过程中,主要是对系统的功能来进行测试,用于校验功能的正确性 还需要考虑到系统在未修改的状态下,是否能够稳定运行,即崩溃.闪退.重启.系统异常等等等地情况 在APP中,稳定性测试一般是交由M ...
- monkey测试linux设备,关于使用Monkey运行脚本测试
转自: monkey .在pc(Linux)上运行模拟器,两种方法 l可以通过eclipse运行emulator,具体方法略. l可以通过命令行:root@lenovo-desktop:~# emul ...
- android 获取monkey日志_安卓app测试之Monkey日志分析
转:原文:https://blog.csdn.net/a136332462/article/details/76066909 一.一般测试结果分析-搜索关键字: 1.无响应问题可以在日志中搜索 &qu ...
- 【转】Monkey测试5-运行中停止monkey
停止monkey自动测试步骤: 1.ps命令 查找uiautomator的进程 打开cmd命令行窗口 输入: adb shell ; ps | grep monkey; 返回来的第一个数字,即是mo ...
- Monkey测试工具简介
最近依然还是那么忙,只不过慢慢总结,好几天出一篇总结,那也是在努力,加油,打工人 Monkey测试工具简介 一.Monkey 简介 二.Monkey 操作 2.1 Monkey支持的事件 2.2 Mo ...
- Android开发、adb、monkey测试
一. 手机测试概念 传统手机测试 VS 手机应用软件测试 传统手机测试:指测试手机本身比如抗压,抗摔,抗疲劳,抗低温高温等.也包括手机本身功能.性能等测试. 手机应用软件测试 C/S Client/S ...
- 移动端测试Monkey测试
Monkey测试 4.1. 参考资料 Android之Monkey全参数(包含隐藏参数)_北极的冰箱的博客-CSDN博客_android monkey 参数 4.2. Money介绍 顾名思义,Mon ...
最新文章
- 在编写存储过程时使用 Set NoCount On
- shell编程中的 ${ }强大功能
- hashmap应用场景_Redis 5种数据结构 及使用场景分析
- Android辅助开发工具说明
- 化工企业数据分析报表系统项目之销售模块分析
- 别担心!人工智能不会抢你的工作
- Linux下部署MongoDB
- python和java的区别-python 和 java 的区别
- 译Selenium Python Bindings 6 - WebDriver API
- react 使用rewired_使用react-app-rewired和customize-cra对默认webpack自定义配置
- 信息熵是怎样炼成的 | 纪念信息论之父香农
- JavaScript页面刷新的所有方法
- 蓝桥杯单片机(十二)PCF8591(D/A转换)
- 如何在Commander One中显示隐藏文件?
- iPhone十年经历了哪些变化:CNET重新评测初代iPhone
- hadoop的journalnode节点出现Can‘t scan a pre-transactional edit log错误解决办法
- android 小学课程,中小学同步课堂
- 利用matlab实现DMD动态模态分解(在一维信号或二维流场矢量中的应用)
- (SWAT-3.1)关于土壤水文分组(HYDGRP)的一些资料参考
- 编程语言——标记语言——脚本语言之间的比较