可以写一个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\touch都是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")

安装D盘2100.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名称。可以调用sdk\builds-tools目录下的aapt获取

aapt dump baging d:\2100.apk

startActivity常用形式为:

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

执行后启动手机弹钢琴

MonkeyImage takeSnapshot()

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

例:Pic = device.takeSnapshot()

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

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\tools路径下的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)

pic2和pic1在90%范围内相似,则返回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. 实时监控内存变化

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

启动时长对比测试

兼容性自动化测试

安全自动化测试

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

Monkeyrunner学习的更多相关文章

  1. Android自动化测试之Monkeyrunner学习笔记(一)

    Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...

  2. 【转】monkeyrunner学习总结二:连接、安装、启动

    一.获取packageName与startActivity 前置条件:已成功安装配置SL4A并连接PC调试(参见:monkeyrunner学习总结一:环境搭建:http://www.amsoft.cn ...

  3. monkeyrunner学习笔记

    前面部分内容转自http://blog.csdn.net/zm2714/article/details/7980634 Android自动化测试之Monkeyrunner使用方法及实例 目前andro ...

  4. MonkeyRunner学习(3)脚本编辑

    除了cmd直接操作手机,也可以编辑好脚本后,运行脚本,一次操作多个脚本命令 a) 新建py格式脚本,如iReader.py b) 编辑脚本 #导入模块 from com.android.monkeyr ...

  5. MonkeyRunner学习(2)常用命令

    目录: 1.截图 2.暂停 (时延秒) 3.屏幕操作 4.打印 5.字符串发送到键盘输入(登录输入) 6.唤醒设备屏幕 7.重起手机 8.按键(系统键) 9.回车键 10.for 循环 11.循环截图 ...

  6. MonkeyRunner学习(1)测试连接

    前期的环境搭建详见:http://www.cnblogs.com/peng-lan/p/5388488.html 1.打开模拟器 打开模拟器有两种方法,正常的在eclipse 中启动就不介绍了 另一种 ...

  7. MonkeyRunner 学习

    monkeyrunner 本文档中包含 一个简单的monkeyrunner示例程序 monkeyrunner API简介 运行monkeyrunner monkeyrunner内建帮助 使用插件扩展m ...

  8. MonkeyRunner学习笔记(1)

    MonkeyRunner是java编程语言实现的Python写出来的一个API调用工具 MonkeyRunner有三个类:MonkeyRunner,MonkeyDevice,MonkeyImage M ...

  9. monkeyrunner学习--手机按键

    按下HOME键 device.press('KEYCODE_HOME','DOWN_AND_UP') 按下BACK键 device.press('KEYCODE_BACK','DOWN_AND_UP' ...

随机推荐

  1. paper 153:Delaunay三角剖分算法--get 这个小技术吧!

    直接摘自百度百科,希望大家能根据下面的介绍稍微理顺思路,按需使用,加油! 解释一下:点集的三角剖分(Triangulation),对数值分析(比如有限元分析)以及图形学来说,都是极为重要的一项预处理技 ...

  2. Sticks

    题目链接 题意:给你一组等长木棒,然后他随意砍断成n个木棒,木棒长度不一,但你知道分别是多少,要你求出原始木棒可能的最小长度. 思路:首先那个原始木棒的长度肯定是其总长度的约数,然后也肯定大于等于所有 ...

  3. R中unlist函数的使用

    买的书里面实例讲的不清不楚,所以看帮助文档了 用法:unlist(x, recursive = TRUE, use.names = TRUE) 帮助文档讲x可以是向量或者列表,如果是向量,则原样返回, ...

  4. 前端每日实战:99# 视频演示如何用纯 CSS 创作一个过山车 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/KBxYZg/ 可交互视频 此视频是 ...

  5. Eclipse对web项目设置请求路径(与项目名称不同)

    可以在下图位置,进行修改 也可以修改项目的路径下的.settings文件夹下的org.eclipse.wst.common.component的value属性 <property name=&q ...

  6. UITableView 支持左右滑动(一)

    原理如下: SwipeTableView subView 1 :  UIScrollView作为容器, 主要负责左右滑动, 每个tableView的顶部设置相同的contentInset subVie ...

  7. python中列表元素连接方法join用法实例

    python中列表元素连接方法join用法实例 这篇文章主要介绍了python中列表元素连接方法join用法,实例分析了Python中join方法的使用技巧,非常具有实用价值,分享给大家供大家参考. ...

  8. 微众银行c++选择题后记

    一个类的成员可以有:另一个类的对象,类的自身指针,自身类对象的引用(私有的如何初始化呢,所以不行,换成静态的可以),自身类对象(构造时如何初始化呢?) class A{ public: A(){} A ...

  9. python赞乎--学习开发

  10. ZwQueryDirectoryFile用法

    1. 当返回值为STATUS_SUCCESS时,返回的字节数保存在IoStatusBlock.Information字段中: 2. 如果FileName字段被指定了,那么对于同时指定的FileHand ...