1. 程式人生 > 其它 >app測試之monkey

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

###