首页
社区
课程
招聘
[原创]Android 自动化测试Monkey、Monkeyrunner
发表于: 2014-6-30 09:36 34527

[原创]Android 自动化测试Monkey、Monkeyrunner

2014-6-30 09:36
34527
软件测试是软件产品开发过程中的重要环节,对于保重软件质量具有重要的意思。手动测试和自动化测试是软件测试的两个基本手段。本文主要介Android – 自动化测试
Android平台上提供了一些自动化测试工具:Monkey、Monkeyrunner。

Monkey、Monkeyrunner 概述

一、Monkey 概述
monkey可以直接在XP/WIN7上运行,只要XP/WIN7上能用adb,即可使用。

Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常,Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。

Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar。
Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;这样就可以通过在shell窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试了。

二、Monkeyrunner 概述

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

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

Monkeyrunner文件在SDK目录的tools子目录下,运行时,如果没有指定环境变量,需到tools目录下方可执行

Monkeyrunner支持自己编写插件,控制事件,随时截图,简而言之,任何你在模拟器/设备中能干的事情,MonkeyRunner都能干,而且还可以记录和回放!!! 

2、monkeyrunner工具为Android测试提供了以下特性:
多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。您可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。您也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。
 
功能测试: monkeyrunner可以为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。
 
 回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。
 
 可扩展的自动化:由于monkeyrunner是一个API工具包,您可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunner API之外,您还可以使用标准的Python os和subpress模块来调用如adb这样的Android工具。

三、Monkey和Monkeyrunner工具区别

Monkey:Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。

monkeyrunner:monkeyrunner工具则是在工作站上通过API定义的特定命令和事件控制设备或模拟器。

Monkey 的基本使用方法

1、可以通过开发机器上的命令行或脚本来启动Monkey。
由于Monkey运行在模拟器/设备环境中,所以必须用其环境中的shell来进行启动。可以通过在每条命令前加上adb shell来达到目的,也可以进入Shell后直接输入Monkey命令。基本语法如下:

> adb shell monkey [options] 

>adb shell
#monkey

如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,把调试等级加了1,并向其发送500个伪随机事件:

> adb shell monkey -p your.package.name –v 500

2、Monkey 命令可简单分为如下四类:
 
基本配置选项:  如设置尝试的事件数量,反馈信息的级别。
 
运行约束选项: 如设置只对单独的一个包进行测试。
 
事件类型和频率: 如设置触摸屏事件的发生频率。
 
调试选项,如设置忽略应用程序异常,继续向系统发送事件,直到计数完成

3、Monkey 命令解析:



Monkey runner 的基本使用方法:

1、Monkeyrunner 环境搭建



2、下载安装Python
下载网址:https://www.python.org/

3、环境变量配置   ;C:\Python27(安装目录复制到Path的后面,注前面的“;”不要忘记哦)环境变量路径以Win7为例:计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> 找到Path

4、monkeyrunnerAPI于com.android.monkeyrunner包中包含三个模块:

MonkeyRunner    :一个为monkeyrunner程序提供工具方法的类。这个类提供了用于连接monkeyrunner至设备或模拟器的方法。它还提供了用于创建一个monkeyrunner程序的用户界面以及显示内置帮助的方法。   
waitForConnection (float timeout, string deviceId) 
sleep (float seconds) 
help (string format) 
 
MonkeyImage    :表示一个截图对象。这个类提供了截图、将位图转换成各种格式、比较两个MonkeyImage对象以及写图像到文件的方法。     
MonkeyImage创建对象的方法如下:
newimage =MonkeyDevice.takeSnapshot()
writeToFile (string path, string format)

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

MonkeyDevice的常用方法:
a.Touch (x坐标, y坐标,动作)
可以通过开启Pointer location在手机上直接查看坐标点.

b.Press(‘按键值’, 动作)
动作包括:DOWN, UP, DOWN_AND_UP。大部分时间用DOWN_AND_UP来模拟按键、松手的过程。比如要进行一个返回键操作:
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)

c.Drag((x, y),(x, y),持续时间,轨迹点)
按键值为Andriod键值表中有的值drag((x, y),(x, y),持续时间,轨迹点)
第一组是起始坐标,第二组终点坐标。这里的坐标值要通过hierarchyviewer工具来获取,轨迹点类似采样

d.启动Activity:startActivity(‘string’)
在python程序中,您将以Python模块的形式使用这些类。monkeyrunner工具不会自动导入这些模块。您必须使用类似如下的from语句:
 
from  com.android.monkeyrunner  import  Monkey Runner,     
Monkey Device, Monkey Image

您可以在一个from语句中导入超过一个模块,其间以逗号分隔。

