◆版權聲明:本文出自胖喵~的博客,轉載必須注明出處。
轉載請注明出處:http://www.cnblogs.com/by-dream/p/4836815.html
不得不說兩句,過了這么久才再次更新博客,主要原因是工作太忙,而且剛好又參與了很多業余活動,因此基本沒時間去寫,不過我還是決定堅持把我要寫的東西全部寫完,希望能夠幫助到剛剛入門的測試者們。
前言
本節講解的內容是monkeyrunner,monkeyrunner和monkey同樣都是谷歌研發的測試工具,相比monkey用來做壓力測試而言,monkeyrunner更偏重於點觸式的UI自動化內容,接下來我們看看詳細的內容。
同樣附上文檔地址,如果實在不願意閱讀,那就先看博客吧。http://www.android-doc.com/tools/help/monkeyrunner_concepts.html
簡介
monkeyrunner工具提供了API,使用這個API你可以通過寫Android代碼之外的程序來操作控制Android設備的。通過monkeyrunner,你可以通過寫一個Python的程序來安裝一個Android應用程序、運行該程序,給該程序發送鍵盤事件,截屏並且將截屏的內容保存在工作站中(workstation)。
monkeyrunner這個工具設計的主要目的是進行功能測試/franmework層的測試,或者用於單元測試套件(unit test suites),當然你也可以自由的使用它的其他用途。
monkeyrunner和money沒有什么直接的關系,monkey是在設備的直接運行adb shell命令來生成隨機了事件來進行測試的。相比較而言,monkeyrunner則是通過API發送特定的命令和事件通過工作站來控制設備。
特性
monkeyrunner為Android測試提供了以下特性:
多設備控制:monkeyrunner的API可以跨多個設備實施測試套件。你可以同時連接所有的設備或一次啟動全部模擬器,依據程序依次連接到每一個,然后運行一個或多個測試。您也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關閉它。
功能測試:monkeyrunner可以自動的啟動Android程序直到完成測試,這期間你可以提供輸入值和鍵盤操作已經觸摸事件,然后通過截圖來查看結果。
回歸測試(Regression testing ):monkeyrunner可以運行一個程序,將輸出的截圖與正確的結果截圖相比較,依次來測試程序的穩定性。
可擴展的自動化(Extensible automation):因為monkeyrunner是一個API工具包,你可以開發基於Python模塊的整個系統來控制Android設備。除了使用monkeyrunner API本身,你還可以使用標准的Python OS和子模塊的調用Android的工具,例如ADB。
monkeyrunner工具用的語言是Jython,使用Java編程語言實現的Python。Jython 運行monkeyrunner的API和Android的框架可以非常便捷的進行交互,使用Jython,你可以使用Python語法來訪問常量,類和API的方法。
實例
這里我重新給個例子吧 谷歌給的有點不太直觀 。 我們以QQ為例。
1、進入到 ..\sdk\tools 的目錄下,運行monkeyrunner
2、引入monkeyrunner的包,輸入 "from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice" 敲回車
3、確保qq是關閉的,先運行“device = MonkeyRunner.waitForConnection()”,
再運行 “device.startActivity(component="com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity") ”,此時可以看到qq被喚起了
p.s. 如果知道一個任意App的啟動頁的Activity,請點這里。
4、模擬按下“菜單鍵” ,運行“device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)”
5、截圖,然后再把它保存到起來。
6、去C盤下去看截圖內容:
這就是monkeyrunner最簡單的命令行的方式來實現啟動App,點擊事件和截屏操作。
腳本
當然上面的步驟我們可以將它寫到腳本里,然后去運行這個腳本,前面提到腳本的語言是Python,所以我們就將以下代碼寫到一個Python腳本中。
# Imports the monkeyrunner modules used by this program from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice # Connects to the current device, returning a MonkeyDevice object device = MonkeyRunner.waitForConnection() # Installs the Android package. Notice that this method returns a boolean, so you can test # to see if the installation worked. device.installPackage('/sdcard/qq.apk') # sets a variable with the package's internal name package = 'com.tencent.mobileqq' # sets a variable with the name of an Activity in the package activity = 'com.tencent.mobileqq.activity.SplashActivity' # sets the name of the component to start runComponent = package + '/' + activity # Runs the component device.startActivity(component=runComponent) # Presses the Menu button MonkeyRunner.sleep(2)
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP) # Takes a screenshot MonkeyRunner.sleep(2)
result = device.takeSnapshot() # Writes the screenshot to a file MonkeyRunner.sleep(2)
result.writeToFile('c:\shot1.png','png')
將腳本內容保存到Python文件qq.py當中。
將腳本放到monkeyrunner的同級目錄下,直接運行“monkeyrunner qq.py”,就可以完成整個過程。
學會了基本用法之后,你就可以根據你們自己的業務,結合monkeyrunner更加豐富的API寫出更加復雜的腳本,通過這種方法來進行運行。
API
提供一些常用的API(上面例子中不再贅述了)
1、指定設備連接:
等待連接到設備,與模擬器連接,返回monkeydevice對象,代表連接的設備。沒有報錯的話說明連接成功。
參數1:超時時間,單位秒,浮點數。默認是無限期地等待。
參數2:串deviceid,指定的設備名稱。
例子:device = mr.waitForConnection(1.0,'emulator-5554')
2、運行shell命令:
執行一個adb shell命令,如果有結果的話,返回結果
例子:device.shell("...")
3、喚醒設備:
例子:device.wake()
4、給指定位置發送觸摸事件:
參數1、2:屏幕的橫縱坐標
參數3:觸摸事件(共三種):DOWN、UP、DOWN_AND_UP
device.touch(x,y,TouchPressType)
例子:device.touch(300,200,MonkeyDevice.DOWN_AND_UP) 在屏幕坐標300,200的地方按下並且抬起
5、發送指定鍵的事件:
參數1:http://developer.android.com/reference/android/view/KeyEvent.html 例如 KEYCODE_HOME(home鍵),KEYCODE_BACK (back鍵)
參數2:觸摸事件
例子:device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP) 按下並抬起home鍵
好!monkeyrunner的暫且到此為止,如有疑問,給我留言即可....