Android自动测试之monkeyrunner工具

前言:

  最近开始研究Android自动化测试方法,对其中的一些工具、方法和框架做了一些简单的整理,其中包括android测试框架、CTS、Monkey、Monkeyrunner、benchmark、其它test tool等等。因接触时间很短,很多地方有不足之处,希望能和大家多多交流。

  一、什么是monkeyrunner

  monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。

  二、monkeyrunner工具同Monkey工具的差别

  Monkey:

  Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。

  monkeyrunner:

  monkeyrunner工具则是在工作站上通过API定义的特定命令和事件控制设备或模拟器。

  三、monkeyrunner的测试类型

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

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

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

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

  四、运行monkeyrunner

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

  monkeyrunner的命令语法为:

  monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

  五、实例

  以sample中的ApiDemos为例,先将其生成ApiDemos.apk。

  前提:已有device连接

  1、 将ApiDemos.apk放在$Android_Root\tools下。

  2、 在$Android_Root\tools下新建一个monkeyrunnerprogram.py文件,里面内容为:


1 # Imports the monkeyrunner modules used by this program

2

3  from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

4

5  # Connects to the current device, returning a MonkeyDevice object

6

7 device = MonkeyRunner.waitForConnection()

8

9  # Installs the Android package. Notice that this method returns a boolean, so you can test

10

11  # to see if the installation worked.

12

13 device.installPackage('./ApiDemos.apk')

14

15

16  # Runs the component

17

18 device.startActivity(component='com.example.android.apis/.ApiDemos')

19

20

21  # Presses the Menu button

22

23 device.press('KEYCODE_MENU','DOWN_AND_UP')

24

25

26  # Takes a screenshot

27

28 result = device.takeSnapshot()

29

30

31  # Writes the screenshot to a file

32

33 result.writeToFile('./shot1.png','png')

 注意:SDK上的例子有些错误,不可直接复制,否则执行命令时会发生错误。具体可与我的上面这段代码对照。

  3、 打开命令行转到Android_Root\tools目录下运行一下命令:


monkeyrunner monkeyrunnerprogram.py

110307 15:33:19.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.

110307 15:33:20.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.

110307 15:33:21.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice] Error starting command: monkey --port 12345

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]com.android.ddmlib.ShellCommandUnresponsiveException

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408)

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at com.android.ddmlib.Device.executeShellCommand(Device.java:276)

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at com.android.monkeyrunner.adb.AdbMonkeyDevice$1.run(AdbMonkeyDevice.java:89)

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.Executors$RunnableAdapter.call(UnknownSource)

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.FutureTask.run(Unknown Source)

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)

110307 15:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.lang.Thread.run(UnknownSource)

110307 15:33:57.437:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: press KEYCODE_MENU.

110307 15:33:59.171:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: quit.

  注:里面exception的提示我们可以忽略,因为我们可以看见 Monkey Command: press KEYCODE_MENU已经执行成功。

  4、 可以Android_Root\tools下查看生成的shot1.png的截图。

  六、实例扩展

  因为ApiDemos首页上按下MENU键没有菜单出现,为了更加形象化,在实例五的基础上继续试验:

  1、 在$Android_Root\tools下新建一个monkeyrunnerprogram1.py文件,里面内容为:


1 # Imports the monkeyrunner modules used by this program

2

3  from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

4

5 # Connects to the current device, returning a MonkeyDevice object

6

7 device = MonkeyRunner.waitForConnection()

8

9 # Takes a screenshot

10

11 result = device.takeSnapshot()

12

13 # Writes the screenshot to a file

14

15 result.writeToFile('./shotbegin.png','png')

16

17 # Presses the Down button

18

19 device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')

20

21 device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')

22

23 device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')

24

25 device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')

26

27 device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')

28

29 # Takes a screenshot

30

31 result = device.takeSnapshot()

32

33 # Writes the screenshot to a file

34

35 result.writeToFile('./shotend.png','png')

  2、  将画面定位在Apidemos的首页,并将光标定位在第一项上。

  3、  在$Android_Root\tools目录下运行一下命令:

  monkeyrunner monkeyrunnerprogram1.py

  4、在运行过程中我们可以看见光标不断向下移动,并且可以在当前目录下我们自定义的截图:

  运行前:

  运行后(做了五次下移操作):

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-02 19:25:44

Android自动测试之monkeyrunner工具的相关文章

Twitter开源Android自动截屏工具Screengrab

