Android自動化測試之MonkeyRunner

jopen 10年前發布 | 38K 次閱讀 測試工具 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') </code></pre>

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

其他詳細信息可參加Android sdk文檔,路徑android-sdk-windows/docs/tools/help/monkeyrunner_concepts.html

錄制腳本

MonkeyRunner自身提供腳本錄制功能,即MonkeyRecorder。

將下面代碼保存成recorder.py

from com.android.monkeyrunner import MonkeyRunner as mr 
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder 
device = mr.waitForConnection() 
recorder.start(device)

recorder

錄制產生的結果,myRecorder.mr:

TOUCH|{'x':92,'y':936,'type':'downAndUp',}
TOUCH|{'x':357,'y':688,'type':'downAndUp',}
TOUCH|{'x':285,'y':82,'type':'downAndUp',}
TYPE|{'message':'hello',}
TOUCH|{'x':679,'y':82,'type':'downAndUp',}

想要錄制回放,還要借助monkey_playback.py文件,這個文件用來連接手機,初始化一些變量,解析我們的myRecorder.mr。
使用命令monkeyrunner monkey_playback.py myRecorder.mr即可運行。

總結

MonkeyRunner提供的操作有限,適合重復性、短路徑的測試,不適合連續性的操作,由于type和drag方法的不穩定,很容易偏離我們的預期。MonkeyRunner操作依賴于控件坐標(也可以通過id,比較耗時),一旦UI發生改變,腳本無法使用。

Monkeyrunner的等待機制MonkeyRunner.sleep(5),無法更加友好地等待;MonkeyRunner不提供結果斷言,我們只能通過截圖比較,無法擺脫人工干預。

我在github上傳了一個簡單的例子,地址https://github.com/yeetrack/monkeyrunner

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!