軟件測試是軟件產(chǎn)品開發(fā)過程中的重要環(huán)節(jié),對于保重軟件質(zhì)量具有重要的意思。手動測試和自動化測試是軟件測試的兩個基本手段。本文主要介Android – 自動化測試 Android平臺上提供了一些自動化測試工具:Monkey、Monkeyrunner。 Monkey、Monkeyrunner 概述 一、Monkey 概述 monkey可以直接在XP/WIN7上運行,只要XP/WIN7上能用adb,即可使用。 Monkey測試是Android平臺自動化測試的一種手段,通過Monkey程序模擬用戶觸摸屏幕、滑動Trackball、按鍵等操作來對設(shè)備上的程序進行壓力測試,檢測程序多久的時間會發(fā)生異常,Monkey測試是一種為了測試軟件的穩(wěn)定性、健壯性的快速有效的方法。 Monkey程序由Android系統(tǒng)自帶,使用Java語言寫成,在Android文件系統(tǒng)中的存放路徑是:/system/framework/monkey.jar。 Monkey.jar程序是由一個名為“monkey”的Shell腳本來啟動執(zhí)行,shell腳本在Android文件系統(tǒng)中的存放路徑是:/system/bin/monkey;這樣就可以通過在shell窗口中執(zhí)行: adb shell monkey {+命令參數(shù)}來進行Monkey測試了。 二、Monkeyrunner 概述 1、monkeyrunner工具提供了一個API,使用此API寫出的程序可以在Android代碼之外控制Android設(shè)備和模擬器。通過monkeyrunner,您可以寫出一個Python程序去安裝一個Android應(yīng)用程序或測試包,運行它,向它發(fā)送模擬擊鍵,截取它的用戶界面圖片,并將截圖存儲于工作站上。 monkeyrunner工具的主要設(shè)計目的是用于測試功能/框架水平上的應(yīng)用程序和設(shè)備,或用于運行單元測試套件,但您當然也可以將其用于其它目的 Monkeyrunner文件在SDK目錄的tools子目錄下,運行時,如果沒有指定環(huán)境變量,需到tools目錄下方可執(zhí)行 Monkeyrunner支持自己編寫插件,控制事件,隨時截圖,簡而言之,任何你在模擬器/設(shè)備中能干的事情,MonkeyRunner都能干,而且還可以記錄和回放!!! 2、monkeyrunner工具為Android測試提供了以下特性: 多設(shè)備控制:monkeyrunner API可以跨多個設(shè)備或模擬器實施測試套件。您可以在同一時間接上所有的設(shè)備或一次啟動全部模擬器(或統(tǒng)統(tǒng)一起),依據(jù)程序依次連接到每一個,然后運行一個或多個測試。您也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關(guān)閉模擬器。 功能測試: monkeyrunner可以為一個應(yīng)用自動貫徹一次功能測試。您提供按鍵或觸摸事件的輸入數(shù)值,然后觀察輸出結(jié)果的截屏。 回歸測試:monkeyrunner可以運行某個應(yīng)用,并將其結(jié)果截屏與既定已知正確的結(jié)果截屏相比較,以此測試應(yīng)用的穩(wěn)定性。 可擴展的自動化:由于monkeyrunner是一個API工具包,您可以基于Python模塊和程序開發(fā)一整套系統(tǒng),以此來控制Android設(shè)備。除了使用monkeyrunner API之外,您還可以使用標準的Python os和subpress模塊來調(diào)用如adb這樣的Android工具。 三、Monkey和Monkeyrunner工具區(qū)別 Monkey:Monkey工具直接運行在設(shè)備或模擬器的adb shell中,生成用戶或系統(tǒng)的偽隨機事件流。 monkeyrunner:monkeyrunner工具則是在工作站上通過API定義的特定命令和事件控制設(shè)備或模擬器。 Monkey 的基本使用方法 1、可以通過開發(fā)機器上的命令行或腳本來啟動Monkey。 由于Monkey運行在模擬器/設(shè)備環(huán)境中,所以必須用其環(huán)境中的shell來進行啟動??梢酝ㄟ^在每條命令前加上adb shell來達到目的,也可以進入Shell后直接輸入Monkey命令?;菊Z法如下: > adb shell monkey [options] 或 >adb shell #monkey 如果不指定options,Monkey將以無反饋模式啟動,并把事件任意發(fā)送到安裝在目標環(huán)境中的全部包。下面是一個更為典型的命令行示例,它啟動指定的應(yīng)用程序,把調(diào)試等級加了1,并向其發(fā)送500個偽隨機事件: > adb shell monkey -p your.package.name –v 500 2、Monkey 命令可簡單分為如下四類: 基本配置選項: 如設(shè)置嘗試的事件數(shù)量,反饋信息的級別。 運行約束選項: 如設(shè)置只對單獨的一個包進行測試。 事件類型和頻率: 如設(shè)置觸摸屏事件的發(fā)生頻率。 調(diào)試選項,如設(shè)置忽略應(yīng)用程序異常,繼續(xù)向系統(tǒng)發(fā)送事件,直到計數(shù)完成 3、Monkey 命令解析: Monkey runner 的基本使用方法: 1、Monkeyrunner 環(huán)境搭建 2、下載安裝Python 下載網(wǎng)址:https://www./ 3、環(huán)境變量配置 ;C:\Python27(安裝目錄復(fù)制到Path的后面,注前面的“;”不要忘記哦)環(huán)境變量路徑以Win7為例:計算機 -> 屬性 -> 高級系統(tǒng)設(shè)置 -> 環(huán)境變量 -> 系統(tǒng)變量 -> 找到Path 4、monkeyrunnerAPI于com.android.monkeyrunner包中包含三個模塊: MonkeyRunner :一個為monkeyrunner程序提供工具方法的類。這個類提供了用于連接monkeyrunner至設(shè)備或模擬器的方法。它還提供了用于創(chuàng)建一個monkeyrunner程序的用戶界面以及顯示內(nèi)置幫助的方法。 waitForConnection (float timeout, string deviceId) sleep (float seconds) help (string format) MonkeyImage :表示一個截圖對象。這個類提供了截圖、將位圖轉(zhuǎn)換成各種格式、比較兩個MonkeyImage對象以及寫圖像到文件的方法。 MonkeyImage創(chuàng)建對象的方法如下: newimage =MonkeyDevice.takeSnapshot() writeToFile (string path, string format) MonkeyDevice :表示一個設(shè)備或模擬器。這個類提供了安裝和卸載程序包、啟動一個活動以及發(fā)送鍵盤或觸摸事件到應(yīng)用程序的方法。您也可以用這個類來運行測試包。 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),持續(xù)時間,軌跡點) 按鍵值為Andriod鍵值表中有的值drag((x, y),(x, y),持續(xù)時間,軌跡點) 第一組是起始坐標,第二組終點坐標。這里的坐標值要通過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系統(tǒng)的模擬器,即為命令中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程序?qū)嵗?br> 以下為一個簡單的monkeyrunner程序,它將會連接到一個設(shè)備,創(chuàng)建一個MonkeyDevice對象。使用MonkeyDevice對象,程序?qū)惭b一個Android應(yīng)用包,運行其中一個活動,并向其發(fā)送按鍵事件。程序接下來會將結(jié)果截圖,創(chuàng)建一個MonkeyImage對象,并使用這個對象截圖將保存至.png文件。 # 導入此程序所需的monkeyrunner模塊 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice MonkeyImage # 連接當前設(shè)備,返回一個MonkeyDevice對象 device = MonkeyRunner.waitForConnection() # 安裝Android包,注意,此方法返回的返回值為boolean,由此您可以判斷安裝過程是否正常 device.installPackage('myproject/bin/MyApplication.apk') # 運行此應(yīng)用中的一個活動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') # 運行此應(yīng)用中的一個活動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文件來實現(xiàn)。此兩個文件存放在:android源代碼 -> monkeyrunner源代碼 -> scripts文件夾。 1)記錄 a、啟動模擬器或通過USB連接手機 b、打開命令行提示符,并且定位到Tools文件下輸入: monkeyrunner monkey_recorder.py 按下回車鍵 如下圖: 錄制界面菜單介紹: 注意:導出的腳本要與monkey_recorder.py和monkey_playback.py 在同一目錄下,即Tools文件夾下。 2)回放 腳本回放需要使用另外一個腳本 monkeyplayback.py 執(zhí)行步驟: 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() |
|