1. 程式人生 > >關於MonkeyRunner的思考(二)

關於MonkeyRunner的思考(二)

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,判斷結果

基於座標點如何處理不同解析度的裝置

如320480的,怎麼移植到480600的上面?

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也可以獲取。