Android中如何做Monkey測試
轉載請註明出處!
Monkey的介紹
Monkey是一個命令列工具,可以執行在模擬器裡或實際裝置中,使用安卓除錯橋(adb)來執行它,向系統傳送偽隨機的使用者事件流,實現對正在開發的應用程式進行壓力測試,可以根據獲取的log資訊進行修復。
Monkey的基本使用
- 連線裝置:adb devices 檢視裝置是否連線成功
- adb shell 進入shell介面
- 裝置安裝要執行的程式包或apk(或者通過檢視data/data下的程式包):adb安裝apk:在所安裝的apk路徑下,使用adb install **.apk
- 執行monkey測試命令:monkey -p your.package.name -v 500
在不知道所安裝的apk的包名的時候,採用adb命令檢視包名:
- adb logcat|grep START
- 開啟已安裝的apk,查看出現的ActivityManager資訊,cmp=name,此name就是開啟的apk的包名。
Monkey命令使用
-help 列出簡單用法 -v 作用:命令列上的每一個-v都將增加反饋資訊的詳細級別。 Level0(預設),除了啟動、測試完成和最終結果外只提供較少的資訊。 Level1,提供了較為詳細的測試資訊,如逐個傳送到Activity的事件資訊。 Level2,提供了更多的設定資訊,如測試中選中或未選中的Activity資訊。 例: adb shell monkey -v 10 adb shell monkey -v -v 10 adb shell monkey -v -v -v 10 -s <seed> 作用:偽隨機數生成器的seed值。如果用相同的seed值再次執行monkey,將生成相同的事件序列。 例: adb shell monkey -s 12345 -v 10 --throttle <milliseconds> 作用:在事件之間插入固定的時間(毫秒)延遲,你可以使用這個設定來減緩Monkey的執行速度,如果你不指定這個引數,則事件之間將沒有延遲,事件將以最快的速度生成。 例: adb shell monkey –throttle 300 -v 10 注:常用引數,一般設定為300毫秒,原因是實際使用者操作的最快300毫秒左右一個動作事件,所以此處一般設定為300毫秒。 -p <allowed-package-name> 作用:如果你指定一個或多個包,Monkey將只允許訪問這些包中的Activity。如果你的應用程式需要訪問這些包(如選擇聯絡人)以外的Activity,你需要指定這些包。如果你不指定任何包,Monkey將允許系統啟動所有包的Activity。指定多個包,使用多個-p,一個-p後面接一個包名。 例: adb shell monkey -p com.android.browser -v 10 -c <main-category> 作用:如果你指定一個或多個類別,Monkey將只允許系統啟動這些指定類別中列出的Activity。如果你不指定任何類別,Monkey將選擇謝列類別中列出的Activity,Intent.CATEGORY_LAUNCHER和Intent.CATEGORY_MONKEY。指定多個類別使用多個-c,每個-c指定一個類別。 例: adb shell monkey -p com.paipai.ershou -v 10 -c --pct-touch <percent> 作用:調整觸控事件的百分比。(觸控事件是指在螢幕中的一個down-up事件,即在螢幕某處按下並擡起的操作) 例: adb shell monkey –pct-touch 100 -v 10 注:常用引數,此引數設定要適應當前被測應用程式的操作,比如一個應用80%的操作都是觸控,那就可以將此引數的百分比設定成相應較高的百分比。 --pct-motion <percent> 作用:調整motion事件百分比。(motion事件是由螢幕上某處一個down事件、一系列偽隨機的移動事件和一個up事件組成) 例: adb shell monkey –pct-motion 100 -v 10 注:常用引數,需注意的是移動事件是直線滑動,下面的trackball移動包含曲線移動。 --ignore-crashes 作用:通常,應用發生崩潰或異常時Monkey會停止執行。如果設定此項,Monkey將繼續傳送事件給系統,直到事件計數完成。 --ignore-timeouts 作用:事件請求超時會影響monkey的測試。如果設定此項,Monkey將繼續傳送事件給系統,直到事件計數完成。 儲存測試日誌其實很簡單,命令如下: adb shell monkey -p com.ihongqiqu -v -v -v 500 > monkeytest.txt
Monkey測試資訊
在Monkey測試過程中可能會出現程式崩潰(CRASH)和程式無響應的情況(ANR),要將測試的log資訊獲取到,從而解決bug。
CRASH
CRASH即崩潰資訊,程式在執行中非正常退出。 不設定忽略crashes,在測試過程中出現CRASH,會中斷測試,並顯示CRASH資訊和seed資訊
根據seed值來完成bug的復現:adb shell monkey -p com.feicuiedu.monkeytestdemo -s 1476474162566 -v 1000
ANR
Applicaton Not Responsing.
同樣在monkey測試過程中,如果出現ANR現象,會輸出相應的資訊,以ANR開頭,獲取到資訊進行問題的解決,同樣可以通過seed來進行復現。
附:如果在手動測試過程中出現ANR,日誌資訊出現在手機中:
- adb shell
- cd /data/anr 切換到裝置路徑下
- ls 可以看到traces.txt 裡面即為log資訊
MonkeyScript
MonkeyScript是monkey的指令碼語言,是一組可以被Monkey識別的命令集合,可以幫我們完成一系列的被固定的重複性操作,Monkey通過指令碼來進行測試,簡單快捷、不需要任何工具,只是一個記事本檔案,缺點是在座標、按鍵等方面沒有邏輯性。
指令碼格式
#標頭檔案、控制monkey傳送訊息的引數
type=raw events
count=10
speed=1.0
#以下為monkey命令
start data >>
DispatchPress (KEYCODE_HOME)
DispatchPress (KEYCODE_MENU)
常用API
常用API的介紹,其中keycode
參考keycode列表
LaunchActivity(pkg_name, cl_name): 啟動應用的Activity。引數:包名和啟動的Activity。
Tap(x, y, tapDuration): 模擬一次手指單擊事件。引數:x,y為控制元件座標,tapDuration為點選的持續時間,此引數可省略。
DispatchPress(keyName): 按鍵。引數: keycode
RotateScreen(rotationDegree, persist): 旋轉螢幕。 引數:rotationDegree為旋轉角度, e.g. 1代表90度;persist表示旋轉之後是否固定,0表示旋轉後恢復,非0則表示固定不變。
DispatchFlip(true/false): 開啟或者關閉軟鍵盤。
LongPress(): 長按2秒。
PressAndHold(x, y, pressDuration): 模擬長按事件。
DispatchString(input): 輸入字串。
Drag(xStart, yStart, xEnd, yEnd, stepCount): 用於模擬一個拖拽操作。
PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模擬縮放手勢。
UserWait(sleepTime): 休眠一段時間
DeviceWakeUp(): 喚醒螢幕。
PowerLog(power_log_type, test_case_status): 模擬電池電量資訊。
WriteLog(): 將電池資訊寫入sd卡。
RunCmd(cmd): 執行shell命令。
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags):向指定位置,傳送單個手勢。
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFilags):傳送按鍵訊息。
LaunchInstrumentation(test_name,runner_name): 執行一個instrumentation測試用例。
DispatchTrackball: 模擬傳送軌跡球事件。
ProfileWait: 等待5秒。
StartCaptureFramerate(): 獲取幀率。
EndCaptureFramerate(input): 結束獲取幀率。
API方法中控制元件位置(X,Y軸的座標)的獲取:使用Android提供的工具uiautomatorviewer.bat
在Android SDK路徑下--> tools --> uiautomatorviewer.bat,開啟就可以展示裝置/模擬器上展示的檢視,展示檢視結構和座標。
簡單示例
#標頭檔案、控制monkey傳送訊息的引數
type=raw events
count=10
speed=1.0
#以下為指令碼正文
start data >>
#1.開啟瀏覽器
LaunchActivity(com.android.browser,com.android.browser.BrowserActivity)
ProfileWait()
#2.清空網址
Tap(223,146)
ProfileWait()
DispatchPress(112)
ProfileWait()
#3.輸入網址
DispatchString(www.baidu.com)
ProfileWait()
#4.確認,載入網址
DispatchPress(KEYCODE_ENTER)
ProfileWait()
#5.完成退出瀏覽器
DispatchPress(KEYCODE_HOME)
ProfileWait()
1.指令碼完成後將.txt 檔案push到手機中
adb push name.txt path
其中name是指monkey指令碼檔案的名稱,path是要push到手機上的路徑
2.執行Monkey指令碼
monkey -f path/name.txt -v 500
path是push的路徑,name是指令碼檔案的名稱。
案例實踐
隨機事件流對MonketTestDemo進行測試:
1. adb devices 檢視裝置是否連線
2. adb shell 進入shell介面
3. monkey -p com.feicuiedu.monkeytestdemo -v 500 執行monkey命令
4. (可選)monkey -p com.feicuiedu.monkeytestdemo -v 500 > monkeytest.txt 執行monkey命令,並將monkey日誌儲存
一次隨機的自動化Monkey測試完成。
MonkeyScript對MonkeyTestDemo進行測試:
1. 完成monkey.txt指令碼的編寫,儲存到某一路徑下
2. 切換到monkey.txt路徑下
3. adb push monkey.txt /data/local/temp/(裝置的任一路徑,無確切規定)
4. adb shell 切換到裝置下
5. cd /data/local/temp 切換到monkey.txt路徑下
6. monkey -f monkey.txt -v 10 執行monkey指令碼及執行次數
一次MonkeyScript的自動化Monkey測試完成。