app測試之monkey
一 Monkey簡介
Monkey是一款app的自動化測試工具,monkey是猴子的意思,所以從原理上說,它的自動化測試就類似猴子一樣在軟體上亂敲按鍵,猴子什麼都不懂,就愛搗亂。Monkey原理也是類似,通過向系統傳送偽隨機的使用者事件流(如按鍵輸入、觸控式螢幕輸入、滑動Trackball、手勢輸入等操作),來對裝置上的程式進行測試,檢測程式長時間的穩定性,多久的時間會發生異常。
Monkey工具存在Android系統中,使用Java語言寫成,jar包在Android檔案系統中的存放路徑是:/system/framework/monkey.jar;Monkey.jar程式是由一個名為“monkey”的Shell指令碼來啟動執行,shell指令碼在Android檔案系統中的存放路徑是:/system/bin/monkey;
monkey需要通過adb來喚醒,即通過在cmd視窗中執行: adb shell monkey {+命令引數}來進行Monkey測試;
二 Monkey 工作原理
在Monkey執行的時候,它會生成事件,並把它們發給系統。同時,Monkey還對測試中的系統進行監測,對下列三種情況進行特殊處理:
(1) 如果限定了Monkey執行在一個或幾個特定的包上,那麼它會監測試圖轉到其它包的操作,並對其進行阻止;
(2) 如果應用程式崩潰或接收到任何失控異常,Monkey將停止並報錯;
(3) 如果應用程式產生了應用程式不響應ANR(application not responding)的錯誤,Monkey將會停止並報錯;
按照選定的不同級別的反饋資訊,在Monkey中還可以看到其執行過程報告和生成的事件。
###
Monkey特點
1、執行時機:一般是產品穩定後 首輪功能測試完成的夜間進行
2、需要知道packageName
3、目的:主要測試產品是否存在崩潰問題和ANR問題。
ANR(Application Not Responding):即應用無響應。主執行緒在超時時間內沒有做完特定的事情,就會發生ANR。
###
三 monkey使用
獲取包名的兩個方法
首先安裝到模擬器上想獲取的包:adb install <帶路徑的包名>
1、通過adb logcat獲取
adb shell “logcat | grep START”【如果直接使用不出現log,可以先進入linux命令:adb shell,然後再執行:logcat | grep START】
然後開啟apk ,就可以出現包名
2、aapt dump badging apk名稱
Monkey的基本命令
1、標準monkey命令:adb shell monkey -p com.android.calculator2 -v 50
-p:packageName
-v:日誌級別
50:事件數
2、adb shell monkey -p com.android.calculator2 -v -v --pct-touch 50 --throttle 600 88
--pct-touch 50 設定整個過程中點選操作所佔的百分比
--throttle 600每個事件間隔600ms
3、adb shell monkey -p packagename --throttle 500 --ignore-crashes --ignore-timeouts --ignoresecurity-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000000>c:\monkey_test.log
--ignore-crashes 用於指定當應用程式崩潰時(Force& Close錯誤),Monkey是否停止執行。如果 使用此引數,即使應用程式崩潰,Monkey依然會發送事件,直到事件計數完成。
--ignore-timeouts 用於指定當應用程式發生ANR(Application No Responding)錯誤時,Monkey是 否停止執行。如果使用此引數,即使應用程式發生ANR錯誤,Monkey依然會發送事件,直到事件計 數完成。
--ignore-security-exceptions 用於指定當應用程式發生許可錯誤時(如證書許可,網路許可等), Monkey是否停止執行。如果使用此引數,即使應用程式發生許可錯誤Monkey依然會發送事件,直 到事件計數完成。
--kill-process-after-error 用於指定當應用程式發生錯誤時,是否停止其執行。如果指定此引數,當應 用程式發生錯誤時,應用程式停止執行並保持在當前狀態(注意:應用程式僅是靜止在發生錯誤時 的狀態,系統並不會結束該應用程式的程序)。
--monitor-native-crashes 用於指定是否監視並報告應用程式發生崩潰的原生代碼
四、Monkey的日誌級別
引數: -v 用於指定反饋資訊級別(資訊級別就是日誌的詳細程度),總共分3個級別,分別對應的引數如下表所示:
1、日誌級別 Level0
示例 adb shellmonkey -p com.htc.Weather –v 100
說明 預設值,僅提供啟動提示、測試完成和最終結果等少量資訊
2、日誌級別 Level 1
示例 adb shell monkey -p com.htc.Weather –v -v 100
說明 提供較為詳細的日誌,包括每個傳送到Activity的事件資訊
3、日誌級別 Level 2
示例 adb shell monkey -p com.htc.Weather –v -v –v 100
說明 最詳細的日誌,包括了測試中選中/未選中的Activity資訊
五、Monkey的事件型別
1、--pct-touch:指定觸控事件的百分比,如:--pct-touch 5
2、 --pct-motion (滑動事件)
3、 --pct-trackball (軌跡球事件)
4、 --pct-nav (導航事件 up/down/left/right)
5、 --pct-majornav (主要導航事件 back key 、 menu key)
6、 --pct-syskeys (系統按鍵事件 Home 、Back 、startCall 、 endCall 、 volumeControl)
7、 --pct-appswitch (activity之間的切換)
8、--pct-anyevent (任意事件)
六、Monkey的引數 -s
引數: -s 用於指定偽隨機數生成器的seed值,如果seed相同,則兩次Monkey測試所產生的事件序列也相同的。 示例:
Monkey測試1:adb shell monkey -p com.htc.Weather –s 10 100
Monkey 測試2:adb shell monkey -p com.htc.Weather–s 10 100 兩次測試的效果是相同的,因為模擬的使用者操作序列(每次操作按照一定的先後順序所組成的一系列 操作,即一個序列)是一樣的。操作序列雖然是隨機生成的,但是隻要我們指定了相同的Seed值,就可 以保證兩次測試產生的隨機操作序列是完全相同的,所以這個操作序列偽隨機的;
七、Monkey的日誌分析
1、按關鍵字進行搜尋,ANR、Exception、Crash、Error。
2、找到有問題的地方,檢視上下文資訊。
3、注意第一個switch上下文資訊。
4、檢視monkey裡面出錯前的一些事件動作,可以手動執行該動作。
5、進行問題復現,可以使用之前執行的monkey命令在執行一遍,注意seed值要一樣。
【測試結果分析】
(1)、ANR問題(程式無響應):在日誌中搜索“ANR"(application no response)
(2)、閃退問題:在日誌中搜索"crash"
(3)、異常:搜尋"exception"
(4)、強制退出:搜尋"force closed"
八、Crash專項
1、安裝可以引起Crash的App
2、執行壓力命令
3、析取Crash的Exception資訊
案例: 執行壓力測試,並且生成monkey_test.log日誌檔案。
#adb shell monkey -p cn.besttest.crashtest -v 100 >E:\monkey\monkey_test.log
#檢視E盤資料夾下已經生成了monkey_test.log。
#開啟檔案,進行crash分析
九、ANR專項
步驟同上
1、安裝可以引起ANR的App
2、執行壓力命令
3、析取ANR的Exception資訊
1、檢視monkey的log
2、/data/anr/traces.txt
3、檢視logcat日誌 ANR
###