自动化测试MonkeyRunner

简介

monkeyrunner即android SDK中自带的工具之一,此工具提供API可按制android设备或模拟器。

monkeyrunner提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。

monkeyrunner工具的主要目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。

工具特性

多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。您可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。您也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。

功能测试:monkeyrunner可以为一个应用自动化功能测试。为您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。

回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。

可扩展的自动化:由于monkeyrunner是一个API工具包,您可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunner    API之外,您还可以使用标准的Python    os和subprocess模块来调用如adb这样的Android工具。

官方原文描述请见:http://developer.android.com/tools/help/monkeyrunner_concepts.html

运行

Monkeyrunner API主要包括三个模块

MonkeyRunner:这个类提供了用于连接monkeyrunner和设备或模拟器的方法,它还提供了用于创建用户界面显示提供了方法。

MonkeyDevice:代表一个设备或模拟器。这个类为安装和卸载包、开启Activity、发送按键和触摸事件、运行测试包等提供了方法。

MonkeyImage:这个类提供了捕捉屏幕的方法。这个类为截图、将位图转换成各种格式、对比两个MonkeyImage对象、将image保存到文件等提供了方法。

运行monkeyrunner

命令语法为:monkeyrunner

方式一:在CMD命令窗口直接运行monkeyrunner

方式二:使用Python编写测试代码文件,在CMD中执行monkeyrunner Findyou.py运行

不论使用哪种方式,您都需要调用SDK目录的tools子目录下的monkeyrunner命令。

注意:在运行monkeyrunner之前必须先运行相应的模拟器或连接真机,否则monkeyrunner无法连接到设备

运行模拟器有两种方法:1、通过eclipse中执行模拟器 2、在CMD中通过命令调用模拟器

这里介绍通过命令,在CMD中执行模拟器的方法

emulator -avd test

上面命令中test是指模拟器的名称。

实例

*准备

a.连接安卓真机设备

b.运行CMD,检测是否连接成功

CMD>adb devices

附:

问题:CMD运行提示adb不是内部或外部命令,也不是可运行的程序或批处理文件。

解决:电脑环境变量未配置,将adb所在目录配在环境变量里。

方法:

1.打开CMD,运行monkeyrunner

2.进入monkeyrunner的shell命令交互模式后,逐条输入以下命令

#引入本程序所用到的模块

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage

#连接手机设备

device=MonkeyRunner.waitForConnection()

#卸载APP

device.removePackage('cn.richinfo.thinkdrive')

#安装新的APP

device.installPackage('E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk')

检查手机app是否已更新

官方API

MonkeyRunner

MonkeyRunner类,包含一下静态方法

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

向运行当前程序的进程显示警告对话框。对话框是模态的,所以程序暂停,直到用户单击对话框的按钮。

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

显示一个对话框,其中包含运行当前程序的进程的选项列表。对话框是模态的,所以程序暂停,直到用户单击其中一个对话框的按钮。

void help(string format)

以类似于Python的pydoc工具的风格,使用指定的格式显示monkeyrunner API引用。

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

显示接受输入并将其返回给程序的对话框。对话框是模态的,所以程序暂停,直到用户单击其中一个对话框的按钮。 该对话框包含两个按钮,其中一个显示okTitle值,另一个显示为cancelTitle值。如果用户单击okTitle按钮,则返回输入框的当前值。如果用户点击cancelTitle按钮,则返回一个空字符串。

void sleep(float seconds)

暂停当前程序指定的秒数。

MonkeyDevice waitForConnection(float timeout,string deviceId)

尝试在monkeyrunner后端和指定的设备或模拟器之间建立连接。

MonkeyDevice

Monkeyrunner的工作站中可访问的设备或仿真器。此类用于控制Android设备或模拟器。方法发送UI事件,检索信息,安装和删除应用程序,并运行应用程序。

通常不需要创建一个MonkeyDevice实例。相反,您可以使用MonkeyRunner.waitForConnection()从与设备或模拟器的连接创建新对象。

例如,而不是使用:

newdevice=MonkeyDevice()

你需要用这种方式获取Device对象:

