1. 程式人生 > >Android中如何做Monkey測試

Android中如何做Monkey測試

轉載請註明出處!

Monkey的介紹

Monkey是一個命令列工具,可以執行在模擬器裡或實際裝置中,使用安卓除錯橋(adb)來執行它,向系統傳送偽隨機的使用者事件流,實現對正在開發的應用程式進行壓力測試,可以根據獲取的log資訊進行修復。

Monkey的基本使用

  1. 連線裝置:adb devices 檢視裝置是否連線成功
  2. adb shell 進入shell介面
  3. 裝置安裝要執行的程式包或apk(或者通過檢視data/data下的程式包):adb安裝apk:在所安裝的apk路徑下,使用adb install **.apk
  4. 執行monkey測試命令:monkey -p your.package.name -v 500

在不知道所安裝的apk的包名的時候,採用adb命令檢視包名:

  1. adb logcat|grep START
  2. 開啟已安裝的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,日誌資訊出現在手機中:

  1. adb shell
  2. cd /data/anr 切換到裝置路徑下
  3. 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測試完成。