zoukankan      html  css  js  c++  java
  • android测试之——mokeyrunner上(二)

    以下是本人原创,如若转载和使用请注明转载地址。本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址

    感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址,并且请尊重劳动成果,谢谢!

    mokeyrunner

    最近导师要求做ppt讲解什么是mokeyrunner,从网上寻找了些案例及其mokeyrunner的使用教程,下面详细介绍什么是mokeyrunner。

    一、什么是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 API

    该monkeyrunner API被包含在包中的三个模块 com.android.monkeyrunner

    • MonkeyRunner:一类为monkeyrunner程序的实用工具方法。这个类提供了用于连接monkeyrunner至设备或模拟器的方法。它还提供了用于创建用户界面的monkeyrunner程序以及显示内置帮助的方法。
    • MonkeyDevice:代表一个设备或模拟器。这个类提供了安装和卸载程序包,启动一个活动,并发送键盘或触摸事件到应用程序的方法。您也可以使用这个类来运行测试包。
    • MonkeyImage:表示一个屏幕捕捉的图像。这个类提供了用于捕捉画面,转换成位图图像,以各种不同的格式,比较两个MonkeyImage对象,写一个图像文件的方法。

     


    mokeyrunner和python的配合使用

    一:录制和播放脚本

    1. #Usage: monkeyrunner recorder.py    
    2. #recorder.py  http://mirror.yongbok.net/linux/android/repository/platform/sdk/monkeyrunner/scripts/monkey_recorder.py  
    3.   
    4.   
    5. from com.android.monkeyrunner import MonkeyRunner as mr  
    6. from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder  
    7.   
    8. device = mr.waitForConnection()  
    9. recorder.start(device)  
    10. #END recorder.py  
    11. #Press ExportAction to save recorded scrip to a file  
    12. #Example of result:  
    13. #PRESS|{'name':'MENU','type':'downAndUp',}  
    14. #TOUCH|{'x':190,'y':195,'type':'downAndUp',}  
    15. #TYPE|{'message':'',}  
    16. 将以上代码保存为recorder.py后在cmd窗口中执行命令: monkeyrunner recorder.py即可开始录制。  
    17. ============================================================================================  
    18. #Usage: monkeyrunner playback.py "myscript"  
    19. #playback.py   http://mirror.yongbok.net/linux/android/repository/platform/sdk/monkeyrunner/scripts/monkey_playback.py  
    20. import sys  
    21. from com.android.monkeyrunner import MonkeyRunner  
    22.   
    23. # The format of the file we are parsing is very carfeully constructed.  
    24. # Each line corresponds to a single command.  The line is split into 2  
    25. # parts with a | character.  Text to the left of the pipe denotes  
    26. # which command to run.  The text to the right of the pipe is a python  
    27. # dictionary (it can be evaled into existence) that specifies the  
    28. # arguments for the command.  In most cases, this directly maps to the  
    29. # keyword argument dictionary that could be passed to the underlying  
    30. # command.   
    31.   
    32. # Lookup table to map command strings to functions that implement that  
    33. # command.  
    34. CMD_MAP = {  
    35.     'TOUCH'lambda dev, arg: dev.touch(**arg),  
    36.     'DRAG'lambda dev, arg: dev.drag(**arg),  
    37.     'PRESS'lambda dev, arg: dev.press(**arg),  
    38.     'TYPE'lambda dev, arg: dev.type(**arg),  
    39.     'WAIT'lambda dev, arg: MonkeyRunner.sleep(**arg)  
    40.     }  
    41.   
    42. # Process a single file for the specified device.  
    43. def process_file(fp, device):  
    44.     for line in fp:  
    45.         (cmd, rest) = line.split('|')  
    46.         try:  
    47.             # Parse the pydict  
    48.             rest = eval(rest)  
    49.         except:  
    50.             print 'unable to parse options'  
    51.             continue  
    52.   
    53.         if cmd not in CMD_MAP:  
    54.             print 'unknown command: ' + cmd  
    55.             continue  
    56.   
    57.         CMD_MAP[cmd](device, rest)  
    58.   
    59.   
    60. def main():  
    61.     file = sys.argv[1]  
    62.     fp = open(file, 'r')  
    63.   
    64.     device = MonkeyRunner.waitForConnection()  
    65.       
    66.     process_file(fp, device)  
    67.     fp.close();  
    68.       
    69.   
    70. if __name__ == '__main__':  
    71.     main()  

    将以上代码保存为playback.py后在cmd窗口中执行命令monkeyrunner playback.py "myscript"  即可播放录制的脚本“myscript”。

    二、mokeyrunner基本命令

    1. #导入模块;
        from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
    2. #连接当前设备,并返回一个MonkeyDevice对象;
        device = MonkeyRunner.waitForConnection()
        if not device:
            print "Please connect a device to start!"
        else:
            print "Start "
       
    3. #安装Android包,注意,此方法返回的返回值为boolean,由此可以判断安装过程是否正常 ;
        device.installPackage('myproject/bin/MyApplication.apk')
        device.removePackage ('com.example.android.notepad')
        print ('卸载成功')
        device.installPackage('ApiDemos.apk')
        print ('安装成功')
    4. #启动一个Activity;
        device.startActivity
        (component='com.android.htccontacts/com.android.htccontacts.ContactsTabActivity')
    5. #截图;
        result = device.takeSnapshot()
        result.writeToFile('C:\Users\Martin\Desktop\test.png','png')
    6. #时延(秒);
        MonkeyRunner.sleep(3)
    7. #滑动屏幕;
        for i in range(1,70):


            device.drag((250,850),(250,110),0.1,10)


         //开始,结束,持续时间,步骤  


           device.drag((250,110),(250,850),0.1,10)
       MonkeyRunner.sleep(1)
    8. #触击屏幕;
        device.touch(507,72,"DOWN_AND_UP")
    9. #执行adb shell命令;
        device.shell("input text goup01")
    按下HOME键     device.press('KEYCODE_HOME','DOWN_AND_UP')
    按下BACK键     device.press('KEYCODE_BACK','DOWN_AND_UP')
    按下下导航键     device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')
    按下上导航键     device.press('KEYCODE_DPAD_UP','DOWN_AND_UP')
    按下OK键     
    device.press('KEYCODE_DPAD_CENTER','DOWN_AND_UP')
            
    相应的按键对应的名称如下:
    home键:KEYCODE_HOME
    back键:KEYCODE_BACK
    send键:KEYCODE_CALL
    end键:KEYCODE_ENDCALL
    上导航键:KEYCODE_DPAD_UP
    下导航键:KEYCODE_DPAD_DOWN
    左导航:KEYCODE_DPAD_LEFT
    右导航键:KEYCODE_DPAD_RIGHT
    ok键:KEYCODE_DPAD_CENTER
    上音量键:KEYCODE_VOLUME_UP
    下音量键:KEYCODE_VOLUME_DOWN
    power键:KEYCODE_POWER
    camera键:KEYCODE_CAMERA
    menu键:KEYCODE_MENU

    三、monkeyrunner之使用ID

    monkeyrunner录制的脚本点击事件等使用的是坐标,在不同尺寸的平板上测试该脚本不通用。下面介绍通过调用应用软件的ID进行操作软件,此操作需要用到以下类和工具:

      1、安卓自有目录sdk oolshierarchyviewer.bat工具可以用来查看应用程序的ID。

      操作hierarchyviewer.bat工具步骤:

      (1)、启动安卓模拟器或连接实机,打开需要查看ID的软件界面。此处以google搜索界面为例。然后双击打开hierarchyviewer.bat,显示搜索界面的activity,即下图左侧被选中的项,表示搜索界面的完整包名。

      (2)点击Load View Hierarchy按钮,展现该搜索界面的层级图。选中指定的控件,查看ID名称。

      在属性显示区域可以看到各个控件所处的坐标位置,以及可以查看模拟器上任务栏的高度,这些信息可以用于坐标计算中。

      2、通过EasyMonkeyDevice类和By类来调用控件ID。

      一些常用控件的写法如下:

      (1)输入框的ID写法:

      easy_device.type(By.id('id/name_text),'zhangsan')

      (2)复选框/单选/按钮的ID写法:

      easy_device.touch(By.id('id/login_button'),MonkeyDevice.DOWN_AND_UP)

      (3)当两个ID名称相同时,可以使用层级进行定位

      easy_device.touch(By.id('id/parent_button'),MonkeyDevice.DOWN_AND_UP,By.id('id/current_button'),MonkeyDevice.DOWN_AND_UP)

      通过ID进行计算器操作示例calculator.py:

    from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
    from com.android.monkeyrunner.easy import EasyMonkeyDevice
    from com.android.monkeyrunner.easy import By
    from com.android.chimpchat.hierarchyviewer import HierarchyViewer
    from com.android.hierarchyviewerlib.device import ViewNode
    device = MonkeyRunner.waitForConnection()
    package = 'com.android.calculator2'
    activity = 'com.android.calculator2.Calculator'
    runComponent = package + '/' + activity
    device.startActivity(component=runComponent)
    MonkeyRunner.sleep(3.0)
    easy_device = EasyMonkeyDevice(device)  #init easymonkeydevice object must start activity at first.Because the init method
    will getHierarchyViewer();
    easy_device.touch(By.id('id/digit7'),MonkeyDevice.DOWN_AND_UP)
    easy_device.touch(By.id('id/mul'),MonkeyDevice.DOWN_AND_UP)
    easy_device.touch(By.id('id/digit8'),MonkeyDevice.DOWN_AND_UP)
    easy_device.touch(By.id('id/equal'),MonkeyDevice.DOWN_AND_UP)
    MonkeyRunner.sleep(1.0)
    pic = device.takeSnapshot()
    pic.writeToFile('D:\monkeyrunner\result.png','png')
    print 'test finished!'

      3、运行文件模拟计算7*8=56,生成result.png。monkeyrunner   calculator.py

      用ID进行参数差不多都是这个思路。但是对于列表、或者弹出框则无法直接通过点击ID操作成功,需要计算ID的坐标。


     



  • 相关阅读:
    2017.4.6下午
    2017.4.6上午
    2017.3.31下午
    2017.4.5下午
    2017.4.5上午
    2017.4.1上午
    2017.3.31上午
    2017.3.28下午
    2017.3.28上午
    3.28上午
  • 原文地址:https://www.cnblogs.com/wang3680/p/e9160f167343881d21ff07fd02ddcbf4.html
Copyright © 2011-2022 走看看