能夠寫一個pyhon工程,安裝在android進行測試,還能夠截屏操做。Monkeyrunner爲framework層開發。MonkeyRunner自己是Java作的,爲了和Python鏈接,作了一個叫Jython的東東,html
1. 多種多設備控制java
2. 功能測試python
3. 迴歸測試mysql
4. 可擴展功能測試linux
官網提供的最簡單的例子:android
# Imports the monkeyrunner modules used by this program sql
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice shell
# 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. 此處取apk的絕對路徑
device.installPackage('myproject/bin/MyApplication.apk')
# sets a variable with the package's internal name,給apk所在的包取出來,賦給變量package
package = 'com.example.android.myapplication'
# sets a variable with the name of an Activity in the package ,獲得Activity並存在變量中
activity = 'com.example.android.myapplication.MainActivity'
# sets the name of the component to start,這個和Instrumentation很相似啊,包名/Activity名
runComponent = package + '/' + activity
# Runs the component ,沒有使用device.touch
device.startActivity(component=runComponent)
# Presses the Menu button,這種press是按下、起來
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)
# Takes a screenshot
result = device.takeSnapshot()
# Writes the screenshot to a file
result.writeToFile('myproject/shot1.png','png')
主要API
com.android.monkeyrunner.MonkeyDevice.drag
com.android.monkeyrunner.MonkeyDevice.touch 傳touch的點的(x,y)座標
實踐一個調用calculator100次的script,能夠work。calculator的包名能夠用ddms監控獲得(eclipse - window - open perspective -ddms )。使用PowerShell操做命令行感受真好啊~
#coding=utf-8 from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice device = MonkeyRunner.waitForConnection() device.shell("monkey -p com.android.calculator2 -v 1") def tapButton(Number): import random for i in range(0,Number): keyValue = random.randint(1,20) if keyValue == 1: device.touch(200,265,'DOWN_AND_UP') #Tap 'Clear' Button elif keyValue == 2: device.drag((200,265),(200,265),1.5,10) #Long touch "Clear" button; elif keyValue == 3: device.touch(465,275,'DOWN_AND_UP') # Tap "Delete" button; elif keyValue == 4: device.drag((465,275),(465,275),1.5,10) #Long touch "Delete" button; elif keyValue == 5: device.touch(70,430,'DOWN_AND_UP') #Tag "7" button; elif keyValue == 6: device.touch(220,430,'DOWN_AND_UP') #Tap "8" button; elif keyValue == 7: device.touch(340,430,'DOWN_AND_UP') #Tap "9" button; elif keyValue == 8: device.touch(470,430,'DOWN_AND_UP') #Tap "division" button; elif keyValue == 9: device.touch(70,580,'DOWN_AND_UP') #Tap "9" button; elif keyValue == 10: device.touch(220,580,'DOWN_AND_UP') #Tap "9" button; elif keyValue == 11: device.touch(340,580,'DOWN_AND_UP') #Tap "9" button; elif keyValue == 12: device.touch(470,580,'DOWN_AND_UP') #Tap "9" button; elif keyValue == 13: device.touch(70,730,'DOWN_AND_UP') #Tap "9" button; elif keyValue == 14: device.touch(220,730,'DOWN_AND_UP') #Tap "9" button; elif keyValue == 15: device.touch(340,730,'DOWN_AND_UP') #Tap "-" button; elif keyValue == 16: device.touch(470,730,'DOWN_AND_UP') #Tap "." button; elif keyValue == 17: device.touch(70,875,'DOWN_AND_UP') #Tap "9" button; elif keyValue == 18: device.touch(220,875,'DOWN_AND_UP') #Tap "0" button; elif keyValue == 19: device.touch(340,875,'DOWN_AND_UP') #Tap "=" button; elif keyValue == 20: device.touch(470,875,'DOWN_AND_UP') #Tap "+" button; else: pass MonkeyRunner.sleep(0.5) tapButton(100)
drag\touch都是MonkeyDevice中的方法。MonkeyRunner有3個modules,也就是類: MonkeyDevice、MonkeyImage、MonkeyRunner
MonkeyRecorder能夠跟蹤手機狀態。從android源碼中剝離出monkeyrunner的源碼,導入到工程裏,建立一個test類,使用java藉助monkeyrecorder玩一玩:手機上的各類key,在android.view中有KeyEvent.class,裏面有keycode對應的數字,查看MonkeyDevice.type幫助文檔,裏面的keycode值就和這個對應。test的思路:new monkeyrecorder對象,等待device鏈接上,設置recorder frame可見。
Public class MyTest{ static IMonkeyDevice device; public static void main(String [] args){ device = new AdbBacken().waitforConnection(); if (device ! = null){ MonkeyRecorderFrame frame = new MonkeyRecorderFrame(device); frame.setVisible(true);} }
keyPress事件流其實就是調用了keyEvent裏面的幾個事件,複寫了其方法
關於腳本移植後好用的問題:好比手機屏幕不一樣致使分辨率變動
320*480 -》 480*800 能夠這樣換算一下
device.touch(340,580,'DOWN_AND_UP')這句能夠寫成:320/x=480/newx;480/580=800/newY
Hierarchyviewer(tools裏一個工具)獲取佈局,即各個控件的座標,再定位;各類控件在底層也是獲取座標點。4.1如下須要root權限,4.1以上有ui工具了 http://blog.csdn.net/zm2714/article/details/7985061 這是使用hierachyviewer的心得文章
後續持續集成:
2014年1月推出RobotiumRecord工具,http://robotium.myshopify.com/products/robotium-recorder 能夠直接錄製,而後好歹改下腳本就能跑,很方便的
Robotium是基於控件的工具,對於跨應用比較弱,結合monkeyrunner這種跨應用強的工具,就算不用uiautomatic,也能夠解決通常的APP測試問題
測試雲:全部腳本保存在雲端,雲端能夠作個數據庫,好比mysql。經過雲端發起遠程控制你的終端,使用腳本發起一個事件流,經過monkeyrunner遠程調用和控制;終端能夠錄製等工做,完成後傳到雲端進行管理。相似Itestin、易測雲
用例管理、網頁展現
**************
網上找到經常使用方法:
MonkeyRunner的一些經常使用方法:
(詳細參考:http://developer.android.com/tools/help/MonkeyRunner.html)
void alert (string message, string title, string okTitle)
彈出一個對話框,默認標題「警告」,按鈕顯示「肯定」,可暫停當前的程序
例:MonkeyRunner.alert("hello world")
彈出一個hello world對話框
integer choice (string message, iterable choices, string title)
顯示帶有一列可選項的對話框,可暫停當前的程序,選擇後返回integer對象,表明選擇項的序列index
例:MonkeyRunner.choice("choice a sex",["man","women"])
彈出一個選擇性別的對話框,選擇man會返回0,選擇women會返回2
string input (string message, string initialValue, string title, string okTitle, string cancelTitle)
顯示一個輸入框,接受輸入後返回字符串
例:MonkeyRunner.input("enter text")
彈出一個輸入框,輸入後確認返回字符串
void sleep(float seconds)
暫停當前程序指定秒
例:MonkeyRunner.sleep(2)
暫停當前程序2秒
MonkeyDevice waitForConnection (float timeout, string deviceId)
timeout
等待鏈接時間,默認爲一直等待.
deviceId
設備名,可經過adb devices查看當前鏈接設備名,通常能夠不指定.
返回一個MonkeyDevice 實例
經常使用寫法爲:
device = MonkeRunner.waitForConnection()
經過獲取到的device對象,能夠調用MonkeyDevice的方法對設備進行操做。
MonkeyDevice的一些經常使用方法:
(詳細參考:http://wiki.eoeandroid.com/MonkeyDevice)
void drag (tuple start, tuple end, float duration, integer steps)
例:device.drag((120,240),(200,240),1,10)
屏幕解鎖操做,從(120,240)向(200,240)滑動,用時1秒,10爲默認值
object getProperty (string key)
查詢設備相關信息,參數參考:http://developer.android.com/tools/help/MonkeyDevice.html#table1
void installPackage (string path)
安裝指定路徑的APK文件。若是改文件已安裝,則會覆蓋安裝
例:device.installPackage("d:/2100.apk")
安裝D盤2100.apk,路徑中使用 /
void press (string name, dictionary type)
模擬按鈕操做。
name 爲按鍵碼,參考:http://docs.eoeandroid.com/reference/android/view/KeyEvent.html
type 爲鍵盤事件類型. 可用的值有DOWN, UP, 和DOWN_AND_UP
void removePackage (string package)
刪除指定的包,包括清除其數據和緩存
例:device.removePackage("evertone.Piano")
卸載piano程序,程序名經過aapt查看2100.apk文件,或者在shell模式下進入data/data目錄下查找
void shell (string cmd)
執行shell命令並返回結果
例:device.shell("date")
執行shell命令,查詢日期
void startActivity (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags)
啓動一個應用,對於須要測試的應用須要知道應用名和入口activity名稱。能夠調用sdk\builds-tools目錄下的aapt獲取
aapt dump baging d:\2100.apk
startActivity經常使用形式爲:
例:device.startActivity(component = "evertone.Piano/evertone.Piano.loading")
執行後啓動手機彈鋼琴
MonkeyImage takeSnapshot()
屏幕截圖,返回包含當前顯示截圖的MonkeyImage對象
例:Pic = device.takeSnapshot()
手機屏幕截圖,結果保存在Pic裏。pic爲MonkeyImage實例
void touch (integer x, integer y, integer type)
屏幕點擊(x,y)。type 爲鍵盤事件類型. 可用的值有DOWN, UP, 和DOWN_AND_UP
例:device.touch(93,143,"DOWN_AND_UP")
點擊屏幕(93,143)位置。屏幕座標獲取可以使用sdk\tools路徑下的Hierarchyviewer工具
void type (string message)
向設備發送包含字符的信息,等同於屢次調用press()方法。如今發現message中只能寫數字、英文,不能有空格,不然會輸入失敗
例:device.type("123adc")
輸入 123abc
void wake ()
喚醒屏幕。暫時沒發現有什麼用 =。=
MonkeyImage的一些經常使用方法:
(詳細參考:http://wiki.eoeandroid.com/MonkeyImage)
MonkeyImage對象通常不用直接建立,在獲取了MonkeyDevice對象後,調用takeSnapshot()方法便可
例:pic = MonkeyDevice.takeSnapshot()
string convertToBytes (string format)
將當前圖像轉換成特定格式,而且做爲字符串返回
tuple getRawPixel (integer x, integer y)
返回圖像位置座標(x,y)上的單個像素點,做爲一個整數元組,以(a,r,g,b)格式。可對特定點進行取色
MonkeyImage getSubImage (tuple rect)
從當前圖片中取出部分區域,建立一個新的MonkeyImage對象。參數爲元祖,指定截圖區域
例:pic_new=pic.getSubImage((0,0,100,100))
boolean sameAs (MonkeyImage other, float percent)
對比兩個MonkeyImage對象是否相等(比較截圖是否一致)。參數percent指定兩個圖像之間差別在多少百分比以內能夠看作「相等」。可進行自動化結果校驗
例:pic2.sameAs(pic1,0.9)
pic2和pic1在90%範圍內類似,則返回True,不然返回False
void writeToFile (string path, string format)
指定路徑和格式,保存圖片文件
例:pic1.writeToFile("d:/pic2.png","png")
指定圖片格式爲png,保存在本地d:/pic2.png路徑。保存成功則返回True
MonkeyRunner進行腳本編寫
1. 啓動一個MonkeyRunner範例
2. 如何獲取mOnkeyRunner的API文檔
3. 如何依據API文檔寫一個簡單的測試腳本
4. 腳本寫完後應加入什麼樣的代碼(用python或者Java語言配合都可)進行預測結果和實測結果判斷
5. 如何設定輸出log
Monkey壓力自動化測試
1. 測試app
2. 測試整機
3. 抓log
4. 用linux環境讀取日誌
5. 異常分析
6. 場景分析
7. 用例分析
性能自動化測試
1. cpu、內存、apk啓動時長、電量測試
2. 安全測試、兼容性測試、穩定性和可靠性測試
3. 內存泄露分析MAT工具使用
4. 市面上重點的雲框架GT、百度MTC、ITestin工具使用
性能測試腳本編寫
1. 啓動一個app測試性能
2. 如何獲取cpu,關注什麼
3. cpu運行hz百分比和jiffis怎麼樣纔算合格的app
內存工具進行分析
1. 獲取內存 (堆棧內存,物理內存,虛擬機內存)
2. 定位代碼和函數
3. 實時監控內存變化
電量自動化 整機和單進程監控
啓動時長對比測試
兼容性自動化測試
安全自動化測試
自動化測試框架的發展:第一代是錄製回放;第二代是加入判斷點,用例集;第三代引入模塊化思想、庫函數、數據驅動思想、關鍵字驅動思想