android自动化测试 MONKEY

  第一篇介绍monkey测试工具。

shell monkey -v -v -v -s 100 --throttle 5 -p com.zxy 500 -hprof

1 自动化测试背景 
        软件测试是软件产品开发过程中的重要环节。测试对于发现软件中缺陷,保障软件的质量具有重要意义。统计表明,软件测试的时间通常占到软件开发时间的 40%,一些可靠性要求高的软件甚至高达 60%以上。 
        手工测试和自动化测试是软件测试的两种基本手段,二者相互补充,不可相互替代。其中,自动化测试能捕捉到资源冲突、多线程、死锁等手工测试难以发现的错误,可以高效的完成大量机械性、重复性测试,能模拟大量数据或大量并发用户等应用场景,从而有效的缩短软件测试周期,提高测试的可靠性及准确度。


2 什么是 Monkey 
        Monkey 测试是 Android 自动化测试的手段之一,它通过模拟用户的按键输入、触摸屏输入等,测试设备多长时间出现异常。Monkey 是一个命令行工具,可以运行在模拟器或实际设备中,通过向系统发送伪随机的用户事件流,实现对全系统或某个应用程序进行压力测试。 
        Monkey 工具使用非常简单,直接在命令窗口键入 monkey 命令即可进行测试。Monkey 命令有较多的配置选项,为便于理解这些命令,此处先将其命令选项简单划分为四大类,在后文中陆续介绍各种命令选项的使用,然后在附录中附上整个 monkey 命令选项便于查阅。
        Monkey 命令可简单分为如下四类: 

  • 基本配置选项,如设置尝试的事件数量 
  • 运行约束选项,如设置只对单独的一个包进行测试 
  • 事件类型和频率,如设置触摸屏事件的发生频率 
  • 调试选项,如设置忽略应用程序异常,继续向系统发送事件,直到计数完成
3 使用 monkey 进行自动化测试 
         Monkey 命令工具可以在模拟器和实际设备上使用。这里分别对两种环境下的 monkey 测试进行介绍。 
3.1 在模拟器上运用 Monkey 进行自动化测试 
3.1.1 monkey 命令最简单用
法 
         首先,介绍最简单 monkey 命令用法,其使用格式为如下: 
monkey  n 
其中,n 为一个整数,表示用于测试的伪随机事件发生的次数。 
如图 3.1 所示,启动模拟器。然后,在命令行窗口下输入 adb shell 命令,如图 3.2 所示。
登录 shell 之后,即可使用 monkey 命令。最简单的用法是,直接在其后面指定一个数字,表
示向系统发送事件的数量,如图 3.3 所示。模拟器的测试的结果如图 3.4 所示。

3.1.2 指定测试的约束选项 
         所谓测试约束选项,即根据具体的测试需求,通过参数指定对系统的某些包或类进行测试。主要包括两类约束:包和类。 
(1) 指定测试的包 
如果需要对某一个具体的应用进行测试,可指定具体的包名。可以在系统目录/data/data
下查找对应的包名,如图 3.5 所示。

查找到对应的包名后,使用 monkey 时可用“-p”参数进行指定,此外还可以使用“-v”
参数指定测试中反馈的信息。常用格式如下: 
monkey  –p  com.android.gallery  –v  50 
如图 3.6 和 3.7 分别为命令输入及测试过程的截图。 

注意:每个“-p”只能指定一个包,若需指定对多个包进行测试,则要用多个“-p”参数进行指定。 
(2) 指定测试的类 
若需对某个具体类进行测试,可以使用“-c”参数指定,若需指定多个类别,则要用多个“-c”参数选项分别指定,每个“-c”只能指定一个类别。如图 3.1 所示,其使用的命令格式
为: 
Monkey  –c  android.intent.category.LAUNCHER  -v   50 
图 3.8 及图 3.9 分别为指定类测试命令输入及测试过程的截图。 


3.1.3 指定测试的事件类型和频率 
         Monkey 命令提供了众多选项用于指定事件的类型和发生频率, 例如触摸事件、 导航事件、轨迹事件(由一个或多个随机的移动组成,有时还伴随有点击)。有时为了测试某个具体应用,需要通过“事件”的反复发生来进行专项的功能测试,此时即可通过 monkey 的“—pct”选项来进行指定具体事件及其发生的频率。命令使用格式如下示例: 
Monkey --pct-syskeys  90  200 
以上命令表示系统按键事件的发生率为 90%,共测试 200 次,如图 3.10 及图 3.11 所示。 
注意: “pct”前面是英文输入状态下两杠“——” 。

