[Android 測試] 壓力穩定性測試之: Monkey 詳解分析指令碼
一、什麼是穩定性測試?
通過隨機點選螢幕一段時間,看看app會不會奔潰,能不能維持正常執行。
二. Money是什麼?
Monkey測試是Android平臺自動化測試的一種手段,通過Monkey程式模擬使用者觸控式螢幕幕、滑動Trackball、按鍵等操作來對裝置上的程式進行測試,檢測程式多久的時間會發生異常。和MonkeyRunner幾乎是完全不同的,MonkeyRunner相當於是搞自動化測試的了
三. Monkey的介紹
- Monkey程式由Android系統自帶,使用Java語言寫成,在Android檔案系統中的存放路徑是:/system/framework/monkey.jar
- Monkey.jar程式是由一個名為“monkey”的Shell指令碼來啟動執行,shell指令碼在Android檔案系統中的存放路徑是:/system/bin/monkey
- Monkey 命令啟動方式
a. 可以通過PC機CMD視窗中執行: adb shell monkey {+命令引數}來進行Monkey測試
b. 在PC上adb shell 進入Android系統,通過執行monkey {+命令引數} 來進行Monkey 測試
c. 在Android機或者模擬器上直接執行monkey 命令,可以在Android機上安裝Android終端模擬器
四. Monkey架構
五. Monkey弱點
Monkey雖然可以根據一個指定的命令指令碼傳送按鍵訊息,但不支援條件判斷,不支援讀取待測介面的資訊來執行驗證操作
六. Monkey的壓力測試引數
- -v
用於指定反饋資訊級別(資訊級別就是日誌的詳細程度)總共分3個級別,分別對應的引數如下表所示:
Level 0 : adb shell monkey -p fishjoy.control.menu -v 100
Level 1 : adb shell monkey -p fishjoy.control.menu -v -v 100
Level 2: adb shell monkey -p fishjoy.control.menu -v -v -v 100 - -s (隨機數種子)
用於指定偽隨機數生成器的 seed 值 , 如果 seed 相同 , 則兩次 Monkey 測試所產生的事件序列也相同的 ,為了恢復上一次的操作。 示例:
monkey測試1 : adb shell monkey -p fishjoy.control.menu –s 10 100
monkey測試2 : adb shell monkey -p fishjoy.control.menu –s 10 100 –throttle <毫秒>
用於指定使用者操作(即事件)間的時延 ,單位是毫秒,如果指定這個引數,monkey 會盡可能快的生成和傳送訊息
示例: adb shell monkey -p fishjoy.control.menu –throttle 3000 100-p <允許的包名列表>
用此引數指定一個或多個包。指定包之後,monkey將只允許系統啟動指定的app 。多個包,加多個-p引數。
指定一個包: adb shell monkey -p com.tpnet.hlquery 100
指定多個包: adb shell monkey -p com.tpnet.hlquery –p com.htc.pdfreader 100
例子:
adb shell monkey -p com.tpnet.hlquery --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkeytest.txt
測試com.tpnet.hlquery這個app,間隔100毫秒,50%的觸控事件,50%
的滑動事件,三個-v輸出詳細的日誌,執行1000個事件,日誌輸出到c:\monkeytest.txt
ps: 命令執行前手機先解鎖,win8 以上要用管理員身份開啟cmd
七. Monkey的結果於分析
- Monkey測試出現錯誤之後,一般的分析步驟分為以下幾種:
看Monkey日誌(注意第一個switch以及異常資訊等)
- 程式無響應問題,在日誌中搜索 “ANR”
- 奔潰問題: 在日誌中搜索 “Exception”
- 檢視Monkey裡面錯誤前的一些事件動作,並手動執行該動作。
如果Monkey測試順利執行完成,在log的最後,會打印出當前執行事件的次數和所花費的時間; // Monkey finished代表執行完成。
Monkey執行中斷,在log的最後也能檢視到當前的已經執行的次數。
八. Monkey測試中記憶體問題分析
1. 怎麼樣去確定記憶體洩漏?
1. 記憶體洩漏彈出out of memory對話方塊
2. 對於有記憶體洩漏但是沒有單出out of memory對話方塊的情況,可以通過logcat檔案GC出資訊,(GC:java的垃圾回收機制)
GC_FOR_ALLOC: 因為在分配記憶體時候記憶體不夠引起的
GC_EXPLICIT 表明GC被顯式請求觸發的,如System.gc呼叫,
GC_CONCCURRENT: 表明GC在記憶體使用率達到一定的警戒值時候,自動觸發
GC_BEFORE_OOM 表明在虛擬機器丟擲記憶體不夠異常oom之前,執行最後一次回收記憶體垃圾
九. –hprof 引數報告
adb shell monkey -p com.tpnet.hlquery --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkeytest.txt
如果指定了這個選項,monkey會在傳送事件的前後生成app記憶體快照檔案,一般會在裝置的/dada/misc目錄下生成hprof檔案(ps: /data/misc/需要root許可權)
拖進AndroidStudio即可檢視
(ps: 我測試了沒有生成。。不知道什麼回事)
十. Monkey Script指令碼製作
Monkey script是按照一定語法規則編寫有序的使用者事件流並且適用於monkey命令工具的指令碼,可以用txt寫。
指令碼編寫完畢放入手機的sdcard目錄下,cmd中執行命令
adb shell monkey -f/sdcard/指令碼名字 執行次數
結合monkey的-v和–hhprof輸出日誌和效能報告
adb shell monkey --hprof -f/sdcard/*.txt -v -v -v 3 > c:\monkey.txt
一些指令碼命令:
start data>>
將控制 monkey 的一些引數設定和具體的 monkey 命令分隔開來LaunchAcitivity(pkg_name, cl_name)
啟動任意應用的一個活動(介面)
pkg_name, 要啟動的應用包名
cl_name, 要開啟的活動的類名- DispatchPointer(downTime,eventTime,action,x,y,pressure,size,metaState,xPrecision,yPrecision,device,edgeFlags)
向一個指定位置傳送單個手勢訊息
downTime: 傳送訊息的時間,只要是合法的長整型數字即可
eventTime: 主要是用在指定傳送兩個事件之間的停頓
action: 訊息是按下還是擡起,0表示按下,1表示擡起
x:x 座標
y:y 座標
其餘 7 個引數均可以設定為 0
模版
count = 1 // 下面這個 count 選項, monkey 並沒有用到,可以忽略它
speed = 1.0 //speed 選項是用來調整兩次按鍵的傳送瀕率的
start data >> // “start data >>” 是 有 大小寫敏感的,而且單詞間的間隔只用有一個空格!
LaunchActivity(com.zhengping.contact, com.zhengping.contact.Main) //# Activity 值可以通過 aapt 命令檢視
DispatchPointer(5109520,5109520,0,261,128,0,0,0,0,0,0,0);
DispatchPointer(5109521,5109521,1,261,128,0,0,0,0,0,0,0);
UserWait(2000) // 停頓時間
DispatchPress (KEYCODE_Z) // 文字輸入 monkey 只識別英文和數字輸入