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\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学习的更多相关文章
- Android自动化测试之Monkeyrunner学习笔记(一)
Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...
- 【转】monkeyrunner学习总结二:连接、安装、启动
一.获取packageName与startActivity 前置条件:已成功安装配置SL4A并连接PC调试(参见:monkeyrunner学习总结一:环境搭建:http://www.amsoft.cn ...
- monkeyrunner学习笔记
前面部分内容转自http://blog.csdn.net/zm2714/article/details/7980634 Android自动化测试之Monkeyrunner使用方法及实例 目前andro ...
- MonkeyRunner学习(3)脚本编辑
除了cmd直接操作手机,也可以编辑好脚本后,运行脚本,一次操作多个脚本命令 a) 新建py格式脚本,如iReader.py b) 编辑脚本 #导入模块 from com.android.monkeyr ...
- MonkeyRunner学习(2)常用命令
目录: 1.截图 2.暂停 (时延秒) 3.屏幕操作 4.打印 5.字符串发送到键盘输入(登录输入) 6.唤醒设备屏幕 7.重起手机 8.按键(系统键) 9.回车键 10.for 循环 11.循环截图 ...
- MonkeyRunner学习(1)测试连接
前期的环境搭建详见:http://www.cnblogs.com/peng-lan/p/5388488.html 1.打开模拟器 打开模拟器有两种方法,正常的在eclipse 中启动就不介绍了 另一种 ...
- MonkeyRunner 学习
monkeyrunner 本文档中包含 一个简单的monkeyrunner示例程序 monkeyrunner API简介 运行monkeyrunner monkeyrunner内建帮助 使用插件扩展m ...
- MonkeyRunner学习笔记(1)
MonkeyRunner是java编程语言实现的Python写出来的一个API调用工具 MonkeyRunner有三个类:MonkeyRunner,MonkeyDevice,MonkeyImage M ...
- monkeyrunner学习--手机按键
按下HOME键 device.press('KEYCODE_HOME','DOWN_AND_UP') 按下BACK键 device.press('KEYCODE_BACK','DOWN_AND_UP' ...
随机推荐
- 全国5A级旅游景区已达250家
至目前,全国5A级旅游景区已达250家,快来数数你去过多少? 全国5A级旅游景区 西藏(+) 拉萨市大昭寺.拉萨布达拉宫景区.日喀则扎什伦布寺景区.林芝巴松措景区 新增1:日喀则扎什伦布寺景区 扎什伦 ...
- flask 实现简易图书管理
""" 1.配置数据库 a.导入 SQLalchemy库 b.创建db对象,并配置参数 c.创建数据库 2.添加书和作者的模型 a.模型集成db.Model b.__ta ...
- 【转】Selenium 加载Chrome/Firefox浏览器配置文件
原文地址:https://www.cnblogs.com/eastonliu/p/9083982.html Selenium启动浏览器时,默认是打开一个新用户,不会加载原有的配置以及插件.但有些时候我 ...
- python 查看以及更新安装包
查看 在终端(windows:电脑win+R, linux:ctrl+alt+T)输入: pip list 或者 conda list 更新 在终端(windows:电脑win+R, linux:ct ...
- ss证书问题
#SSL--校验网站证书 #一.什么是SSL证书 from urllib import request #ssl免验证 import ssl ssl._create_default_https_con ...
- 常用缓存淘汰算法(LFU、LRU、ARC、FIFO、MRU)
缓存算法是指令的一个明细表,用于决定缓存系统中哪些数据应该被删去. 常见类型包括LFU.LRU.ARC.FIFO.MRU. 最不经常使用算法(LFU): 这个缓存算法使用一个计数器来记录条目被访问的频 ...
- Codeforces 1114C(数论)
题面 传送门 分析 我们先考虑n!在10进制下有多少个0 由于10=2*5, 我们考虑n!的分解式中5的指数,答案显然等于\(\frac{n}{5}+\frac{n}{5^2}+\frac{n}{5^ ...
- Windows平台下在Emacs中使用plantuml中文乱码问题(已解决)
Windows平台下在Emacs中使用plantuml中文乱码问题(已解决) */--> code {color: #FF0000} pre.src {background-color: #00 ...
- 北京邀请赛 B. Beautiful Garden
题意:给你坐标和n个点,求最少移动的点使得n个点成等差数列 思路:既然要成等差数列,那么最起码有两个点是不动的,然后枚举这两个点中间的点的个数,近期水的要死,看了队友的代码做的 #include &l ...
- 获取模糊匹配的div id属性
html中有一批id,以数字+固定字符结尾,前台需要把这一批id组成数组传递给后台 假设固定结尾字符为“pic”,使用 var pidlist=$("[id$='pic']");将 ...