Android自動化測試之Monkeyrunner學習筆記(一)
因項目需要,開始研究Android自動化測試方法,對其中的一些工具、方法和框架做了一些簡單的整理,其中包括Monkey、Monkeyrunner、Athrun、appium,目前仍在了解學習android測試框架、CTS等。本文主要為前段時間學習總結,由於剛接觸不久,故本文難免會有些膚淺,大神請繞走~
[目錄]
1、Monkeyrunner簡介
monkeyrunner即android SDK中自帶的工具之一,此工具提供API可按制android設備或模擬器。
monkeyrunner提供了一個API,使用此API寫出的程序可以在Android代碼之外控制Android設備和模擬器。通過monkeyrunner,您可以寫出一個Python程序去安裝一個Android應用程序或測試包,運行它,向它發送模擬擊鍵,截取它的用戶界面圖片,並將截圖存儲於工作站上。
monkeyrunner工具的主要目的是用於測試功能/框架水平上的應用程序和設備,或用於運行單元測試套件,但您當然也可以將其用於其它目的。
2、Monkeyrunner工具特性
多設備控制:monkeyrunner API可以跨多個設備或模擬器實施測試套件。您可以在同一時間接上所有的設備或一次啟動全部模擬器(或統統一起),依據程序依次連接到每一個,然后運行一個或多個測試。您也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關閉模擬器。
功能測試:monkeyrunner可以為一個應用自動化功能測試。為您提供按鍵或觸摸事件的輸入數值,然后觀察輸出結果的截屏。
回歸測試:monkeyrunner可以運行某個應用,並將其結果截屏與既定已知正確的結果截屏相比較,以此測試應用的穩定性。
可擴展的自動化:由於monkeyrunner是一個API工具包,您可以基於Python模塊和程序開發一整套系統,以此來控制Android設備。除了使用monkeyrunner API之外,您還可以使用標准的Python os和subprocess模塊來調用如adb這樣的Android工具。
官方原文描述請見:http://developer.android.com/tools/help/monkeyrunner_concepts.html
3、Monkeyrunner工具同Monkey工具的差別
Monkey:
Monkey工具直接運行在設備或模擬器的adb shell中,生成用戶或系統的偽隨機事件流。
Monkeyrunner:
Monkeyrunner工具是在工作站上通過API定義的特定命令和事件控制設備或模擬器。
4、運行Monkeyrunner
from com.android.monkeyrunner import <module>
運行monkeyrunner
命令語法為:
方式一:在CMD命令窗口直接運行monkeyrunner
方式二:使用Python編寫測試代碼文件,在CMD中執行monkeyrunner Findyou.py運行
不論使用哪種方式,您都需要調用SDK目錄的tools子目錄下的monkeyrunner命令。
附:
問題:CMD運行提示monkeyrunner不是內部或外部命令,也不是可運行的程序或批處理文件。
解決:電腦環境變量未配置,將monkeyrunner所在目錄配在環境變量里。
變量名:Path
變量值:D:\android\android-sdk-windows\tools;D:\android\android-sdk-windows\platform-tools
5、實例
實例一:卸載舊的APP,安裝新的APP
*准備
a. 連接安卓真機設備
b. 運行CMD,檢測是否連接成功
CMD>adb devices

