Monkey、Monkeyrunner 概述

轉載:http://bbs.pediy.com/showthread.php?t=189584


軟件測試是軟件產品開發過程中的重要環節,對於保重軟件質量具有重要的意思。手動測試和自動化測試是軟件測試的兩個基本手段。本文主要介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 命令解析:

名稱:  Monkeycmd.jpg查看次數: 0文件大小:  34.4 KB

Monkey runner 的基本使用方法:

1、Monkeyrunner 環境搭建

名稱:  Snap8.jpg查看次數: 0文件大小:  18.5 KB

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 按下回車鍵
如下圖:
名稱:  1.jpg查看次數: 0文件大小:  26.0 KB

錄製界面菜單介紹:

名稱:  2.jpg查看次數: 1文件大小:  29.1 KB

注意:導出的腳本要與monkey_recorder.py和monkey_playback.py 在同一目錄下,即Tools文件夾下。

名稱:  3.jpg查看次數: 1文件大小:  13.8 KB


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() 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章