Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 292|回复: 0

[默认分类] Android自动测试之monkeyrunner工具

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-11 17:04:38 | 显示全部楼层 |阅读模式
                                                      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、多设备控制:monkeyrunnerAPI可以跨多个设备或模拟器实施测试套件。您可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。您也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。
    2、 功能测试: monkeyrunner可以为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。
    3、 回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。
    4、 可扩展的自动化:由于monkeyrunner是一个API工具包,您可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunnerAPI之外,您还可以使用标准的Python os和subprocess模块来调用AndroidDebug 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目录下运行一下命令:
    monkeyrunnermonkeyrunnerprogram.py
    11030715:33:19.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command:wake.
    11030715:33:20.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command:wake.
    11030715:33:21.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command:wake.
    11030715:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]Error starting command: monkey --port 12345
    11030715:33:22.718:S [pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice]com.android.ddmlib.ShellCommandUnresponsiveException
    11030715:33:22.718:S [pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice] at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408)
    11030715:33:22.718:S [pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice] at com.android.ddmlib.Device.executeShellCommand(Device.java:276)
    11030715:33:22.718:S [pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice] at com.android.monkeyrunner.adb.AdbMonkeyDevice$1.run(AdbMonkeyDevice.java:89)
    11030715:33:22.718:S [pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice] at java.util.concurrent.Executors$RunnableAdapter.call(UnknownSource)
    11030715:33:22.718:S [pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice] at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    11030715:33:22.718:S [pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice] at java.util.concurrent.FutureTask.run(Unknown Source)
    11030715:33:22.718:S [pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice] at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(UnknownSource)
    11030715:33:22.718:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  atjava.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)
    11030715:33:22.718:S [pool-1-thread-1][com.android.monkeyrunner.adb.AdbMonkeyDevice] at java.lang.Thread.run(UnknownSource)
    11030715:33:57.437:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: press KEYCODE_MENU.
    11030715: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、在运行过程中我们可以看见光标不断向下移动,并且可以在当前目录下我们自定义的截图:
    运行前:shotbegin.png

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

    参考资料:
    http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.HTML

    更多Android文档可以参考:

    Android_article

    下一篇:Android自动测试之benchmark test 简介
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-20 22:20 , Processed in 0.445953 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表