附:
問題:CMD運行提示adb不是內部或外部命令,也不是可運行的程序或批處理文件。
解決:電腦環境變量未配置,將adb所在目錄配在環境變量里。
*方式一:
1.打開CMD,運行monkeyrunner
2.進入monkeyrunner的shell命令交互模式后,逐條輸入以下命令
2 device = MonkeyRunner.waitForConnection()
3 device.removePackage( ' cn.richinfo.thinkdrive ')
4 device.installPackage( ' E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk ')
注:每條命令的作用,請見方法二中的注解
實操如圖:
c.檢查手機app是否已更新
*方式二:
a. 編寫Python測試代碼
# Vision: V1.0
# Author: Findyou
# 引入本程序所用到的模塊
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
# 連接手機設備
device = MonkeyRunner.waitForConnection()
# 截圖
result = device.takeSnapshot()
# 將截圖保存到文件
result.writeToFile( ' E:\\JAVA\\monkeyrunner\\Test1\\Test1_001.png ' , ' png ' )
# 卸載APP
device.removePackage( ' cn.richinfo.thinkdrive ' )
print ( ' Uninstall Success! ' )
# 暫停5秒
MonkeyRunner.sleep(5)
# 截圖
result = device.takeSnapshot()
result.writeToFile( ' E:\\JAVA\\monkeyrunner\\Test1\\Test1_002.png ' , ' png ' )
# 安裝新的APP
device.installPackage( ' E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk ' )
print ( ' Install Success! ' )
# 截圖
result = device.takeSnapshot()
result.writeToFile( ' E:\\JAVA\\monkeyrunner\\Test1\\Test1_003.png ' , ' png ' )
注:拷貝運行時請去掉中文注釋;或者在開頭加入 #coding=utf-8
b.執行Test1.py腳本
實操如圖:
c.檢查手機app是否已更新
6、學習筆記
from com.android.monkeyrunner import MonkeyDevice as md
from com.android.monkeyrunner import MonkeyImage as mi
# 如果給導入的模塊起了別名,就必須使用別名,否則會出現錯誤。
# 比如連接設備或模擬器,起了以上別名后,命令應該如下:
device=mr.waitForConnection()
#連接到設備或模擬器
# 參數2:串deviceid,指定的設備名稱。默認為當前設備(手機優先,比如手機通過USB線連接到PC、其次為模擬器)。
# 默認連接:
device = MonkeyRunner.waitForConnection()
# 參數連接:
device = MonkeyRunner.waitForConnection(1.0, ' 4df74b8XXXXXXX ')
#向設備或模擬器安裝APK
device.installPackage( ' E:/JAVA/monkeyrunner/Test1/ThinkDrive_new.apk ')
device.installPackage( ' E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk ')
# 參數可以為絕對路徑,也可為相對路徑
#卸載設備或模擬器中的APK
device.removePackage( ' cn.richinfo.thinkdrive ')
# 以下兩種都OK
device.startActivity(component= " cn.richinfo.thinkdrive/cn.richinfo.thinkdrive.ui.activities.NavigateActivity ")
device.startActivity(component= " cn.richinfo.thinkdrive/.ui.activities.NavigateActivity ")
#手機截圖
result=device.takeSnapshot()
# 返回一個MonkeyImage對象(點陣圖包裝),我們可以用以下命令將圖保存到文件
result.writeToFile( ' E:\\JAVA\\monkeyrunner\\Test1\\Test1_001.png ', ' png ')
#暫停
# MonkeyRunner.sleep(秒數,浮點數)
MonkeyRunner.sleep(5)
device.type( ' Findyou ')
device.wake()
#重起手機
#模擬滑動
# X 開始坐標
# Y 結束坐標
# D 拖動持續時間(以秒為單位),默認1.0秒
# S 插值點時要采取的步驟。默認值是10
device.drag((100,1053),(520,1053),0.1,10)
#在指定位置發送觸摸事件
# x,y的單位為像素
# 觸摸事件類型,請見下文中Findyou對device.press描述
device.touch(520,520, ' DOWN_AND_UP ')
#發送指定類型指定鍵碼的事件
# 參數1:見android.view.KeyEvent
# 參數2,如有TouchPressType()返回的類型-觸摸事件類型,有三種。
# 1、DOWN 發送一個DOWN事件。指定DOWN事件類型發送到設備,對應的按一個鍵或觸摸屏幕上。
# 2、UP 發送一個UP事件。指定UP事件類型發送到設備,對應釋放一個鍵或從屏幕上抬起。
# 3、DOWN_AND_UP 發送一個DOWN事件,然后一個UP事件。對應於輸入鍵或點擊屏幕。
以上三種事件做為press()參數或touch()參數
#按下HOME鍵
device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)
#按下BACK鍵
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)
#按下下導航鍵
device.press('KEYCODE_DPAD_DOWN',MonkeyDevice.DOWN_AND_UP)
#按下上導航鍵
device.press('KEYCODE_DPAD_UP',MonkeyDevice.DOWN_AND_UP)
#按下OK鍵
device.press('KEYCODE_DPAD_CENTER',MonkeyDevice.DOWN_AND_UP)
KeyCode:
更多KeyCode http://developer.android.com/reference/android/view/KeyEvent.html
更多Monkeyrunner學習:http://developer.android.com/tools/help/monkeyrunner_concepts.html