5、运行monkeyrunner
 
 monkeyrunner命令的语法为:
 
monkeyrunner -plugin  <程序文件名> <程序选项>

1、启动一个Android系统的模拟器,即为命令中device

2、 将cmd命令定位到android SDK的路径下的tools目录
3、输入命令"monkeyrunner",回车,进入Shell命令交互方式
    导入monkeyrunner所要使用的模块:        A.直接在shell命令中输入(然后回车):
    from com.android.monkeyrunner import MonkeyRunner, 
    MonkeyDevice,MonkeyImage
    B.输入device = MonkeyRunner.waitForConnection(),然后回车

6、一个简单的monkeyrunner程序实例
以下为一个简单的monkeyrunner程序,它将会连接到一个设备,创建一个MonkeyDevice对象。使用MonkeyDevice对象,程序将安装一个Android应用包,运行其中一个活动,并向其发送按键事件。程序接下来会将结果截图,创建一个MonkeyImage对象,并使用这个对象截图将保存至.png文件。
  
# 导入此程序所需的monkeyrunner模块 
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice MonkeyImage
# 连接当前设备,返回一个MonkeyDevice对象 
device = MonkeyRunner.waitForConnection() 
# 安装Android包,注意,此方法返回的返回值为boolean,由此您可以判断安装过程是否正常 
device.installPackage('myproject/bin/MyApplication.apk') 
# 运行此应用中的一个活动device.startActivity(component='com.example.android.myapplication.MainActivity') 
# 按下菜单按键 
device.press('KEYCODE_MENU','DOWN_AND_UP') 
# 截取屏幕截图 
result = device.takeSnapshot()
# 将截图保存至文件 
result.writeToFile('myproject/shot1.png','png')
#时延(秒):
MonkeyRunner.sleep(3) 
#滑动屏幕(Python脚本):
for i in range(1,70):device.drag(start,end,0.1,10)  
#触击屏幕: 
device.touch(94,34,'DOWN_AND_UP')  
# 运行此应用中的一个活动device.startActivity(component='com.example.android.myapplication.MainActivity') 
# 按下菜单按键 
device.press('KEYCODE_MENU','DOWN_AND_UP') 
# 截取屏幕截图 
result = device.takeSnapshot()
# 将截图保存至文件 
result.writeToFile('myproject/shot1.png','png')

7、Monkeyrunner自动化测试的记录和回放
MonkeyRunner工具中提供了记录与回放的功能,可以通过monkey_recorder.py和monkey_playback.py两个python文件来实现。此两个文件存放在:android源代码 ->  monkeyrunner源代码 -> scripts文件夹。

1)记录
 a、启动模拟器或通过USB连接手机
 b、打开命令行提示符,并且定位到Tools文件下输入:
        monkeyrunner monkey_recorder.py 按下回车键
如下图:


录制界面菜单介绍:



注意:导出的脚本要与monkey_recorder.py和monkey_playback.py 在同一目录下,即Tools文件夹下。



2)回放
 
脚本回放需要使用另外一个脚本 monkeyplayback.py

执行步骤:
 a、启动模拟器或通过USB连接手机
 b、打开命令行提示符,并且定位到Tools文件下输入:
        monkeyrunner monkeyplayback.py  “sound”
        按下回车键

附录:脚本

1、monkeyrecoder.py

#Usage: monkeyrunner monkeyrecorder.py  
#monkeyrecorder.py 
from com.android.monkeyrunner import MonkeyRunner
from com.android.monkeyrunner.recorder import MonkeyRecorder
device = MonkeyRunner.waitForConnection()
MonkeyRecorder.start(device)

2、monkeyplayback.py

import sys
from com.android.monkeyrunner import MonkeyRunner
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 single file for the specified device.
def process_file(fp,device):
    for line in fp:
        (cmd,rest) = line.split("|")
        try:
            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()

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 10
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
GOOD JOB
2014-6-30 09:46
0
雪    币: 2664
活跃值: (3400)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
3
好东西,支持一下
2014-6-30 10:11
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好东西,最近用uiaotumator的比较多了吧
2014-8-14 22:48
0
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark
2014-12-9 11:41
0
雪    币: 2323
活跃值: (4118)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
6
支持,支持:-D
2014-12-9 12:17
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
++++++++1
2014-12-9 14:06
0
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好帖子,赞一个。
2014-12-17 10:27
0
雪    币: 156
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
try:
rest = eval(rest)
这一句将字符串rest转换为字典,但是字典是无序的,将其恢复为命令执行时,会导致参数错误。
2015-3-13 16:21
0
游客
登录 | 注册 方可回帖
返回
//