还可以分别指定两个事件的发生频率,命令使用方式如下所示: 
Monkey  --pct-touch 50  --pct-trackball  40  200 
以上命令表示触摸事件和轨迹事件发生概率分别为 50%和 40%,共测试 200 次,如图 3.12 和图 3.13 所示。

        通过“--throttle”指定事件间的间隔,可以延缓事件的发生,如下图 3.14 所示为指定导航事件发生概率为 80%, 每次事件相隔 1 秒中发生, 共测试 200 次。 测试的效果图如 3.15 所示。

3.1.4 指定测试的调试选项 
        Monkey 命令提供了若干用于控制测试过程的调试选项。例如参数“--ignore-crashes” ,将忽略应用程序崩溃或发生的任何异常,继续向系统发送事件,直到计数完成。使用命令格式如下: 
monkey  --ignore-crashes  -v 5000 
图 3.16 及图 3.17 分别显示了指定调试选项的测试及其测试过程的效果图。

3.2 在开发板上运用 Monkey 进行自动化测试 
       上一节中主要介绍了用 monkey 命令工具在模拟器上进行测试, 列举了若干基本的命令使用示例。在实际的设备中,也可以方便的运用 monkey 工具进行应用程序的测试。 
       要在实际设备上进行 monkey 测试,首先需要启动 Android 系统,然后让设备通过串口与pc 相连,在 pc 上通过 SecureCRT 登录到 Android 系统的根目录下。此时,即可运用上一节介绍的各种命令对设备进行自动化测试。 
        注意, 登录到 Android 系统的根目录后, 若找不到 monkey 命令, 应先运行 system/bin/sh,切换 bash 环境。 
4 附录 
4.1 monkey 工具的命令选项
 
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...] 
              [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...] 
              [--ignore-crashes] [--ignore-timeouts] 
              [--ignore-security-exceptions] 
              [--monitor-native-crashes] [--ignore-native-crashes] 
              [--kill-process-after-error] [--hprof] 
              [--pct-touch PERCENT] [--pct-motion PERCENT] 
              [--pct-trackball PERCENT] [--pct-syskeys PERCENT] 
              [--pct-nav PERCENT] [--pct-majornav PERCENT] 
              [--pct-appswitch PERCENT] [--pct-flip PERCENT] 
              [--pct-anyevent PERCENT] 
              [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE] 
              [--pkg-whitelist-file PACKAGE_WHITELIST_FILE] 
              [--wait-dbg] [--dbg-no-events] 
              [--setup scriptfile] [-f scriptfile [-f scriptfile] ...] 
              [--port port] 
              [-s SEED] [-v [-v] ...] 
              [--throttle MILLISEC] [--randomize-throttle] 
              [--profile-wait MILLISEC] 
              [--device-sleep-time MILLISEC] 
              [--randomize-script] 
              [--script-log] 
              [--bugreport] 
              COUNT 

4.2 monkey 命令选项介绍 






今天我把我近期使用Monkey和Monkeyrunner的一些体会与大家分享,Sdk版本为Rev22.01,Api17(4.22).

转载请注明作者:MarshalChen ,http://my.eoe.cn/marshalchenhttp://blog.csdn.net/marshalchen
一、什么是Monkey

Monkey是一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。Monkey包括许多选项,它们大致分为四大类:

· 基本配置选项,如设置尝试的事件数量。

· 运行约束选项,如设置只对单独的一个包进行测试。

· 事件类型和频率。

· 调试选项。

二、Monkey的基本用法

基本语法如下:

$ adb shell monkey [options]
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:

$ adb shell monkey -p your.package.name -v 500
一些常用的参数信息:
-v
命令行的每一个-v将增加反馈信息的级别。Level 0(缺省值)除启动提示、测试完成和最终结果之外,提供较少信息。Level 1提供较为详细的测试信息,如逐个发送到Activity的事件。Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。

事件
-s
伪随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件序列。

--throttle
在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被产成。

--pct-touch
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)。

--pct-motion
调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)。

--pct-trackball
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)。

--pct-nav
调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)。

--pct-majornav
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)

--pct-syskeys
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。

--pct-appswitch
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。

--pct-anyevent
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。

约束限制
-p
如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity。如果你的应用程序还需要访问其它包里的Activity(如选择取一个联系人),那些包也需要在此同时指定。如果不指定任何包,Monkey将允许系统启动全部包里的Activity。要指定多个包,需要使用多个 -p选项,每个-p选项只能用于一个包。

