monkey命令


前言

Monkey是 Android SDK 提供的一個命令行工具,是 Android 自動化測試的一種手段 。Monkey 命令通過向安卓設備/安卓模擬器發送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等)。對Android APP做穩定性(壓力)測試。【主要是為了測試app是否存在無響應和崩潰閃退等異常情況。】

產品處於穩定狀態,沒有太多BUG后,一般使用monkey命令去測試產品的穩定性、健壯性(是否會發生閃退、崩潰和無響應等問題),實現對正在開發的安卓應用程序進行壓力測試和穩定性測試 。

獲取測試日志的ANR、CRASH、Exception信息,提供給開發人員分析和定位問題。【一般一次Monkey測試中0 ANR 、0 CRASH是測試標准

Monkey測試是一種為了測試軟件的穩定性、健壯性的快速有效的方法。

Monkey 簡介

①Monkey 就是Android SDK中附帶的一個命令行工具,可以運行在Android模擬器里或實際的Android設備中。

②Monkey向系統發送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試。

③Monkey測試是一種為了測試軟件的穩定性、健壯性的快速有效的方法。

④Monkey用於進行壓力測試。開發人員可以結合Monkey打印的日志和系統打印的日志,分析測試中的問題。

Monkey的特點

Monkey 程序是由 Android 系統自帶,使用 Java 語言寫成。在Android文件系統中的存放路徑是/system/framework/monkey.jar。

Monkey.jar程序是由一個名為“monkey”的Shell腳本來啟動執行,shell腳本在Android文件系統中的存放路徑是/system/bin/monkey。

總結:通過①②說明monkey可以直接通過打包進測試工具中,可以被測試人員直接使用。

   網絡上許多第三方的monkey工具就是通過對原生的Monkey.jar包進行二次開發實現。

Monkey測試的特點

①Monkey 測試,所有的事件都是隨機產生的,不帶任何主觀性。

②測試的對象僅為應用程序包,有一定的局限性。

③Monky 測試使用的事件數據流是隨機的,不能進行自定義。

③可對 Monkey 測試的對象(啟動系統指定的包名),事件數量,類型,頻率等進行設置。

Monkey 架構

Monkey 運行在安卓設備或模擬器中,可以脫離PC端運行。(一般在一些大公司中都是將其抽離成一個測試專用的APP工具,使用相應的操作來完成測試)

Monkey的基本用法

adb shell monkey [options]

【注意】如果不指定options參數,Monkey將以無反饋模式啟動,並把事件任意發送到安裝在目標環境中的全部包對應的安卓app。

如下示例:啟動指定的應用程序,並向其發送500個偽隨機事件:

Monkey 命令行:

adb shell monkey -p 包名 --throttle 時間間隔 -s 隨機數種子 -v -v -v 次數 > 日志文件名 

Monkey 測試結果分析:

①正常結果:在日志文件最后一行出現 Monkey finished,表示設備運行正常。

②異常結果:日志中遇到 Crash 或者 ANR 自動終止運行。

Monkey 測試指標:

①可以按操作次數或操作時間來規定指標。

②一般情況 3 萬次以內出現 Crash,認為安卓應用系統的可靠性比較差。

舉例:

adb shell monkey -p your.package.name -v 500

Monkey常用命令行:

1、參數:-p

用於約束限制,Monkey用此參數指定一個或多個包名(Package,即App)。

指定包之后,Monkey將只允許系統啟動指定的APP,如果不指定包名,將允許系統啟動設備中的所有APP。【會把任意事件發送到所有的app】

舉例:

* 指定一個包:  adb shell monkey -p cn.emoney.acg 10 

* 指定多個包: adb shell monkey -p cn.emoney.acg –p cn.emoney.wea -p cn.emoney.acg 100 

* 不指定包: adb shell monkey 100 

2、參數:-v

用於指定反饋信息級別(信息級別就是日志的詳細程度),總共分3個級別,分別對應的參數如下表所示:

①日志級別 Level0(1V):說明缺省值,僅提供啟動提示、測試完成和最終結果等少量信息。(Level 0(缺省值)除 啟動提示、測試完成和最終結果之外,提供較少信息)

