《Android应用开发攻略》——3.12 运行Monkey程序

3.12 运行Monkey程序

Adrian Cowham
3.12.1 问题
你希望对应用程序进行一些好的随机使用测试。
3.12.2 解决方案
使用Android Monkey命令行工具测试你所开发的测试应用程序。
3.12.3 讨论
从字面上看,测试非常简单,连猴子(Monkey)都能完成。尽管Android缺乏测试工具,但是我必须承认,Monkey是相当好的工具。你可能不熟悉Android Monkey,它是Android SDK自带的一个测试工具,模拟猴子(也可能是个孩子)使用Android设备。想象一下,一只猴子坐在键盘上乱动——了解了吗?还有什么方法比这更能找出隐藏的ANR信息?
运行Monkey很简单,启动模拟器(或者将开发设备连接到开发机器上),然后启动Monkey脚本。我不愿意承认这一点,但是每天运行Monkey,我们不断地发现在常规的QA测试中没有发现的缺陷,这些缺陷如果在用户使用的现场发现,将难以维修,更糟糕的是,会导致用户不再使用我们的应用程序。
下面是在开发过程中使用Monkey的最佳实践:
创建自己的Monkey脚本来封装Android Monkey脚本。这样能确保团队中的开发人员以相同的参数运行Monkey。如果你的团队只有一个人,这样做有助于可预测性(很快将会讨论)。
配置Monkey,使其运行足够长的时间以捕捉缺陷,也可以运行较短的时间以提供更好的生产率。在我们的开发过程中配置Monkey,一共运行50000个事件,在Samsung Galaxy平板电脑上大约运行40分钟,这还不错,但是我希望它在30分钟内完成。很显然,平板电脑的速度越快,吞吐量就越大。
Monkey是随机的,所以当我们第一次开始运行时,每个开发人员都得到不同的结果,无法重现缺陷。后来,我们发现Monkey可以设置随机数发生器的种子。
所以,在你的包装器脚本中要设置Monkey的种子。这能保证在开发团队中运行Monkey的一致性和可预测性。
一旦特定的种子值确认了应用程序,则修改种子值,因为你永远不知道Monkey会找到什么。
下面是一个Monkey脚本包装器,以及参数的描述:

#!/bin/bash
# Utility script to run monkey
#
# See: http://developer.android.com/guide/developing/tools/monkey.html
rm tmp/monkey.log
adb shell monkey -p package.name.here --throttle 100 -s 43686 -v 50000 |
tee tmp/monkey.log

-p package name确保Monkey只针对于指定的包。
--throttle是事件之间的延时。
-s是种子值
-v是VERBOSE选项。
50000是Monkey模拟的事件数量。
Monkey还有许多配置选项;我们有意地不选择配置Monkey生成的事件类型,因为我们了解那种痛苦。例如,我们选择的种子值导致Monkey在运行到一半时禁用Wi-Fi。开始时我们为此而感到沮丧,因为我们感觉这不是想要的覆盖范围。结果是,Monkey禁用Wi-Fi并且乱运行应用程序,这其实帮助了我们。在发现和修复了几个缺陷之后,我们完全确信,应用程序在没有网络连接的情况下能够按照预期运行。
这真是一只好猴子。

时间: 2024-11-08 13:26:29

《Android应用开发攻略》——3.12 运行Monkey程序的相关文章

《Android应用开发攻略》——3.6 应用程序崩溃排错

3.6 应用程序崩溃排错 Ulysses Levy3.6.1 问题 应用崩溃,而原因不确定(参见图3-14). 3.6.2 解决方案 从查看日志开始.3.6.3 讨论 遇到应用程序崩溃时,我们可以使用adb logcat命令或者Eclipse LogCat窗口查看AVD的日志.例3-3说明了如何用adb logcat查看堆栈跟踪,找到故障的位置. 例3-3:"权限拒绝"问题的堆栈跟踪 E/DatabaseUtils( 53): Writing exception to parcel E

《Android应用开发攻略》——导读

前言 对于蜂窝技术和移动计算来说,Android是"开放源码的革命",至少是革命的一部分.从已经不存在的Openmoko FreeRunner到QT Embedded.Moblin. LiMo. Debian Mobile,以及Maemo和最近刚刚开放源码的Symbian OS.刚刚消失的HP WebOS,人们对于提供开放源码的蜂窝技术已经做出了许多的尝试.我们也不要忘记闭源系统的忠实拥趸:BlackBerry OS.Apple iPhone和Microsoft Windows Mob