newdevice=MonkeyRunner.waitForConnection()

常量

string DOWN使用press()或touch()的type参数来发送DOWN事件。

string UP使用press()或touch()的type参数来发送UP事件。

string DOWN_AND_UP使用press()或touch()的type参数立即发送一个DOWN事件,然后再发送UP事件。

方法

void broadcastIntent(string uri,string action,string data,string mimetype,iterable categoriesdictionaryextras,component component,iterable flags)

广播此设备的意图,就像Intent来自应用程序一样。有关参数的更多信息,请参阅Intent。

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

在此设备的屏幕上模拟拖动手势(触摸,按住和移动)。

object getProperty(string key)

给定系统环境变量的名称,返回该设备的值。可用的变量名称在下面表1中列出

object getSystemProperty(string key)

.adb shell的API相当于getprop 。这是供平台开发人员使用的。

void installPackage(string path)

将packageFile中包含的Android应用程序或测试包安装到此设备上。如果应用程序或测试包已经安装,它将被替换。

dictionary instrument(string className,dictionary args)

在Android测试下运行指定的组件,并将结果返回到字典中,其精确格式由正在运行的组件决定。组件必须已经存在于此设备上。

void press(string name,dictionary type)

将由type指定的键事件发送到由keycode指定的键。

void reboot(string into)

将此设备重新引导到由bootloadType指定的引导加载程序中。

void removePackage(string package)

从该设备中删除指定的包,包括其数据和缓存。

object shell(string cmd)

执行一个adb shell命令并返回结果(如果有的话)。

void startActivity(string uri,string action,string data,string mimetype,iterable categoriesdictionaryextras,component component,flags)

通过发送从提供的参数构造的Intent来启动此设备上的活动。

MonkeyImage takeSnapshot()

捕获此设备的整个屏幕缓冲区,产生一个包含当前显示屏幕捕获的MonkeyImage对象。

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

将类型指定的触摸事件发送到由x和y指定的屏幕位置。

void type(string message)

将消息中包含的字符发送到此设备,就像在设备的键盘上键入一样。这相当于使用键事件类型DOWN_AND_UP为消息中的每个键码调用press()。

void wake()

唤醒此设备的屏幕。

MonkeyImage

一个Monkeyrunner类来保存设备或模拟器屏幕的图像。在屏幕截图期间,图像从屏幕缓冲区复制。该对象的方法允许您将图像转换为各种存储格式,将图像写入文件,复制图像部分,并将此对象与其他MonkeyImage对象进行比较。

您不需要创建MonkeyImage的新实例。相反,使用MonkeyDevice.takeSnapshot()从屏幕截图创建一个新的实例。

例如,使用:

newimage=MonkeyDevice.takeSnapshot()

方法

string convertToBytes(string format)

将当前图像转换为特定格式,并将其作为字符串返回,然后您可以作为二进制字节的迭代访问。

tuple getRawPixel(integer x,integer y)

以(a,r,g,b)的形式返回图像位置(x,y)上的单个像素作为整数元组。

integer getRawPixelInt(integer x,integer y)

将图像位置(x,y)上的单个像素作为32位整数返回。

MonkeyImage getSubImage(tuple rect)

从当前图像的矩形选择中创建一个新的MonkeyImage对象。

boolean sameAs(MonkeyImage other,float percent)

将此MonkeyImage对象与另一个对象进行比较,并返回比较结果。百分比参数指定允许两个图像“相等”的百分比差异。

void writeToFile(string path,string format)

将当前图像写入由文件名指定的文件,格式为格式指定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,815评论 25 707
  • 占坑:引用原文 前言:最近开始研究Android自动化测试方法,对其中的一些工具、方法和框架做了一些简单的整理,其...
    小矮人Ethan阅读 539评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 轻抚琴弦 弹奏为你谱写的音符 才发现伤痕累累的臂膀 时间如沙漏 镜中流淌 回忆将如何安放 洁白的婚纱 暗淡的西装 ...
    铜山渔父阅读 276评论 0 2
  • Given an array of strings, group anagrams together. For e...
    Shiyi001阅读 208评论 0 2