舉例: adb shell monkey -p cn.emoney.acg –v 100 

②日志級別 Level1(2V):說明提供較為詳細的日志,包括每個發送到Activity的事件信息。(Level 1提供較為詳細的測試信息,如逐個發送到Activity的事件)

舉例: adb shell monkey -p cn.emoney.acg –v -v 100 

③日志級別 Level 2(3V):說明最詳細的日志,包括了測試中選中/未選中的Activity信息。(Level 2提供更加詳細的設置信息,如測試中被選中的或未被選中的Activity)

舉例: adb shell monkey -p cn.emoney.acg –v -v –v 100 

3、參數:-s

測試人員為了能夠重現測試到的bug問題,需要能夠對Monkey的隨機生成事件有重現能力:monkey允許對隨機事件的seed值做設置,當兩次seed值一樣,整個測試效果將會產生相同的事件序列。

用於指定偽隨機數生成器的seed值,如果seed相同,則兩次Monkey測試所產生的事件序列也相同的。【偽隨機數生成器的seed值Money命令向系統發送偽隨機的用戶事件流的順序】

舉例:為隨機數的事件序列定一個值,若出現問題下次可以重復同樣的系列進行排錯。(偽隨機數生成器的seed值。如果用相同的seed值再次運行Monkey,它將生成相同的事件序列)

Monkey 測試1: adb shell monkey -p cn.emoney.acg -s 10 100 

Monkey 測試2: adb shell monkey -p cn.emoney.acg –s 10 100 

兩次測試的效果是相同的,因為模擬的用戶操作序列(每次操作都會按照一定的先后順序所組成的一系列操作,即一個序列)是一樣的。如下:

可以看到,在每次執行完Monkey命令之后,從輸出里可以看到當前的seed值,只要通過-s參數指定相同的seed,就可以重復剛才的操作。

例如如果需要重復上面的操作,就需要在Terminal中輸入:

adb shell monkey -p com.geely.consumer -s 1639012303781 -v -v 1000000

4、參數: --throttle<毫秒>

事件之間加入延時操作:在某些不需要頻率過快,或需要指定頻率進行交互時,可以采用--throttle來做事件之間的延時操作。

用於指定用戶操作(即事件)間的時延(延遲時間),單位是毫秒;

舉例:【為每一次執行一次有效的事件后休眠5000毫秒】

 adb shell monkey -p cn.emoney.acg --throttle 5000 100 

在隨機事件之間插入固定延遲。通過這個選項可以減緩Monkey的執行速度。

如果不指定該選項,Monkey將不會被延遲,事件將盡可能快地被產成。

一般業內標准是每秒操作2-3次。即:--throttle 200到 --throttle 300

5 、參數: --ignore-crashes

忽略程序崩潰。

正常來說,如果在 Monkey 命令執行的階段,安卓應用程序出現了崩潰,會立即停止接下去的執行。但是有時候,我們在執行Monkey的時候,是在無人員干涉的情況下,例如想要它執行一夜等等情況。那么如果出現崩潰就停止執行,明顯不是我們需要的。

用於指定當應用程序崩潰時(Force& Close錯誤),Monkey是否停止運行。

如果使用此參數,即使應用程序崩潰,Monkey依然會發送事件,直到事件計數完成。但是對於重新執行的 Monkey 命令-s參數設置的隨機數seed值將不會生效。

舉例:

測試過程中即使程序崩潰,Monkey依然會繼續發送事件直到事件數目達到1000為止: adb shell monkey -p cn.emoney.acg --ignore-crashes 1000 

測試過程中,如果acg程序崩潰,Monkey將會停止運行: adb shell monkey -p cn.emoney.acg 1000 

6、參數: --ignore-timeouts

忽略程序超時。【這里的超時並不是網絡超時或者接口返回超時,而是程序相應超時導致的ANR】

ANR是Android應用程序的一個錯誤,在頁面無法響應事件的時候會報出來。一般遇到這樣的情況,表示當前有耗時操作在UI線程指定,導致卡UI了。

