一、Monkey基礎知識
1、Monkey是什麼
Monkey是一款通過命令行對APP進行自動化測試的小工具,可以運行在模擬器裏或真機上。它向系統發送僞隨機的用戶事件流,對應用程序進行壓力測試,主要目的是爲了測試app是否會crash。
顧名思義,Monkey就是猴子, Monkey測試,就像一隻猴子, 在電腦面前,亂敲鍵盤在測試。 猴子什麼都不懂, 只知道亂敲。通過Monkey程序模擬用戶觸摸屏幕、滑動Trackball、 按鍵等操作來對設備上的程序進行壓力測試,檢測程序多久的時間會發生異常。
2、Monkey的介紹
- Monkey程序由Android系統自帶,使用Java語言寫成,在Android文件系統中的存放路徑是:/system/framework/monkey.jar
- Monkey.jar程序是由一個名爲“monkey”的Shell腳本來啓動執行,shell腳本在Android文件系統中的存放路徑是:/system/bin/monkey
3、Monkey架構
二、Monkey運行相關
1、運行Monkey步驟
分三步:
第一步:搭建環境:主要是安裝和搭建java和sdk環境。
第二步:準備好要測試的apk。
第三步:連接上Android測試設備,可以是模擬器,也可以是手機。(注意:monkey命令運行前手機先解鎖,win8 以上要用管理員身份打開cmd)
2、Monkey 命令啓動方式
a. 可以通過PC機CMD窗口中執行: adb shell monkey {+命令參數}來進行Monkey測試
b. 在PC上adb shell 進入Android系統,通過執行monkey {+命令參數} 來進行Monkey 測試
c. 在Android機或者模擬器上直接執行monkey 命令,可以在手機設備上安裝一個模擬器手機執行monkey+參數(手機模擬器可以通過百度搜索或360手機助手搜android terminal,安裝即可,可以在模擬器的命令行中輸入mokey +參數
3、Monkey停止的條件
Monkey Test執行過程中在下列三種情況下會自動停止:
1、如果限定了Monkey運行在一個或幾個特定的包上,那麼它會監測試圖轉到其它包的操作,並對其進行阻止。
2、如果應用程序崩潰或接收到任何失控異常,Monkey將停止並報錯。
3、如果應用程序產生了應用程序不響應(application not responding)的錯誤,Monkey將會停止並報錯。
通過多次並且不同設定下的Monkey測試纔算它是一個穩定性足夠的程序。
三、Monkey命令相關
1、Monkey的測試參數
-
-v 命令行的每一個-v將增加反饋信息的級別。
- -v:Level 0(缺省值)除 啓動提示、測試完成和最終結果之外,提供較少信息。
- -v -v :Level 1提供較爲詳細的測試信息,如逐個發送到Activity的 事件。
- -v -v -v :Level 2提供更加詳細的設置信息,如測試中被選中的或未被選中的Activity。
-
adb shell monkey -p com.tencent.mobileqq -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
- 1
2、Monkey命令行操作步驟:
命令1:adb devices 查看連接到本地計算機上的Android設備列表
命令2:adb install xx.apk 把指定的安裝包apk文件安裝到測試設備中
如果是將apk安裝到手機中,手機需要開啓開發者選項-usb安裝,否則安裝不成功;
命令3:adb shell 進入shell界面,在此界面中可以查看到設備中的安裝包,也可以執行shell命令
應用程序的安裝包名在 /data/data下,命令如下:
退出shell,命令如下:
命令4:adb shell monkey Count 給指定的設備發送壓力測試,其中Count爲要測試的次數
執行此命令的效果就相當於有個手指在設備上亂點Count次。
以上爲簡單操作,接下來就可以按照monkey命令實例等來進行更高級的操作了
3、一些Monkey命令:
1)adb uninstall apk包名 卸載apk
2)app包名查看
a.手機安裝包名查看器'
b.aapt命令 aapt dump badging *.apk
c、源碼下的AndroidManifest.xml文件查看
d.adb logcat抓取當前Android機運行的app的包名( I/ActivityManager(數字): Displayed 包名/類名: +ms )
命令行輸入 adb logcat >e:\bag.txt;手機操控app,ctrl+c停止;去e:\bag.txt這個文件下搜索關鍵字如Displayed ,一般都能找到
3)殺monkey進程
如果想中斷運行中的monkey CTRL+C
adb shell ps | grep monkey 返回進程號
adb shell kill [剛纔查到的進程號]
4、Monkey命令實例
實例1:adb shell monkey -p com.rexen.zxapplication -s 23 --throttle 2000 --ignore-crashes --ignore-timeouts -v -v -v 100>D:\android-sdk\log\log.txt 2>&1 &
1. -p後面接着的對應的包名,如果是整機測試,就不需要 -ppackage_name
2. -s後面是對應的種子數,好像就是操作步驟,根據她們測試的經驗,一般種子數在23,同步她們測試的結果,一般種子的個數固定爲23,和她們選擇的操作步驟就是同步的。
3. --ignore-crashes --ignore-timeouts 這裏是在monkey測試的過程中遇到carash或者timeout的情況時忽略掉,一般不設置時,出現carash或者timeout時,Monkey測試會終止。這裏是防止Monkey測試終止。
4. -v 指的是Monkey測試時打印log級別。
5. 100000 這裏是指點擊的次數,根據她們測試的經驗,對於單個應用程序這個次數設置在100000次就可以了;如果是整機,一般設置在500000次。
/data/local/tmp/log.txt測試的log記錄在手機上/data/local/tmp/ 下面的log.txt裏面,這個名字可以自己寫。
6. 2>&1 固定的寫法,這個也很重要,代表的意思是中間忽略的東東的日誌一併輸入到指定的文件中。
7. 最後單獨的一個"&" 是一旦Monkey測試開始了,之後可以拔掉數據線,不會影響Monkey測試。
8. 測試所有模塊 monkey -s 23 --ignore-crashes --ignore-timeouts -v-v -v 100000> /data/local/tmp/log.txt 2>&1 &
實例2: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
四、Monkey日誌分析
在log的最開始都會顯示Monkey執行的seed值、執行次數和測試的包名。如果Monkey測試順利執行完成, 在log的最後, 會打印出當前執行事件的次數和所花費的時間;
// Monkey finished 代表執行完成。Monkey 執行中斷, 在log最後也能看到當前執行次數。
1、分析步驟:
1、ANR問題:在日誌中搜索“ANR ”(此處有空格)
2、崩潰問題:在日誌中搜索“Exception”,快速定位到關鍵事件信息 。
3、查看Monkey中出錯前的一些事件動作,並手動執行該動作,找出重現步驟,給開發。
注意:使用monkey命令重現問題時,seed值要一摸一樣。
tip:
1、雖然Monkey測試有部分缺陷,但我們無法準確地得知重現步驟;如果出現空指針, NullPointerException肯定是有bug(用戶使用時問題必現, 何時出現只是時間問題)。
2、理論上來說, Monkey所有的Crash 都需要在發佈前修復掉;