-c
如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选 择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选 项只能用于一个类别。

调试
--dbg-no-events
设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。

--hprof
设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要小心使用它。

--ignore-crashes
通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。

--ignore-timeouts
通常,当应用程序发生任何超时错误(如“Application Not Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。

--ignore-security-exceptions
通常,当应用程序发生许可错误(如启动一个需要某些许可的Activity)时,Monkey将停止运行。如果设置了此选项,Monkey将继续向系统发送事件,直到计数完成。

--kill-process-after-error
通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。

--monitor-native-crashes
监视并报告Android系统中本地代码的崩溃事件。如果设置了--kill-process-after-error,系统将停止运行。

--wait-dbg
停止执行中的Monkey,直到有调试器和它相连接。-v
命令行的每一个-v将增加反馈信息的级别。Level 0(缺省值)除启动提示、测试完成和最终结果之外,提供较少信息。Level 1提供较为详细的测试信息,如逐个发送到Activity的事件。Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。

事件
-s
伪随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件序列。

--throttle
在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被产成。

--pct-touch
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)。

--pct-motion
调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)。

--pct-trackball
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)。

--pct-nav
调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)。

--pct-majornav
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)

--pct-syskeys
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。

--pct-appswitch
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。

--pct-anyevent
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。

约束限制
-p
如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity。如果你的应用程序还需要访问其它包里的Activity(如选择取一个联系人),那些包也需要在此同时指定。如果不指定任何包,Monkey将允许系统启动全部包里的Activity。要指定多个包,需要使用多个 -p选项,每个-p选项只能用于一个包。

-c
如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选 择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选 项只能用于一个类别。

调试
--dbg-no-events
设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。

--hprof
设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要小心使用它。

--ignore-crashes
通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。

