MonkeyRunner介紹:
MonkeyRunner是Google提供的一個基於坐標點的Android黑盒自動化測試工具。
Monkeyrunner工具提供了一套API讓用戶/測試人員來調用,調用這些api可以控制一個Android設備或模擬器,而不需要了解對應的源碼。
有了Monkeyrunner,我們可以編寫python腳本來控制apk包的安裝和卸載、啟動app、向app發送各種動作事件、截取圖片並保存。
Monkeyrunner與Monkey的區別:
Monkey是通過adb shell命令,發送一系列隨機的模擬事件,主要用來做壓力測試;
MonkeyRunner則可以通過api來產生特定命令和事件來控制設備和模擬器。
MonkeyRunner所具有的特點:
支持多設備: API可以跨多個設備或模擬器實施測試套件。您可以在同一時間接上所有的設備或一次啟動全部模擬器(或統統一起),依據程序依次連接到每一個,然后運行一個或多個測試。也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關閉模擬器。
功能測試: monkeyrunner可以為一個應用自動跑一次功能測試(自頂向下)。您提供按鍵或觸摸事件的輸入數值,然后通過截屏查看結果。
回歸測試:monkeyrunner可以運行某個應用,並將其結果截屏與既定已知正確的結果截屏相比較,以此測試應用的穩定性。
可擴展的自動化:由於monkeyrunner是一個API工具包,您可以基於Python模塊和程序開發一整套系統,以此來控制Android設備。除了使用monkeyrunner API之外,您還可以使用標准的Python os和subprocess模塊來調用如adb這樣的Android工具。 您還可以向monkeyrunner API中添加您自己的類。
注意點:
monkeyrunner工具使用Jython(使用Java編程語言的一種Python實現,並不是Python),雖然腳本需保存為.py文件,但卻不能使用python **.py來執行(會報找不到MonkeyRunner模塊),必須使用monkeyrunner **.py命令來執行
官方一個簡單的MonkeyRunner的例子
1 # python引入monkeyRunner模塊 2 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice 3 # 連接設備, 獲得一個MonkeyDevice對象 4 device = MonkeyRunner.waitForConnection() 5 # 安裝apk包. 返回值是boolean,可以判斷是否安裝成功 6 device.installPackage('myproject/bin/MyApplication.apk') 7 # 設定一個有效的測試程序包名 8 package = 'com.example.android.myapplication' 9 # 設定測試程序包名下的一個Activity名 10 activity = 'com.example.android.myapplication.MainActivity' 11 # 設定程序入口 12 runComponent = package + '/' + activity 13 # 啟動應用程序 14 device.startActivity(component=runComponent) 15 # 按下手機的菜單鍵 16 device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP) 17 # 截圖 18 result = device.takeSnapshot() 19 # 保存截圖 20 result.writeToFile('myproject/shot1.png','png')
從上面的實例中我們可以看出使用monkeyrunner測試應用程序的具體步驟為:
1、先從from.android.monkeyrunner中導入三個api
2、連接設備,等待設備連接並返回連接的設備
3、安裝測試程序包(可寫絕對路徑),安裝完畢后會返回布爾型變量,可通過此變量,寫一個if語句,判斷是否安裝成功
4、設置安裝程序包名和Activity名
5、通過包名/Activity來啟動應用程序
6、執行一系列的touch、drag等事件
7、截圖保存
8、截圖對比samas,判斷結果
基於坐標點如何處理不同分辨率的設備
如320*480的,怎么移植到480*600的上面?
device.touch(340,580,'DOWN_AND_UP')
320/x = 480/newx, x = 340
480/y = 600/newy, y = 580
這樣就能求得一個比例關系了,用這個比例關系做一個類似宏替換就行,代碼基本不用動;甚至可以寫一個方法,獲取到像素后,與基礎的計算后,直接替換即可。
除以上方式,還可以運用hierarchyviewer獲取控件,通過控件找到坐標。缺點:要開root,4.1.2以下要開root。注意4.1以上版本用uiautomatorviewer不需要root也可以獲取。