《Android应用开发攻略》——3.10 为测试重现活动生命周期场景

3.10 为测试重现活动生命周期场景 Daniel Fowler3.10.1 问题 应用程序应该适应活动生命周期.开发人员必须知道如何重现不同的生命周期场景.3.10.2 解决方案 利用日志获得对活动生命周期的全面了解,就能更容易地为测试重现生命周期场景.3.10.3 讨论 Android是为了移动的生活方式而设计的,在这种方式下,用户忙于多种工作:打电话.检查邮件.发送SMS信息.参与社交网络.拍照.访问互联网.运行应用程序等,甚至完成某些工作!因此,移动设备可能有多个应用程序,从而在内存中加

《Android应用开发攻略》——1.12 保持Android SDK更新

1.12 保持Android SDK更新 Daniel Fowler1.12.1 问题 SDK必须保持更新,使应用开发人员能够使用不断发展的Android平台上的最新API.1.12.2 解决方案 使用Android SDK Manager程序更新已安装的SDK包和安装新SDK包,包括用于设备特殊功能的第三方程序包.1.12.3 讨论 Android操作系统不断发展,因此,Android SDK也随之发展.Android持续发展的驱动力是: Google的研究和开发 手机制造商开发新的改进型手机

《Android应用开发攻略》——2.11 设置首次运行的首选项

2.11 设置首次运行的首选项 Ashwini Shahapurkar2.11.1 问题 因为应用程序匿名收集应用程序使用情况,所以你有义务在用户第一次运行应用程序时告知他们.2.11.2 解决方案 将共享的首选项作为持久性存储,保存一个只更新一次的值.每次应用程序启动时,它就会检查首选项中的该值,如果该值已经设置(可用),应用程序就不是第一次运行:否则,就是第一次运行.2.11.3 讨论 可以使用Android框架的Application类管理应用程序生命周期.我们将使用共享的首选项,作为保存

《Android应用开发攻略》——1.3 从命令行创建 “Hello, World”应用程序

1.3 从命令行创建 "Hello, World"应用程序 Ian Darwin1.3.1 问题 你想在不使用Eclipse ADT插件的情况下创建新的Android项目.1.3.2 解决方案 使用Android开发工具包(Android Development Kit,ADK)中的android工具,利用creat project参数和一些附加参数配置你的项目.1.3.3 讨论 除了平台名称之外,android还是一个用于创建.更新和管理项目的命令行工具的名称.可以进入android

《Android应用开发攻略》——1.4 在Eclipse中创建“Hello, World”应用程序

1.4 在Eclipse中创建"Hello, World"应用程序 Ian Darwin1.4.1 问题 你打算用Eclipse开发Android应用程序.1.4.2 解决方案 安装Eclipse.Android SDK和ADT plug-in.创建项目并开始编写应用程序.从Eclipse中构建项目并在模拟器下测试.1.4.3 讨论 安装如下软件之后,就可以开始开发了: Eclipse IDE Android SDK ADT plug-in 安装上述三个软件的详细讲解请参见攻略1.5.

《Android应用开发攻略》——1.15 程序:Android OS下的小费计算器Tipster

1.15 程序:Android OS下的小费计算器Tipster Sunit Katkar1.15.1 问题 当你和朋友前往饭店就餐并且希望计算各自的账单和小费时,可能陷入许多手动计算和分歧之中.你希望使用一个应用程序,简单地将小费比例加到总额上,并且按照就餐人数分配.Tipster就是Android中的一个实现,用它展示一个完整的应用程序.1.15.2 解决方案 这是一个简单的练习,使用Android中的基本GUI元素,然后用一些简单的计算和事件驱动UI代码将它们组合起来.将用到如下GUI组件

《Android应用开发攻略》——3.13 发送文本消息以及AVD之间的通话

3.13 发送文本消息以及AVD之间的通话 Johan Pelgrim3.13.1 问题 你开发了一个应用程序,需要拨打或者接听电话,或者收发文本消息,你希望对该程序进行测试.3.13.2 解决方案 启动两个Android虚拟设备(AVD),使用端口号发送文本消息及拨打电话.3.13.3 讨论 当你创建一个接听来电或者文本消息的应用程序(类似于攻略12.2中开发的应用)时,你当然可以使用Eclipse中的DDMS视图模拟通话或者发送文本消息,不过也可以启动另一个AVD! 如果你注意AVD窗口标题