作者:杭州城西费德勒 - 曾中华

这里 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 会进入几个页面后无法跳出?

原因有以下几点:

  1. touch 事件点击的位置是全屏幕随机的。
  2. Webview 中页面几乎是每个地方都可以点击,并且点击后跳到另一个页面。
  3. 虽然页面左上角有返回键、也有物理 Back 键,但是返回键所占的区域只是屏幕上很小一部分,大约只占屏幕点击事件总数的 1/80(按面积计算), 物理 Back 键也只占所有 SYS_KEYS 中的 1/7。这里多么类似于生物蚁群算法,进入死循环就仿佛是找到了最短路径。但遗憾的是,Monkey 的目的是希望能够最大程度覆盖所有可能的执行路径。继续进入下一个页面的可能性永远比退出去更多,除非这个页面的有效点击区域变小才能增大退出来的可能性。

有赞微商城 App 中一个典型的 Webview 页面:

2. 解决方案

如果监听每个 Activity 的启动过程,并且判断它的存活时间,当认为已经太长了,主动将其 finish 掉。这似乎是个可行的方案。由此想到了通过 Instrumentaion 启动 App,然后开启 Monkey 测试,如此一来就可以控制页面深度及存活时间。

这里需要特别注意的是:关闭 Activity 的策略,该如何定制?如果策略不合理,很可能造成一下问题:

  1. 比较深的页面跑不到
  2. 单页面的点击,测试完整度不够

目前我所使用的策略是:

  1. Top Activity 在没有切换的情况下最长存活时间为15s
  2. 当前 Activity 栈中,从上往下,第一层存活时间 30s,每层递增 30s,超过时间后依次 finish 弹出
  3. 每个 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 工具实战相关推荐

  1. android开发之Monkey测试_自动化测试_看看你的应用够不够健壮

    上篇提到让应用自动抓取Crash日志提交到服务器,如果发布之前没有经过严格测试(个人练手做的一些小应用),会发现有很多异常都是显而易见的错误,只是没有严格测试忽略了而已,其实android自带了一个自 ...

  2. monkey测试_安卓测试之monkey

    安卓手机最简单的随机压力测试工具monkey真的是测试的福星,人人都可以用,只需要敲一串命令即可: 举例:adb shell monkey -p com.android.camera --ignore ...

  3. monkey测试_爱码小士丨 APP稳定性测试(附视频详解)

    在实际的测试过程中,主要是对系统的功能来进行测试,用于校验功能的正确性 还需要考虑到系统在未修改的状态下,是否能够稳定运行,即崩溃.闪退.重启.系统异常等等等地情况 在APP中,稳定性测试一般是交由M ...

  4. monkey测试linux设备,关于使用Monkey运行脚本测试

    转自: monkey .在pc(Linux)上运行模拟器,两种方法 l可以通过eclipse运行emulator,具体方法略. l可以通过命令行:root@lenovo-desktop:~# emul ...

  5. android 获取monkey日志_安卓app测试之Monkey日志分析

    转:原文:https://blog.csdn.net/a136332462/article/details/76066909 一.一般测试结果分析-搜索关键字: 1.无响应问题可以在日志中搜索 &qu ...

  6. 【转】Monkey测试5-运行中停止monkey

    停止monkey自动测试步骤: 1.ps命令  查找uiautomator的进程 打开cmd命令行窗口 输入: adb shell ; ps | grep monkey; 返回来的第一个数字,即是mo ...

  7. Monkey测试工具简介

    最近依然还是那么忙,只不过慢慢总结,好几天出一篇总结,那也是在努力,加油,打工人 Monkey测试工具简介 一.Monkey 简介 二.Monkey 操作 2.1 Monkey支持的事件 2.2 Mo ...

  8. Android开发、adb、monkey测试

    一. 手机测试概念 传统手机测试 VS 手机应用软件测试 传统手机测试:指测试手机本身比如抗压,抗摔,抗疲劳,抗低温高温等.也包括手机本身功能.性能等测试. 手机应用软件测试 C/S Client/S ...

  9. 移动端测试Monkey测试

    Monkey测试 4.1. 参考资料 Android之Monkey全参数(包含隐藏参数)_北极的冰箱的博客-CSDN博客_android monkey 参数 4.2. Money介绍 顾名思义,Mon ...

最新文章

  1. 在编写存储过程时使用 Set NoCount On
  2. shell编程中的 ${ }强大功能
  3. hashmap应用场景_Redis 5种数据结构 及使用场景分析
  4. Android辅助开发工具说明
  5. 化工企业数据分析报表系统项目之销售模块分析
  6. 别担心!人工智能不会抢你的工作
  7. Linux下部署MongoDB
  8. python和java的区别-python 和 java 的区别
  9. 译Selenium Python Bindings 6 - WebDriver API
  10. react 使用rewired_使用react-app-rewired和customize-cra对默认webpack自定义配置
  11. 信息熵是怎样炼成的 | 纪念信息论之父香农
  12. JavaScript页面刷新的所有方法
  13. 蓝桥杯单片机(十二)PCF8591(D/A转换)
  14. 如何在Commander One中显示隐藏文件?
  15. iPhone十年经历了哪些变化:CNET重新评测初代iPhone
  16. hadoop的journalnode节点出现Can‘t scan a pre-transactional edit log错误解决办法
  17. android 小学课程,中小学同步课堂
  18. 利用matlab实现DMD动态模态分解(在一维信号或二维流场矢量中的应用)
  19. (SWAT-3.1)关于土壤水文分组(HYDGRP)的一些资料参考
  20. 编程语言——标记语言——脚本语言之间的比较

热门文章

  1. id和class到底要用哪一个?
  2. php5,Apache在windows 7环境搭建
  3. 【笨木头Lua专栏】基础补充08:协同程序之resume-yield间的数据返回
  4. android 学习笔记(八)building system8.5 shell脚本的学习
  5. 2012腾讯春季实习生面试经历(一)
  6. 更改数据库对象所有者
  7. golang post发送 json请求
  8. linux bash shell 常用快捷键
  9. python3 判断字符串是否包含指定字符
  10. linux alpine 用dockerfile创建的ssh镜像