用於指定當應用程序發生ANR(Application No Responding)錯誤時,Monkey是否停止運行。如果使用此參數,即使應用程序發生ANR錯誤,Monkey依然會發送事件,直到事件計數完成。

舉例:

adb shell monkey -p cn.emoney.acg --ignore-timeouts 1000

7、參數: --ignore-security-exceptions

用於指定當應用程序發生許可錯誤時(如證書許可,網絡許可等),Monkey是否停止運行。

如果使用此參數,即使應用程序發生許可錯誤,Monkey依然會發送事件,直到事件計數完成。

舉例:

adb shell monkey -p cn.emoney.acg --ignore-security-exception 1000

8、參數: --kill-process-after-error

用於指定當應用程序發生錯誤時,是否停止其運行。

如果指定此參數,當應用程序發生錯誤時,應用程序停止運行並保持在當前狀態。

【注意】應用程序僅是靜止在發生錯誤時的狀態,系統並不會結束該應用程序的進程。

舉例:

adb shell monkey -p cn.emoney.acg --kill-process-after-error 1000

9、參數: --monitor-native-crashes

用於指定是否監視並報告應用程序發生崩潰的本地代碼。

舉例:

adb shell monkey -p cn.emoney.acg --monitor-native-crashes 1000

10、參數: --pct-{事件類別}{事件類別百分比}:用於指定每種類別事件的數目百分比(在Monkey事件序列中,該類事件數目占總事件總數目的百分比)

指定發生事件的類型【限制Monkey測試隨機執行的事件類型和占比,–pct-xxx參數

Monkey測試是希望模擬用戶操作,在實際測試過程中需要讓Monkey執行的事件盡可能地接近用戶的常規操作,這樣才可以最大限度地發現用戶使用過程中可能出現的問題。因此我們需要對Monkey執行的事件比例做一些調整。實際比例可按照被測App情況調整,不能超過100%。

雖然Monkey測試是隨機事件,但是我們可以指定事件的類型。【注意】:①所有指定事件的數值加起來不能超過100。②不做任何指定時,默認為--pct-anyevent <percent> 類型,百分比為百分之百,也就是純隨機事件。③如果通過其他的參數配置了之后,如果相加的百分比不為百分百,余下的百分比部分也會生成隨機事件。

--pct-touch <percent>:指定觸摸事件的百分比。

--pct-motion <percent>:指定滑動事件的百分比。

--pct-trackball <percent>:指定軌跡球事件的百分比。

--pct-nav <percent>:指定導航事件中,up、down、left、right等事件的百分比。

--pct-majornav <percent>:指定導航事件中,back、menu等事件的百分比。

--pct-syskeys <percent>:指定系統按鍵的百分比,包括HOME、Back、音量等。

--pct-appswitch <percent>:指定Activity之間切換的比例。

--pct-anyevent <percent>:指定任意事件的百分比。

①--pct-touch{百分比}

調整觸摸事件的百分比(觸摸事件是一個down-up事件,它發生在屏幕上的某單一位置)

adb shell monkey -p cn.emoney.acg --pct-touch 10 100

②--pct-motion {百分比}

調整動作事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的偽隨件機事和一個up事件組成)

adb shell monkey -p cn.emoney.acg --pct-motion 20 1000

③--pct-trackball {百分比}

調整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)

adb shell monkey -p cn.emoney.acg --pct-trackball 30 1000

④--pct-nav{百分比}

調整“基本”導航事件的百分比(導航事件由來自方向輸入設備的up/down/left/right組成)

adb shell monkey -p cn.emoney.acg --pct-nav 40 1000

⑤--pct-majornav{百分比}

調整“主要”導航事件的百分比(這些導航事件通常引發圖形界面中的動作,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵)

adb shell monkey -p cn.emoney.acg --pct-majornav 50 1000

⑥--pct-syskeys {百分比}

調整“系統”按鍵事件的百分比(這些按鍵通常被保留,由系統使用,如Home、Back、Start Call、End Call及音量控制鍵)。

adb shell monkey -p cn.emoney.acg --pct-syskeys 20 1000

⑦--pct-appswitch {百分比}

調整啟動Activity的百分比。在隨機間隔里,Monkey將執行一個startActivity()調用,作為最大程度覆蓋包中全部Activity的一種方法。

adb shell monkey -p cn.emoney.acg --pct-appswitch 20 1000

⑧--pct-anyevent {百分比}

調整其它類型事件的百分比。它包羅了所有其它類型的事件,如:按鍵、其它不常用的設備按鈕、等等。

adb shell monkey -p cn.emoney.acg --pct-anyevent 100 1000

11、參數: --hprof

設置此選項,將在Monkey事件序列之前和之后立即生成profiling報告。這將會在data/misc中生成大文件(~5Mb),所以要小心使用它。

Monkey調試選項

1、一般情況下,安卓APP在操作過程中會存在崩潰、超時、異常等情況,按照前面所提到的,這會導致monkey直接停止測試。如果想要忽略掉這些情況,直接配置忽略設置就可以。

①--dbg-no-events:初始化啟動的activity,但是不產生任何事件。
②--hprof:指定該項后在事件序列發送前后會立即生成分析報告  —— 一般建議指定該項。
③--ignore-crashes:忽略崩潰
④--ignore-timeouts:忽略超時
⑤--ignore-security-exceptions:忽略安全異常
⑥--kill-process-after-error:發生錯誤后直接殺掉進程
⑦--monitor-native-crashes:跟蹤本地方法的崩潰問題
⑧--wait-dbg:知道連接了調試器才執行monkey測試。

2、可以輸入下面命令查看Monkey測試的其他命令行:

adb shell monkey -help

運行結果:

usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]//調試的應用包名
              [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]//測試對應的categrory
              [--ignore-crashes] [--ignore-timeouts]
              [--ignore-security-exceptions]
              [--monitor-native-crashes] [--ignore-native-crashes]//忽略系列的大爺們
              [--kill-process-after-error] [--hprof]//默認
              [--pct-touch PERCENT] [--pct-motion PERCENT]
              [--pct-trackball PERCENT] [--pct-syskeys PERCENT]
              [--pct-nav PERCENT] [--pct-majornav PERCENT]
              [--pct-appswitch PERCENT] [--pct-flip PERCENT]
              [--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]//事件百分比設置
              [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
              [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
              [--wait-dbg] [--dbg-no-events]
              [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
              [--port port]
              [-s SEED] [-v [-v] ...]//設置隨機數生成器的seed值
              [--throttle MILLISEC] [--randomize-throttle]//延時操作
              [--profile-wait MILLISEC]
              [--device-sleep-time MILLISEC]
              [--randomize-script]
              [--script-log]
              [--bugreport]
              [--periodic-bugreport]
              COUNT

3、當開始執行Monkey測試后,會順序輸出執行的事件流信息,如:

#執行的事件流信息
 #啟動App事件
 Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.geely.consumer/com.geely.market.deploy.activity.DevContainActivity;end
     // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.geely.consumer/com.geely.market.deploy.activity.DevContainActivity } in package com.geely.consumer
     // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.geely.consumer/com.geely.market.deploy.activity.DevContainActivity } in package com.geely.consumer
 #點擊事件
 :Sending Touch (ACTION_DOWN): 0:(308.0,2215.0)

輸出Monkey Log

跑monkey的時候或者想抓程序log導出時,有時會提示: cannot create D:monkeytest.txt: read-only file system

為什么有時候可以有時候不可以?后來發現跟使用使用習慣不一樣,一會是先進入adb shell 再用命令,一會是直接命令進入。

【注意】如果進入adb shell后再使用Monkey命令測試應用就會導致到處Monkey Log到本地失敗。【進入adb shell后就相當於進入安卓手機的linux原生系統的root下面,此時默認導出Monkey日志到手機,但是並沒有權限在手機里創建文件】

正確方法:退出shell或者執行命令時先不要進shell,而是直接使用adb shell monkey運行Monkey命令測試。【直接使用adb shell monkey命令可以導出Monkey日志到本地電腦中】

①命令重定向符,將其前面的命令的輸出結果重新定向到其后面的設備中去,后面的設備中的內容被覆蓋。

C:\Documents and Settings\Administrator>adb shell monkey -p 包名 -v 300 >e:\text.txt

②命令重定向符。將其前面的命令的輸出結果重新定向到其后面的設備中去,后面設備中的內容沒有被覆蓋。即追加輸出。

C:\Documents and Settings\Administrator>adb shell monkey -p 包名 -v 300 >> e:\text.txt

Monkey測試的停止條件

①如果限定了Monkey運行在一個或幾個特定的包上,那么它會監測試圖轉到其它包的操作,並對其進行阻止。

②如果應用程序崩潰或接收到任何失控異常,Monkey將停止並報錯。(前提在於沒有配置crash繼續執行的操作)

③如果應用程序產生了應用程序不響應(application not responding)的錯誤,Monkey將會停止並報錯。(前提在於沒有配置ANR繼續執行的操作)

強制退出Monkey測試

退出應用和拔掉數據線,都無法停止monkey測試,試圖用control+C 命令,控制台雖然能再次輸入命令,可是手機還是在繼續monkey命令。

網上大部分人認為monkey開始測試之后,就不能停止,除非時間數執行完成,或者在cmd窗口執行adb reboot來進行手機重啟操作。

如需停止monkey測試,輸入如下命令(用B站舉列子):

①開始執行Monkey測試

adb shell monkey -p tv.danmaku.bili --throttle 1000 500

②輸入control+C,控制台不再輸出執行的信息,可以再次輸入命令(但是手機還在跑Monkey命令)

③查看安卓手機中的monkey進程號:adb命令返回來的數字,即是monkey的進程號

adb shell ps | grep monkey

運行結果;

④如上圖17390就是安卓手機運行Monkey命令的進程號,可以運行kill 命令來殺死該進程:

adb shell kill 17390

⑤檢查安卓手機中的monkey進程是否已被殺死,即安卓手機不再繼續執行Monkey測試:

adb shell ps | grep monkey

Monkey測試結果分析

Monkey測試出現錯誤后,一般的查錯步驟為以下幾步:

1、初步分析方法:(錯誤重現)

①找到是monkey里面的哪個地方出錯。

②查看Monkey里面出錯前的一些事件動作,並手動執行該動作。

③若以上步驟還不能找出,可以使用之前執行的monkey命令再執行一遍,注意seed值要一樣(復現Monkey測試中出現的錯誤)

 2、一般的測試結果分析:

關鍵字查詢:當Monkey命令執行過程中遇到錯誤時,會輸出對應異常信息,關鍵字查詢:應用程序無響應(ANR)、崩潰(CRASH)、其他問題(Exception)

  • ANR:指當Android系統監測到應用程序在5秒內沒有響應輸入的事件或廣播在10秒內沒有執行完畢時拋出無響應彈窗提示

  • CRASH:應用程序出現錯誤時導致程序崩潰、異常停止或退出的情況

  • Exception:其他問題的一些問題

【理論上來講,當獲取到app在monkey測試過程中的CRASH和ANR日志信息后,開發人員就可以開始根據日志內容分析和定位問題了。】

① ANR問題:在日志文件中搜索“ANR”

②崩潰問題:在日志文件中搜索“Exception” 、“Force Close”

Monkey測試實例

1、允許啟動安卓設備或者模擬器里面所有的 App , 隨機操作 1000 次。

adb shell monkey 1000

2、打開嗶哩嗶哩應用,操作序列號為110,每個事件之間延遲500毫秒(就是0.5S),日志級別為一個V ,隨機執行1000個事件,該日志保存到桌面的test_monkey.txt文件中。

adb shell monkey -p tv.danmaku.bili -s 110 --throttle 500 -v 1000 >/Users/mac/Desktop/test_monkey.txt

3、monkey具備同時對多個安卓應用進行調試的能力,只需要增加多個 -p 包名字段就可以實現。

adb shell monkey -p com.miui.calculator -p com.android.thememanager 1000

4、各類隨機事件的輸入占比總和為百分之百。

adb shell monkey -p com.miui.cal —throttle 100 —-ignore-crashes —-ignore-timeouts --pct-touch 50 --pct-majornav 10 --pct-syskeys 20 --pct-appswitch 20 -v 1000 > ./monket_log.txt

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM