1. 程式人生 > >Monkeyrunner學習之五

Monkeyrunner學習之五

MonkeyRunner是Google Android SDK下的一個工具,用於自動化測試Android程式。
Monkeyrunner工具提供了一套API,使用這些api寫出的Python程式可以在黑盒地控制Android設定和模擬器。有了Monkeyrunner,我們可以通過python語句控制apk包的安裝和解除安裝、啟動app、向app傳送各種動作指令、擷取圖片並儲存。

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的例子

下面是個monkeyrunner的程式碼樣例,下面程式碼包含了,連線裝置、安裝apk包、啟動程式、傳送鍵盤指令、截圖、儲存截圖。

# python引入monkeyRunner模組
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# 連線裝置, 獲得一個MonkeyDevice物件
device = MonkeyRunner.waitForConnection()

# 安裝apk包. 返回值是boolean,可以判斷是否安裝成功
device.installPackage('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('myproject/shot1.png','png')  

常用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')

其他詳細資訊可參加Android sdk文件,路徑android-sdk-windows/docs/tools/help/monkeyrunner_concepts.html

轉載連結:http://blog.csdn.net/u014555248/article/details/24005943