zoukankan      html  css  js  c++  java
  • Monkeyrunner学习

    可以写一个pyhon工程,安装在android进行测试,还可以截屏操作。Monkeyrunner为framework层开发。MonkeyRunner本身是Java做的,为了和Python连接,做了一个叫Jython的东东,

    1. 多种多设备控制

    2. 功能测试

    3. 回归测试

    4. 可扩展功能测试

    官网提供的最简单的例子:

    # Imports the monkeyrunner modules used by this program 

    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice 

    # Connects to the current device, returning a MonkeyDevice object 

    device = MonkeyRunner.waitForConnection() 

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

    # to see if the installation worked. 此处取apk的绝对路径

    device.installPackage('myproject/bin/MyApplication.apk') 

    # sets a variable with the package's internal name,给apk所在的包取出来,赋给变量package

    package = 'com.example.android.myapplication' 

    # sets a variable with the name of an Activity in the package ,得到Activity并存在变量中

    activity = 'com.example.android.myapplication.MainActivity' 

    # sets the name of the component to start,这个和Instrumentation很类似啊,包名/Activity名 

    runComponent = package + '/' + activity 

    # Runs the component ,没有使用device.touch

    device.startActivity(component=runComponent) 

    # Presses the Menu button,这种press是按下、起来

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

    # Takes a screenshot 

    result = device.takeSnapshot() 

    # Writes the screenshot to a file 

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

    主要API

    com.android.monkeyrunner.MonkeyDevice.drag

    com.android.monkeyrunner.MonkeyDevice.touch 传touch的点的(x,y)坐标

    实践一个调用calculator100次的script,可以work。calculator的包名可以用ddms监控得到(eclipse - window - open perspective -ddms )。使用PowerShell操作命令行感觉真好啊~

    #coding=utf-8
    from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
    device = MonkeyRunner.waitForConnection()
    device.shell("monkey -p com.android.calculator2 -v 1")
    def tapButton(Number):
        import random
        for i in range(0,Number):
            keyValue = random.randint(1,20)
            if keyValue == 1:
                device.touch(200,265,'DOWN_AND_UP') #Tap 'Clear' Button
            elif keyValue == 2:
                device.drag((200,265),(200,265),1.5,10) #Long touch "Clear" button;
            elif keyValue == 3:
                device.touch(465,275,'DOWN_AND_UP') # Tap "Delete" button;
            elif keyValue == 4:
                device.drag((465,275),(465,275),1.5,10) #Long touch "Delete" button;
            elif keyValue == 5:
                device.touch(70,430,'DOWN_AND_UP') #Tag "7" button;
            elif keyValue == 6:
                device.touch(220,430,'DOWN_AND_UP') #Tap "8" button;
            elif keyValue == 7:
                device.touch(340,430,'DOWN_AND_UP') #Tap "9" button;
            elif keyValue == 8:
                device.touch(470,430,'DOWN_AND_UP') #Tap "division" button;
            elif keyValue == 9:
                device.touch(70,580,'DOWN_AND_UP') #Tap "9" button;
            elif keyValue == 10:
                device.touch(220,580,'DOWN_AND_UP') #Tap "9" button;
            elif keyValue == 11:
                device.touch(340,580,'DOWN_AND_UP') #Tap "9" button;
            elif keyValue == 12:
                device.touch(470,580,'DOWN_AND_UP') #Tap "9" button;
            elif keyValue == 13:
                device.touch(70,730,'DOWN_AND_UP') #Tap "9" button;
            elif keyValue == 14:
                device.touch(220,730,'DOWN_AND_UP') #Tap "9" button;
            elif keyValue == 15:
                device.touch(340,730,'DOWN_AND_UP') #Tap "-" button;
            elif keyValue == 16:
                device.touch(470,730,'DOWN_AND_UP') #Tap "." button;
            elif keyValue == 17:
                device.touch(70,875,'DOWN_AND_UP') #Tap "9" button;
            elif keyValue == 18:
                device.touch(220,875,'DOWN_AND_UP') #Tap "0" button;
            elif keyValue == 19:
                device.touch(340,875,'DOWN_AND_UP') #Tap "=" button;
            elif keyValue == 20:
                device.touch(470,875,'DOWN_AND_UP') #Tap "+" button;
            else:
                pass
            MonkeyRunner.sleep(0.5)
    tapButton(100)

    drag ouch都是MonkeyDevice中的方法。MonkeyRunner有3个modules,也就是类: MonkeyDevice、MonkeyImage、MonkeyRunner

    MonkeyRecorder可以跟踪手机状态。从android源码中剥离出monkeyrunner的源码,导入到工程里,创建一个test类,使用java借助monkeyrecorder玩一玩:手机上的各种key,在android.view中有KeyEvent.class,里面有keycode对应的数字,查看MonkeyDevice.type帮助文档,里面的keycode值就和这个对应。test的思路:new monkeyrecorder对象,等待device连接上,设置recorder frame可见。

    Public class MyTest{
    
     static IMonkeyDevice device;
    
        public static void main(String [] args){
    
           device = new AdbBacken().waitforConnection();
           if (device ! = null){
            MonkeyRecorderFrame frame = new MonkeyRecorderFrame(device);
         frame.setVisible(true);}
    }        

    keyPress事件流其实就是调用了keyEvent里面的几个事件,复写了其方法

     关于脚本移植后好用的问题:比如手机屏幕不同导致分辨率变更

    320*480 -》 480*800 可以这样换算一下

    device.touch(340,580,'DOWN_AND_UP')这句可以写成:320/x=480/newx;480/580=800/newY

    Hierarchyviewer(tools里一个工具)获取布局,即各个控件的坐标,再定位;各种控件在底层也是获取坐标点。4.1以下需要root权限,4.1以上有ui工具了 http://blog.csdn.net/zm2714/article/details/7985061 这是使用hierachyviewer的心得文章

    后续持续集成:

    2014年1月推出RobotiumRecord工具,http://robotium.myshopify.com/products/robotium-recorder 可以直接录制,然后好歹改下脚本就能跑,很方便的

    Robotium是基于控件的工具,对于跨应用比较弱,结合monkeyrunner这种跨应用强的工具,就算不用uiautomatic,也可以解决一般的APP测试问题

    测试云:所有脚本保存在云端,云端可以做个数据库,比如mysql。通过云端发起远程控制你的终端,使用脚本发起一个事件流,通过monkeyrunner远程调用和控制;终端可以录制等工作,完成后传到云端进行管理。类似Itestin、易测云

    用例管理、网页展示

    **************

    网上找到常用方法:

    MonkeyRunner的一些常用方法:

    (详细参考:http://developer.android.com/tools/help/MonkeyRunner.html

    void alert (string message, string title, string okTitle)

    弹出一个对话框,默认标题“警告”,按钮显示“确定”,可暂停当前的程序

    例:MonkeyRunner.alert("hello world")

     

    弹出一个hello world对话框

    integer choice (string message, iterable choices, string title)

    显示带有一列可选项的对话框,可暂停当前的程序,选择后返回integer对象,代表选择项的序列index

    例:MonkeyRunner.choice("choice a sex",["man","women"])

     

    弹出一个选择性别的对话框,选择man会返回0,选择women会返回2

    string input (string message, string initialValue, string title, string okTitle, string cancelTitle)

    显示一个输入框,接受输入后返回字符串

    例:MonkeyRunner.input("enter text")

     

    弹出一个输入框,输入后确认返回字符串

    void sleep(float seconds)

    暂停当前程序指定秒

    例:MonkeyRunner.sleep(2)

    暂停当前程序2

    MonkeyDevice waitForConnection (float timeout, string deviceId)

    timeout

    等待连接时间,默认为一直等待.

    deviceId

    设备名,可通过adb devices查看当前连接设备名,一般可以不指定.

     

    返回一个MonkeyDevice 实例

    常用写法为:

    device = MonkeRunner.waitForConnection()

    通过获取到的device对象,可以调用MonkeyDevice的方法对设备进行操作。

    MonkeyDevice的一些常用方法:

    (详细参考:http://wiki.eoeandroid.com/MonkeyDevice)

    void drag (tuple start, tuple end, float duration, integer steps)

    例:device.drag((120,240),(200,240),1,10)

    屏幕解锁操作,从(120,240)向(200,240)滑动,用时1秒,10为默认值

    object getProperty (string key)

    查询设备相关信息,参数参考:http://developer.android.com/tools/help/MonkeyDevice.html#table1

    void installPackage (string path)

    安装指定路径的APK文件。如果改文件已安装,则会覆盖安装

    例:device.installPackage("d:/2100.apk")

    安装D2100.apk,路径中使用 /

    void press (string name, dictionary type)

    模拟按钮操作。

    name 为按键码,参考:http://docs.eoeandroid.com/reference/android/view/KeyEvent.html

    type 键盘事件类型可用的值有DOWN, UP, DOWN_AND_UP

    void removePackage (string package)

    删除指定的包,包括清除其数据和缓存

    例:device.removePackage("evertone.Piano")

    卸载piano程序,程序名通过aapt查看2100.apk文件,或者在shell模式下进入data/data目录下查找

    void shell (string cmd)

    执行shell命令并返回结果

    例:device.shell("date")

    执行shell命令,查询日期

    void startActivity (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags)

    启动一个应用,对于需要测试的应用需要知道应用名和入口activity名称。可以调用sdkuilds-tools目录下的aapt获取

    aapt dump baging d:2100.apk

     

    startActivity常用形式为:

    例:device.startActivity(component = "evertone.Piano/evertone.Piano.loading")

    执行后启动手机弹钢琴

    MonkeyImage takeSnapshot()

    屏幕截图,返回包含当前显示截图的MonkeyImage对象

    例:Pic = device.takeSnapshot()

    手机屏幕截图,结果保存在Pic里。picMonkeyImage实例

    void touch (integer x, integer y, integer type)

    屏幕点击(x,y)type 键盘事件类型可用的值有DOWN, UP, DOWN_AND_UP

    例:device.touch(93,143,"DOWN_AND_UP")

    点击屏幕(93,143)位置。屏幕坐标获取可使用sdk ools路径下的Hierarchyviewer工具

    void type (string message)

    向设备发送包含字符的信息,等同于多次调用press()方法。现在发现message中只能写数字、英文,不能有空格,否则会输入失败

    例:device.type("123adc")

    输入 123abc

    void wake ()

    唤醒屏幕。暂时没发现有什么用 ==

    MonkeyImage的一些常用方法:

    (详细参考:http://wiki.eoeandroid.com/MonkeyImage

    MonkeyImage对象一般不用直接创建,在获取了MonkeyDevice对象后,调用takeSnapshot()方法即可

    例:pic = MonkeyDevice.takeSnapshot()

    string convertToBytes (string format)

    将当前图像转换成特定格式,并且作为字符串返回

    tuple getRawPixel (integer x, integer y)

    返回图像位置坐标(x,y)上的单个像素点,作为一个整数元组,以(a,r,g,b)格式。可对特定点进行取色

    MonkeyImage getSubImage (tuple rect)

    从当前图片中取出部分区域,创建一个新的MonkeyImage对象。参数为元祖,指定截图区域

    例:pic_new=pic.getSubImage((0,0,100,100))

    boolean sameAs (MonkeyImage other, float percent)

    对比两个MonkeyImage对象是否相等(比较截图是否一致)。参数percent指定两个图像之间差异在多少百分比之内可以看做“相等”。可进行自动化结果校验

    例:pic2.sameAs(pic1,0.9)

    pic2pic190%范围内相似,则返回True,否则返回False

    void writeToFile (string path, string format)

    指定路径和格式,保存图片文件

    例:pic1.writeToFile("d:/pic2.png","png")

    指定图片格式为png,保存在本地d:/pic2.png路径。保存成功则返回True

     

    MonkeyRunner进行脚本编写

    1. 启动一个MonkeyRunner范例

    2. 如何获取mOnkeyRunner的API文档

    3. 如何依据API文档写一个简单的测试脚本

    4. 脚本写完后应加入什么样的代码(用python或者Java语言配合均可)进行预测结果和实测结果判断

    5. 如何设定输出log

    Monkey压力自动化测试

    1. 测试app

    2. 测试整机

    3. 抓log

    4. 用linux环境读取日志

    5. 异常分析

    6. 场景分析

    7. 用例分析

    性能自动化测试

    1. cpu、内存、apk启动时长、电量测试

    2. 安全测试、兼容性测试、稳定性和可靠性测试 

    3. 内存泄露分析MAT工具使用

    4. 市面上重点的云框架GT、百度MTC、ITestin工具使用

    性能测试脚本编写

    1. 启动一个app测试性能

    2. 如何获取cpu,关注什么

    3. cpu运行hz百分比和jiffis怎么样才算合格的app

    内存工具进行分析

    1. 获取内存 (堆栈内存,物理内存,虚拟机内存)

    2. 定位代码和函数

    3. 实时监控内存变化

    电量自动化 整机和单进程监控

    启动时长对比测试

    兼容性自动化测试

    安全自动化测试

    自动化测试框架的发展:第一代是录制回放;第二代是加入判断点,用例集;第三代引入模块化思想、库函数、数据驱动思想、关键字驱动思想 

  • 相关阅读:
    css学习之 display:inline-block;
    java重写
    PDF在线阅读 FlexPaper 惰性加载 ;
    js两种生成对象模式(公有成员和成员私有)
    js 设计模式-接口
    聊聊 elasticsearch 之分词器配置 (IK+pinyin)
    nexus 批量上传jar到私有仓库内
    Java IDEA 根据mybatis-generator-core自动生成代码支持sqlserver获取备注(二)
    Elasticsearch实现搜索推荐词
    Java IDEA根据database以及脚本代码自动生成DO,DAO,SqlMapper文件(一)
  • 原文地址:https://www.cnblogs.com/ianthe/p/3693230.html
Copyright © 2011-2022 走看看