2012年10月9日 星期二

Android Automation Test for Stability by Monkey 中文版

English Version



在Android的作業系統中,有一隻猴子 (Monkey) 的程式。這個程式啟動後就會讓你的Android裝置像猴子一樣的活蹦亂跳,到處亂跑。

這樣的猴子特性剛好可以讓我們來對Android裝置做穩定性測試。事實上,這個猴子程式亂跑的範圍 (Scope) 與活力 (Interval) 及方向 (Event) 還是可以被規範的.以下讓我們來看看如何駕馭這隻猴子程式,讓這個猴子來幫助我們的產品開發。

猴子程式是甚麼 ?

在Android的官方自動化測試領域有兩隻猴子,一個稱做猴子跑步 (monkeyrunner),另一個就是我們在這要談的猴子 (Monkey)。這兩者的區別是,前者可以精準的控制Android裝置的行為。後者是藉由亂數產生的事件來對Android裝置做隨意且不可預期的操作。在目的上,monkeyrunner能用來做功能性驗證,與指定行為的穩定度測試。不同於monkeyrunner,Monkey可用於隨意的大量性操作來測試Android手機的整個性統或是指定應用程式(App)的穩定度。

為什麼用猴子來測試我們的產品 ?

每當我們完成一個產品,我們很希望能快點分享出去。但面對千千萬萬的使用者,無法了解每個人的操作習慣。在許多年輕的工程師,累積除錯的經驗尚未成熟前,又面臨產品計畫的時間壓力,常會忽略一些小細節。又或者是一個協同開發的大型複雜專案,整合管理出現漏洞時,但沒有人發現。這時候利用猴子程式來幫忙抓出可能性的錯誤是一個挺有效率的方式。

一個好品質的應用程式 (App)或是產品 (Android 裝置)即使在隨便亂操作的情況下,應該要能做出所有的防錯處理。程式崩潰 (Crash) 或是當機 (Lock up or Reboot)不應該出現。基於這樣的理由,使用monkey能讓我們所開發的產品能快速的讓潛在的問題浮現。

如何駕馭猴子(Monkey)程式

Monkey內存在Android裝置內,因此我們要使用猴子程式,可以透過ADB的方式對手機下Shell程式的指令。

adb shell monkey -v 500

以上這個指令會對Android裝置下達500個連續指令做隨意的操作。

以下表格說明使用參數去規範Monkey:

類別參數選項說明
一般--help顯示Monkey的相關用法。
-v每一個 -v 的參數在adb shell monkey之後,會增加執行中資訊。
只有一個-v的Monkey執行會提供少量的資訊。若有兩個-v (E.g. adb shell monkey -v -v),執行中會堤供較多的訊息,諸如獨自被傳送到你的App (Activity)的事件. 若有三個 -v ,執行中會提供更多像是設定的資訊等的訊息。
事件-s 亂數種子。用來產生亂數事件使用。若使用相同的亂數來執行monkey測試,他會產生相同的程序的事件。
--throttle 在每個事件執行後與下個事件產生的間隔時間。若不設定,每個事件無間隔時間。這個設定可用來緩和測試以避免系統硬體的效能不佳時,排除硬體效能因素所產生的問題。
--pct-touch 調整觸碰事件產生的發生率百分比。(觸碰事件是一個按壓下去與放開於螢幕同一個點的事件)
--pct-motion 調整移動的事件觸發發生率百分比。(這個事件是由一個點按壓下螢幕中的一個點並隨意滑動到另外一個座標位置再放開的事件)
--pct-trackball 調整軌跡球觸發事件。
--pct-nav 調整基本方向按鍵事件的發生率百分比。(方向事件包含上下左右)
--pct-majornav 調整主要的方向按鍵事件的發生百分比。(這些方向的事件一般都是在你的使用者介面有影響,例如五個方向按鍵、返回按鍵(Back)、或是選單按鍵等(Menu))
--pct-syskeys 調整系統按鍵觸發事件的發生率百分比。(例如家按鍵(Home、返回按鍵(Back)、發話按鍵(Start Call),斷話鍵(End Call), 或是聲音鍵(Volumn up/down))
--pct-appswitch 調整App (Activity)啟動的發生率百分比。(Monkey會透過startActivity()這個API呼叫Activity做為最大化測試涵蓋率到你要測試的包裝(package)的方法)
--pct-anyevent 調整其他型態的類別事件發生率的百分比。這是一個可以抓住所有其他型態的如按鍵壓下的事件,其他比較少使用在裝置上的事件等。
限制-p 限制monkey只測試指定的Packages. 若你要測試的Package會與其他的Package有關連,你必須一起指定這些Package來執行這項參數.若你無使用這個參數,Monkey會測試系統內所有的Package。要指定多個Package必須下達多個 -p,每個 -p 後面只能放一個Package。
-c
若你指定一個或多個分類(categories),Monkey將會只允許系統去探訪你所指定的分類的活動 ( Activity )。若你沒有指定分類,monkey會選取所有列在分類為 Intent.CATEGORY_LAUNCHER 或 Intent.CATEGORY_MONKEY 的活動( activities )。指定多個分類要多次使用 -c 參數,每一個參數只能指定一個分類。
除錯--dbg-no-events當指定這個參數,Monkey將操作測試活動 ( activity ) 初始化執行,但將不會產生任何進一步的事件。最佳的結果是與 -v 參數結合使用一個或多個包裝( Package )的限制與一個非零值的 throttle 參數以保持Monkey持續執行超過30秒。這提供一個可以觀察被應用程式呼叫的包裝 ( Package ) 的資訊交換 ( Package ) 的環境
--hprof若設定了這個參數,將會於Monkey事件程序的前與後立即產生問題發生特徵的報告,這將會產生近5Mb的檔案於Android裝置內的data/misc資料夾。必須小心使用。可查詢Traceview取得更多的資訊。
--ignore-crashes一般來說,當應用程式遭遇到任何類型的應用程式崩潰( Crash )或無法掌控的例外( unhandled exception )問題monkey會停下來。這些錯誤像是應用程式無回應Application Not Responding)的對話框。若你使用了這個參數,Monkey會持續的傳送事件直到你所設定的參數數量完成。
--ignore-timeouts一般來說,當應用程式遭遇到任何類型的到期(timeout)問題,monkey會停下來。這些錯誤像是應用程式無回應( Application Not Responding)的對話框。若你使用了這個參數,Monkey會持續的傳送事件直到你所設定的參數數量完成。
--ignore-security-exceptions一般來說,當應用程式遭遇到任何類型的權限問題monkey會停下來。舉例來說,如果你嘗試去喚起一個需要某些權限的活動( Activity )就會遇到這樣的情形。若你使用了這個參數,Monkey會持續的傳送事件直到你所設定的參數數量完成。
--kill-process-after-error一般來說,當Monkey因為錯誤(Error)停止,應用程式的錯誤會留在畫面上。若這個參數被設定於monkey中,牠會發出信號去停止有問題的程序( Process )。注意,一個正常的或成功的完成,被執行的程序不會被停止,裝置只是簡單的留在最後一個事件發生後的狀態。
--monitor-native-crashes等待並且報告Android系統的native源碼損毀發生。若有設定 --kill-process-after-error 參數,系統將會停止monkey測試。
--wait-dbg重執行中停止monkey直到除錯器(debugger)連接到裝置。
範例:

adb shell "monkey -s 1 --throttle 100 -v -v -v --ignore-crashes --ignore-timeouts --ignore-security-exceptions 99999999"
在這個例子中,主要是希望能夠發現有甚麼方法會造成手機當機或重新開機的現象。設定為亂數種子為1,每個事件發生的間隔時間為100毫秒,忽略App的損毀 ( Crash )問題,忽略ANR的問題,忽略因為應用程式權限不足導致跳出Monkey的問題,執行99999999個事件。


在Android官網上還有兩個參數我們看不到說明,以下我對這兩個參數做說明:

限制--pkg-blacklist-file限制monkey不測試紀錄於文字檔案內的Packages,若你無使用這個參數,Monkey會測試系統內所有的Package。要指定多個Package不被執行必須在文字檔案內紀錄所有不要測試的Packages名稱,文字檔案內每一行只能放一個Package。
--pkg-whitelist-file限制monkey只測試於指向的文字檔案的指定的Packages. 若你要測試的Package會與其他的Package有關連,你必須一起指定這些Package來執行這項參數.若你無使用這個參數,Monkey會測試系統內所有的Package。要指定多個Package必須在文字檔案內紀錄所有要測試的Packages名稱,文字檔案內每一行只能放一個Package。

範例:
adb shell "monkey -v --pkg-blacklist-file /data/local/tmp/blacklist.txt 500"

其中blacklist.txt的內容為
com.google.android.apps.maps
com.android.launcher

在這個範例中,monkey的執行不會執行Google Map與Launcher。特別的是,因為我們設定Launcher在黑名單中 ( blacklist.txt ) ,畫面有可能會持續停留在上鎖的畫面且持續的進行monkey測試。直到500個事件發生完畢,monkey才會停止。



參考資料
UI/Application Exerciser Monkey, http://developer.android.com/tools/help/monkey.html

10 則留言: