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