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

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