Twitter近日宣布开源Android应用截屏工具Screengrab,方便开发者在应用中整合截屏功能.Screengrab集成在Twitter的Fastlane开发者工具中,目前源代码已经托管到GitHub. 与Screengrab功能类似的开源截屏工具还有Android-screeshot-lib和Facebook的Screenshot-tests-for-android. 与很多互联网巨头类似,Twitter也是积极的开源者,通过开源相关工具和代码,Twitter一方面能够推销自己的工具

Android自动测试工具Monkey_Android

前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框架.CTS.Monkey.Monkeyrunner.benchmark.其它test tool等等.因接触时间很短,很多地方有不足之处,希望能和大家多多交流. 一.Monkey定义 探索软件测试工具有哪些,本文主要介绍Monkey工具.Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动.按键等操作来对设备上的程序进行压力测

android自动工具类TextUtils使用详解

今天,简单讲讲如何使用android自动的工具类TextUtils. 简单列举部分用法: Log.d(TAG, "---------------------------------"); //字符串拼接 Log.d(TAG, TextUtils.concat("Hello", " ", "world!").toString()); //判断是否为空字符串 Log.d(TAG, TextUtils.isEmpty("H

Pury — 一个新的 Android App 性能分析工具

本文讲的是Pury - 一个新的 Android App 性能分析工具, 手机应用存在的目的,就是在帮助用户做他们想做的事情的同时,提供最好的用户体验 -- 而用户体验的重中之重是应用的性能.但有时候开发者们却以性能为借口,既没有达到既定目标,又写着低质量并难以维护的代码.在这里我想引用 Michael A. Jackson 的一句话: "程序优化守则第一条:别去做它.程序优化守则第二条(仅限于专业人员):别去做它,现在还不是时候." 在开始任何优化之前,我们要先认清问题的症结所在.

微软提供自动更新拦截工具的官方下载

[科技讯]2月1日消息,近日微软在其官方网站上提供了IE10的自动更新拦截工具IE10 Blocker Toolkit的下载,这无疑是宣示着微软IE10 for Win7的即将发布.     据了解,为了防止给那些不愿升级新版的用户造成烦扰,微软通常会在Windows SP或是IE新版推送之前发布拦截工具,这样,用户即使开启着自动更新,也不会被迫升级.现在微软发布了IE10 Blocker Toolkit,那么按照惯例,在未来的数周时间里,微软就会发布IE10 for Win7正式版了.    

拨号-android 自动接听电话,并且开扩音导致本机打电话时麦克风无静音状态

问题描述 android 自动接听电话,并且开扩音导致本机打电话时麦克风无静音状态 小弟写了一个软件 ,主要监听并且自动接听电话,接听后用户可以选择打开或者关闭扩音, 但是用我开发的app拨打一次电话后,再用系统自带的拨号进行打电话就会出现, 对方接听后 这边说话对方听不到 ,如果把软件卸载后再重启手机 就恢复正常了 解决方案 可以试试在你的应用中,每次拨打电话时打开扩音,电话打完再关闭扩音,相当于恢复系统默认的扩音配置,对手机功能不产生影响

Android自动生成了一堆的button列表用,因为屏幕高度问题没显示完全。

问题描述 Android自动生成了一堆的button列表用,因为屏幕高度问题没显示完全. 想要的效果是这样的,也就是可以上下拖动,顶部蓝色layout固定不动.代码如下: //布局如下: <!-- 顶部蓝色工具栏 --> <RelativeLayout android:id=""@+id/fujin_top_llayout"" android:layout_width=""fill_parent"" andr

Android自动连接指定的wifi,免密码或指定密码

原文:Android自动连接指定的wifi,免密码或指定密码 一.运行时的状态 遇到一个这样的要求:"不进行扫描操作,怎么对指定的免密码WIFI进行连接(之前没有连接过)",于是动手写了一个Demo,如图所示未连接成功时的状态,第一个编辑框让用户输入SSID,第二个编辑框输入密码,密码可以根据实例情况输入,也可以不输入密码,因为有些Wifi免密码.这里的免密码不是指可以破解wifi密码.注意图片中手机顶部的wifi图标,是没有的,说明此时并没有打开手机的wifi.在手机上运行状态如下所

android 自动登录安全

问题描述 android 自动登录安全 android app登录成功后,服务器给App下发一个认证token,客户端把token做为应用程序的私有数据存储起来.以后,session过期了哪 解决方案 你说的这个其实就是cookie在本地存储账户信息,并且在一段时间内免登录的机制,只是你搬到了android上. 解决方案二: 嗯,就是考虑到信息安全 解决方案三: token 令牌机制加https 在弄个加密,,设置过期时间. 解决方案四: token 令牌机制加https 在弄个加密,,设置过期