MonkeyRunner测试

Monkey 测试 之 monkeyrunner

主要内容摘自: 
https://github.com/yeetrack/monkeyrunner

http://blog.csdn.net/wengqiancun/article/details/7763391

http://blog.csdn.net/vrix/article/details/6893787

MonkeyRunner 介绍

MonkeyRunner是Google Android SDK下的一个工具,用于自动化测试Android程序。

Monkeyrunner工具提供了一套API,使用这些api写出的Python程序可以在黑盒地控制Android设置和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。

Monkeyrunner和Monkey不同,Monkey是直接运行在adb shell中的命令,它随机的生成用户或者系统的各种随机事件,而MonkeyRunner则可以通过api来产生特定命令和事件来控制设备和模拟器。

MonkeyRunner在android测试中有下面特点:

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

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

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

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

您还可以向monkeyrunner API中添加您自己的类。我们将在使用插件扩展monkeyrunner一节中对此进行详细讨论。

monkeyrunner工具使用Jython(使用Java编程语言的一种Python实现)。Jython允许monkeyrunnerAPI与Android框架轻松的进行交互。使用Jython,您可以使用Python语法来获取API中的常量、类以及方法。

MonkeyRunner 使用

在 %ANDROID_SDK_HOME%/tools 下包含 monkeyrunner.bat ,在命令行中运行该.bat,即可启动monkeyrunner。

需要说明,在运行monkeyrunner之前需要启动模拟器,不然monkeyrunner无法链接设备。(用Elipse打开andorid的模拟器或者在CMD中用andorid命令打开。)

下面是个monkeyrunner的代码样例

# python引入monkeyRunner模块
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# 连接设备, 获得一个MonkeyDevice对象
device = MonkeyRunner.waitForConnection()

# 安装apk包. 返回值是boolean,可以判断是否安装成功
device.installPackage('d:/myproject/bin/MyApplication.apk')

# sets a variable with the package's internal name
package = 'com.example.android.myapplication'

# sets a variable with the name of an Activity in the package
activity = 'com.example.android.myapplication.MainActivity'

# sets the name of the component to start
runComponent = package + '/' + activity

# 启动应用程序
device.startActivity(component=runComponent)

# 按下手机的菜单键
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)

# 截图
result = device.takeSnapshot()

# 保存截图
result.writeToFile('d:/shot1.png','png') 

录制脚本

from com.android.monkeyrunner import MonkeyRunner
from com.android.monkeyrunner.recorder import MonkeyRecorder

device = MonkeyRunner.waitForConnection();
MonkeyRecorder.start(device);

想要录制回放,还要借助monkey_playback.py文件,这个文件用来连接手机,初始化一些变量,解析我们的myRecorder.mr。

#!/usr/bin/envmonkeyrunner   
import sys
fromcom.android.monkeyrunner import MonkeyRunner

# Lookup table to mapcommand strings to functions that implement that
# command.
CMD_MAP = {
    'TOUCH': lambda dev, arg: dev.touch(**arg),
    'DRAG': lambda dev, arg: dev.drag(**arg),
    'PRESS': lambda dev, arg: dev.press(**arg),
    'TYPE': lambda dev, arg: dev.type(**arg),
    'WAIT': lambda dev, arg:MonkeyRunner.sleep(**arg)
    }

# Process a singlefile for the specified device.
def process_file(fp,device):
    for line in fp:
        (cmd, rest) = line.split('|')
        try:
            # Parse the pydict
            rest = eval(rest)
        except:
            print 'unable to parse options'
            continue

        if cmd not in CMD_MAP:
            print 'unknown command: ' + cmd
            continue

        CMD_MAP[cmd](device, rest)


def main():
    file = sys.argv[1]
    fp = open(file, 'r')

    device = MonkeyRunner.waitForConnection()

    process_file(fp, device)
    fp.close();


if __name__ =='__main__':
    main()

使用命令monkeyrunner monkey_playback.py myRecorder.mr即可运行回放。

常用API

#需要引入的模块
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner import MonkeyDevice as md
from com.android.monkeyrunner import MonkeyImage as mi

#等待设备连接,30秒超时,后面是设备名称,该名称可以通过执行命令行`adb devices`获得
device = mr.waitForConnection(30,'123123135002735')

#安装apk包
device.installPackage('d:/有道词典V4.0.3.apk'.decode('utf-8'))

#卸载应用程序
device.removePackage('com.youdao.dict')

#启动应用程序
device.startActivity(component='com.youdao.dict/.activity.DictSplashActivity')

#等待程序加载,5秒
mr.sleep(5)

#拖动操作,四个参数,前两个是初始点、结束点坐标,0.5是持续时间,1是步数
device.drag((550,500),(100,500), 0.5, 1)

#触摸操作,三个参数,X坐标、Y坐标,触摸类型
device.touch(80, 1050, "DOWN_AND_UP")

#截图并保存,注意如果名字中有中文,需要进行utf-8编码,否则乱码
now = time.strftime("%Y-%m-%d-%H-%M-%S")
mainPageImage = device.takeSnapshot()
mainPageImage.writeToFile("d:/"+"主页面截图".decode("utf-8")+now+".png", "png")

#点击后退键,键盘码详情可以去查sdk帮助文档,路径:
# android-sdk-windows/docs/reference/android/view/KeyEvent.html
device.press("KEYCODE_BACK", "DOWN_AND_UP")

#将日志输出到外部文件,在python中使用中文,需要在文件开头将编码设置为utf-8,否则乱码
log = open('d:/monkenyLog.txt', 'w')
log.write("等待手机连接...、\n")
log.close()

#截图比较,sameAs()第二个参数表示相似度,0表示完全不相似,1表示完全相同
imageTrue = mr.loadImageFromFile('d:/shot/true.png')
if(imageTrue.sameAs(mainPageImage, 0.75)):
    log.write('截图比较成功\n')
else:
    log.write('截图比较失败\n')

monkeyrunner api

monkeyrunner API 位于 com.android.monkeyrunner包中包含三个模块:

MonkeyRunner    :一个为monkeyrunner程序提供工具方法的类。
                这个类提供了用于连接monkeyrunner至设备或模拟器的方法。
                它还提供了用于创建一个monkeyrunner程序的用户界面以及显示内置帮助的方法。        

MonkeyDevice    :表示一个设备或模拟器。
                  这个类提供了安装和卸载程序包、启动一个活动以及发送键盘或触摸事件到应用程序的方法。
                  您也可以用这个类来运行测试包。        

MonkeyImage    :表示一个截图对象。这个类提供了截图、将位图转换成各种格式、
                 比较两个MonkeyImage对象以及写图像到文件的方法。        

可以直接使用一个代码文件运行monkeyrunner,抑或在交互式对话中输入monkeyrunner语句。不论使用哪种方式,您都需要调用SDK目录的tools子目录下的monkeyrunner命令。如果您提供一个文件名作为运行参数,则monkeyrunner将视文件内容为Python程序,并加以运行;否则,它将提供一个交互对话环境。

monkeyrunner命令的语法为:

monkeyrunner -plugin  <程序文件名> <程序选项>

其中:

-plugin     指定一个内含monkeyrunner插件的.jar文件。   

程序文件名   指定此参数,monkeyrunner将视文件内容为Python程序并予以执行

程序选项     程序文件名 所指定的程序所需的参数

其他详细信息可参加Android sdk文档: 
android-sdk-windows/docs/tools/help/monkeyrunner_concepts.html

你可能感兴趣的:(MonkeyRunner,自动化测试,android应用)