--ignore-timeouts
通常,当应用程序发生任何超时错误(如“Application Not Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。

--ignore-security-exceptions
通常,当应用程序发生许可错误(如启动一个需要某些许可的Activity)时,Monkey将停止运行。如果设置了此选项,Monkey将继续向系统发送事件,直到计数完成。

--kill-process-after-error
通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。

--monitor-native-crashes
监视并报告Android系统中本地代码的崩溃事件。如果设置了--kill-process-after-error,系统将停止运行。

--wait-dbg
停止执行中的Monkey,直到有调试器和它相连接。

Monkey的详细参数信息可以在这里查看http://developer.android.com/tools/help/monkey.html,这里就不再累述了。

三、Monkey实例测试
Windows下(注:2—4步是为了查看我们可以测试哪些应用程序包,可省略):

1、 通过eclipse启动一个Android的emulator

2、 在命令行中输入:adb devices查看设备连接情况

C:Documents and SettingsAdministrator>adb devices

List of devices attached

emulator-5554 device

3、 在有设备连接的前提下,在命令行中输入:adb shell 进入shell界面

C:Documents and SettingsAdministrator>adb shell

4、 查看data/data文件夹下的应用程序包。注:我们能测试的应用程序包都在这个目录下面

C:Documents and SettingsAdministrator>adb shell

如:

com.android.htmlviewer
com.android.settings
com.android.netspeed
com.android.providers.userdictionary
com.android.browser
com.android.contacts
com.android.alarmclock

5.在其中找到我们需要测试的包名com.marshalchen.MonkeyTest1

6、 以com.marshalchen.MonkeyTest1 作为对象进行MonkeyTest

monkey -p com.marshalchen.MonkeyTest1 -v 500

其中-p表示对象包 –v 表示事件数量

运行过程中,Emulator中的应用程序在不断地切换画面。

按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。

如:Sending Pointer ACTION_DOWN x=35.0 y=259.0
:Sending Pointer ACTION_UP x=195.0 y=259.0
:Sending Pointer ACTION_DOWN x=295.0 y=223.0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0
等等信息。

四、Monkey停止的条件
Monkey Test执行过程中在下列三种情况下会自动停止:

1、如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。

2、如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。

3、如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。

通过多次并且不同设定下的Monkey测试才算它是一个稳定性足够的程序。

MonkeyRunner 使用

1
Monkey的使用简洁有效,但是总是给人感觉功能不够强大。所以,接下来向大家介绍非常给力的工具MonkeyRunner。

一、什么是MonkeyRunner
monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。
monkeyrunner工具与monkey工具并无关联。monkey工具直接运行在设备或模拟器的adbshell中,生成用户或系统的伪随机事件流。而monkeyrunner工具则是在工作站上通过API定义的特定命令和事件控制设备或模拟器。

monkeyrunner工具为Android测试提供了以下特性:
1.多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。您可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。您也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。

2.功能测试: monkeyrunner可以为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。

3.回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。

4.可扩展的自动化:由于monkeyrunner是一个API工具包,您可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunner API之外,您还可以使用标准的Python os和subpress模块来调用如adb这样的Android工具。

您还可以向monkeyrunner API中添加您自己的类。

monkeyrunner工具使用Jython(使用Java编程语言的一种Python实现)。Jython允许monkeyrunnerAPI与Android框架轻松的进行交互。使用Jython,您可以使用Python语法来获取API中的常量、类以及方法。

MonkeyRunner的参考文献在这里:http://developer.android.com/tools/help/monkeyrunner_concepts.html

二、一个简单的MonkeyRunner实例
您可以直接使用一个代码文件运行monkeyrunner,抑或在交互式对话中输入monkeyrunner语句。不论使用哪种方式,您都需要调用SDK目录的tools子目录下的monkeyrunner命令。如果您提供一个文件名作为运行参数,则monkeyrunner将视文件内容为Python程序,并加以运行;否则,它将提供一个交互对话环境。

monkeyrunner的命令语法为:

monkeyrunner -plugin

monkeyrunnerbasic.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 导入此程序所需的monkeyrunner模块   
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice   
# 连接当前设备,返回一个MonkeyDevice对象   
device = MonkeyRunner.waitForConnection()   
# 安装Android包,注意,此方法返回的返回值为boolean,由此您可以判断安装过程是否正常   
device.installPackage('myproject/bin/MyApplication.apk')   
# 运行此应用中的一个活动device.startActivity(component='com.marshalchen.Monkeyrunner.MainActivity')   
# 按下菜单按键   
device.press('KEYCODE_MENU','DOWN_AND_UP')   
# 截取屏幕截图   
result = device.takeSnapShot  
# 将截图保存至文件   
result.writeToFile('myproject/shot1.png','png')

然后转到$SDKTOOLS下执行 monkeyrunner monkeyrunnerbasic.py 就可执行测试了。

PS:上述内容,部分参考了 子杨 的博客,在此表示感谢。

三、常用功能的Monkeyrunner python脚本介绍:

1.输入等基本操作测试

1
2
3
4
import sys  
from com.android.monkeyrunner import MonkeyRunner as mr  
from com.android.monkeyrunner import MonkeyDevice as md  
from com.android.monkeyrunner import MonkeyImage as mi
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#connect device 连接设备  
#第一个参数为等待连接设备时间  
#第二个参数为具体连接的设备  
device = mr.waitForConnection(1.0,'emulator-5554')  
if not device:  
    print >> sys.stderr,"fail"  
    sys.exit(1)  
#定义要启动的Activity  
componentName='kg.monkey/.MonkeyActivity'  
#启动特定的Activity  
device.startActivity(component=componentName)  
mr.sleep(3.0)  
#do someting 进行我们的操作  
#输入 a s d  
device.type('asd')  
#输入回车  
device.press('KEYCODE_ENTER')  
#return keyboard 点击返回用于取消等下看到截图的下方的白条  
#device.press('KEYCODE_BACK')  
#------  
#takeSnapshot截图  
mr.sleep(3.0)  
result = device.takeSnapshot()  

#save to file 保存到文件  
result.writeToFile('takeSnapshot\result1.png','png');

2.图形化记录与回放
利用
[plain] view plaincopy
monkeyrunner monkey_recorder.py

脚本,可以打开如图所示可视化模拟器,各种操作可以显示在屏幕右侧,并且通过“Export Actions”导出。

导出之后可以运行monkeyrunner monkey_playback.py monkey_test1.mr,(monkey_test1.mr为刚才保存的脚本),这时可以看到模拟器,进行刚才一样的操作。

补充多设备操作:可以在monkey_playback.py中的main()方法的device设备获取时指定多设备。

下面是这两个有用的脚本:
monkey_recorder.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env monkeyrunner  
# Copyright 2010, The Android Open Source Project  
#  
# Licensed under the Apache License, Version 2.0 (the "License");  
# you may not use this file except in compliance with the License.  
# You may obtain a copy of the License at  
#  
#     http://www.apache.org/licenses/LICENSE-2.0  
#  
# Unless required by applicable law or agreed to in writing, software  
# distributed under the License is distributed on an "AS IS" BASIS,  
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
# See the License for the specific language governing permissions and  
# limitations under the License.  

from com.android.monkeyrunner import MonkeyRunner as mr  
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder  

device = mr.waitForConnection()  
recorder.start(device)

monkey_playback.py:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/env monkeyrunner  
# Copyright 2010, The Android Open Source Project  
#  
# Licensed under the Apache License, Version 2.0 (the "License");  
# you may not use this file except in compliance with the License.  
# You may obtain a copy of the License at  
#  
#     http://www.apache.org/licenses/LICENSE-2.0  
#  
# Unless required by applicable law or agreed to in writing, software  
# distributed under the License is distributed on an "AS IS" BASIS,  
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
# See the License for the specific language governing permissions and  
# limitations under the License.  

import sys  
from com.android.monkeyrunner import MonkeyRunner  

# The format of the file we are parsing is very carfeully constructed.  
# Each line corresponds to a single command.  The line is split into 2  
# parts with a | character.  Text to the left of the pipe denotes  
# which command to run.  The text to the right of the pipe is a python  
# dictionary (it can be evaled into existence) that specifies the  
# arguments for the command.  In most cases, this directly maps to the  
# keyword argument dictionary that could be passed to the underlying  
# command.   

# Lookup table to map command strings to functions that implement that  
# command.  
CMD_MAP = {  
    'TOUCH': lambda dev, arg: dev.touch(**arg),  
    'DRAG': lambda dev, arg: dev.drag(**arg),  
    'PRESS': lambda dev, arg: dev.press(**arg),  
    'TYPE': lambda dev, arg: dev.type(**arg),  
    'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)  
    }  

# Process a single file for the specified device.  
def process_file(fp, device):  
    for line in fp:  
        (cmd, rest) = line.split('|')  
        try:  
            # Parse the pydict  
            rest = eval(rest)  
        except:  
            print 'unable to parse options'  
            continue  

        if cmd not in CMD_MAP:  
            print 'unknown command: ' + cmd  
            continue  

        CMD_MAP[cmd](device, rest)  


def main():  
    file = sys.argv[1]  
    fp = open(file, 'r')  

    device = MonkeyRunner.waitForConnection()  

    process_file(fp, device)  
    fp.close();  


if __name__ == '__main__':  
    main()

PS:脚本内容 部分参考了 youxilua ,非常感谢。

四、使用插件扩展Monkeyrunner
您可以用Java语言创建新的类,并打包成一个或多个.jar文件,以此来扩展monkeyrunnerAPI。您可以使用您自己写的类或者继承现有的类来扩展monkeyrunnerAPI。您还可以使用此功能来初始化monkeyrunner环境。
为了使monkeyrunner加载一个插件,您应当如使用如表1中所述的-plugin参数来调用monkeyrunner命令。
在您编写的插件中,您可以导入或继承位于com.android.monkeyrunner包中的几个主要的monkeyrunner类:MonkeyDevice, MonkeyImage和MonkeyRunner.
请注意,插件无法让你访问Android的SDK。您不能导入com.android.app等包。这是因为monkeyrunner是在框架API层次之下与设备或模拟器进行交互的。
插件启动类
用于插件的.jar文件可以指定一个类,使其在脚本执行之前就实例化。如欲指定这个类,您需要在.jar文件的manifest中添加键MonkeyRunnerStartupRunner。其值为启动时运行的类的名称。以下代码段显示了如何在一个ant构建脚本达到这样的目的:
如欲访问monkeyrunner的运行时环境,启动类可以实现com.google.common.base.Predicate。例如,用这个类在默认的命名空间中设置一些变量:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package com.android.example;  

 import com.google.common.base.Predicate;  
 import org.python.util.PythonInterpreter;  

 public class Main implements Predicate {  
     @Override  
     public boolean apply(PythonInterpreter anInterpreter) {  

         /*  
         * Examples of creating and initializing variables in the monkeyrunner environment's  
         * namespace. During execution, the monkeyrunner program can refer to the variables "newtest"  
         * and "use_emulator"  
         *  
         */  
         anInterpreter.set("newtest", "enabled");  
         anInterpreter.set("use_emulator", 1);  

         return true;  
     }  
 }

五、常见问题(评论中的问题会不断补充)

1.“device.touch(10,100, 'DOWN_AND_UP')” 为什么报错?
ANS:可以把 'DOWN_AND_UP' 替换为 'MonkeyDevice.DOWN_AND_UP' ,这个问题的主要原因跟Monkeyrunner有关。

2.我输入了很多指令,但是很多没有执行
Ans:可以尝试 MonkeyRunner.sleep(time_in_seconds) 方法,让不同的动作之间有间隔。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值