Monkey 工具之使用

      公司由於在android的投入加大,很多android下的app項目,以前版本發佈後發現存在一定的性能瓶頸,因此性能測試研究提上了議事日程。

      一、android性能測試理論:

        android性能測試和web性能測試有很大的區別,Web性能測試目前很大一部分都是在一定的併發量的情況下,驗證軟件是否存在性能瓶頸;android平臺下app的性能測試主要是對app輸入的事件流,驗證app在多事件流時是否正常,裏面包含的穩定性比較大。手機終端軟件的性能測試,主要針對手機終端軟件本身的性能測試,終端軟件性能測試主要分爲終端軟件運行速度、終端軟件運行資源消耗、終端功耗、終端網絡流量等方面,運用第三方的一些工具,監控軟件在運行特定的業務的場景時手機資源消耗情況,現在重點介紹一下市場主流測試工具Monkey。


    二、Monkey基本用法:

      Monkey是一個命令行工具,可以運行在模擬器裏或實際設備中,它是一種輕量級的性能測試工具。它向系統發送僞隨機的事件流,實現對正在運行的應用程序進行壓力測試。Monkey包括許多選項,它們大致分爲四類:

      1、基本配置選項,如設置嘗試的事件數量。

      2、運行約束選項,如設置只對單獨的一個包進行測試

      3、事件類型和頻率

      4、調試選項


在Monkey運行的時候,它生成事件,並把它們發給系統。同時,Monkey還對測試中的系統進行監測,對下列三種情況進行特殊處理:

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

· 如果應用程序崩潰或接收到任何失控異常,Monkey將停止並報錯。

· 如果應用程序產生了應用程序不響應(application not responding)的錯誤,Monkey將會停止並報錯。

按照選定的不同級別的反饋信息,在Monkey中還可以看到其執行過程報告和生成的事件。


Monkey基本用法:

可以通過開發機器上的命令行或腳本來啓動Monkey。由於Monkey運行在模擬器/設備環境中,所以必須用其環境中的shell來進行啓動。可以通過在每條命令前加上adb shell來達到目的,也可以進入Shell後直接輸入Monkey命令。基本語法如下:

$ adb shell monkey [options]

如果不指定options,Monkey將以無反饋模式啓動,並把事件任意發送到安裝在目標環境中的全部包。下面是一個更爲典型的命令行示例,它啓動指定的應用程序,並向其發送500個僞隨機事件:

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

 

命令選項參考

下表中列出了Monkey命令行可用的全部選項。

類別
選項
說明

常規
--help
列出簡單的用法。

-v
命令行的每一個-v將增加反饋信息的級別。Level 0(缺省值)除啓動提示、測試完成和最終結果之外,提供較少信息。Level 1提供較爲詳細的測試信息,如逐個發送到Activity的事件。Level 2提供更加詳細的設置信息,如測試中被選中的或未被選中的Activity。

事件
-s <seed>
僞隨機數生成器的seed值。如果用相同的seed值再次運行Monkey,它將生成相同的事件序列。

--throttle <milliseconds>
在事件之間插入固定延遲。通過這個選項可以減緩Monkey的執行速度。如果不指定該選項,Monkey將不會被延遲,事件將盡可能快地被產成。

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

--pct-motion <percent>
調整動作事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的僞隨機事件和一個up事件組成)。

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

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

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

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

--pct-appswitch <percent>
調整啓動Activity的百分比。在隨機間隔裏,Monkey將執行一個startActivity()調用,作爲最大程度覆蓋包中全部Activity的一種方法。

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

約束限制
-p <allowed-package-name>
如果用此參數指定了一個或幾個包,Monkey將只允許系統啓動這些包裏的Activity。如果你的應用程序還需要訪問其它包裏的Activity(如選擇取一個聯繫人),那些包也需要在此同時指定。如果不指定任何包,Monkey將允許系統啓動全部包裏的Activity。要指定多個包,需要使用多個 -p選項,每個-p選項只能用於一個包。

-c <main-category>
如果用此參數指定了一個或幾個類別,Monkey將只允許系統啓動被這些類別中的某個類別列出的Activity。如果不指定任何類別,Monkey將選 擇下列類別中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多個類別,需要使用多個-c選項,每個-c選 項只能用於一個類別。

調試
--dbg-no-events
設置此選項,Monkey將執行初始啓動,進入到一個測試Activity,然後不會再進一步生成事件。爲了得到最佳結果,把它與-v、一個或幾個包約 束、以及一個保持Monkey運行30秒或更長時間的非零值聯合起來,從而提供一個環境,可以監視應用程序所調用的包之間的轉換。

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

--ignore-crashes
通常,當應用程序崩潰或發生任何失控異常時,Monkey將停止運行。如果設置此選項,Monkey將繼續向系統發送事件,直到計數完成。

--ignore-timeouts
通常,當應用程序發生任何超時錯誤(如“Application Not Responding”對話框)時,Monkey將停止運行。如果設置此選項,Monkey將繼續向系統發送事件,直到計數完成。

--ignore-security-exceptions
通常,當應用程序發生許可錯誤(如啓動一個需要某些許可的Activity)時,Monkey將停止運行。如果設置了此選項,Monkey將繼續向系統發送事件,直到計數完成。

--kill-process-after-error
通常,當Monkey由於一個錯誤而停止時,出錯的應用程序將繼續處於運行狀態。當設置了此選項時,將會通知系統停止發生錯誤的進程。注意,正常的(成功的)結束,並沒有停止啓動的進程,設備只是在結束事件之後,簡單地保持在最後的狀態。

--monitor-native-crashes
監視並報告Android系統中本地代碼的崩潰事件。如果設置了--kill-process-after-error,系統將停止運行。

--wait-dbg
停止執行中的Monkey,直到有調試器和它相連接


實例,通過上面的講解後,使用命令行來運行,結果如下:

monkey -p com.android.easou -c android.intent.category.LAUNCHER -v 500
:Monkey: seed=0 count=500
:AllowPackage: com.android.easou
:IncludeCategory: android.intent.category.LAUNCHER
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 15.0%
//   3: 25.0%
//   4: 15.0%
//   5: 2.0%
//   6: 2.0%
//   7: 1.0%
//   8: 15.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCH
ER;launchFlags=0x10000000;component=com.android.easou/.EasouSearchActivity;end
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.categ
ory.LAUNCHER] cmp=com.android.easou/.EasouSearchActivity } in package com.android.easou
:Sending Pointer ACTION_MOVE x=-4.0 y=2.0
:Sending Pointer ACTION_UP x=0.0 y=0.0
:Sending Pointer ACTION_DOWN x=47.0 y=122.0
:Sending Pointer ACTION_UP x=29.0 y=129.0
:Sending Pointer ACTION_DOWN x=15.0 y=99.0
:Sending Pointer ACTION_UP x=15.0 y=99.0
:Sending Pointer ACTION_DOWN x=55.0 y=63.0
    // Rejecting start of Intent { act=android.intent.action.VIEW dat=http://ad3.easou.com
:8080/j10ad/ea2.jsp?channel=2&cid=bkcn3510_&key=jarw.+%E8%BD%BD%E6%89%8B+AT%27s+a%3A%28..%
E6%9C%BA%E7%94%B5%E8%A7%86+x cmp=com.android.browser/.BrowserActivity } in package com.and
roid.browser
:Sending Pointer ACTION_UP x=50.0 y=53.0
:Sending Pointer ACTION_MOVE x=-5.0 y=3.0
:Sending Pointer ACTION_MOVE x=0.0 y=-5.0
    // Rejecting start of Intent { act=android.intent.action.MAIN cat=[android.intent.cate
gory.HOME] cmp=com.android.launcher/.Launcher } in package com.android.launcher
:Sending Pointer ACTION_DOWN x=74.0 y=41.0
:Sending Pointer ACTION_UP x=74.0 y=41.0
:Sending Pointer ACTION_MOVE x=3.0 y=-2.0
:Sending Pointer ACTION_UP x=0.0 y=0.0
:Sending Pointer ACTION_MOVE x=-4.0 y=2.0
    // Sending event #100
:Sending Pointer ACTION_MOVE x=4.0 y=2.0
:Sending Pointer ACTION_DOWN x=69.0 y=310.0
:Sending Pointer ACTION_UP x=82.0 y=-10.0
:Sending Pointer ACTION_MOVE x=0.0 y=-1.0
:Sending Pointer ACTION_DOWN x=54.0 y=79.0
:Sending Pointer ACTION_UP x=54.0 y=79.0
:Sending Pointer ACTION_DOWN x=118.0 y=197.0
:Sending Pointer ACTION_UP x=119.0 y=193.0
:Sending Pointer ACTION_DOWN x=137.0 y=38.0
:Sending Pointer ACTION_UP x=124.0 y=49.0
:Sending Pointer ACTION_DOWN x=18.0 y=83.0
:Sending Pointer ACTION_UP x=33.0 y=83.0
:Sending Pointer ACTION_MOVE x=-5.0 y=-5.0
    // Sending event #200
    // Sending event #200
:Sending Pointer ACTION_MOVE x=3.0 y=2.0
:Sending Pointer ACTION_UP x=0.0 y=0.0
:Sending Pointer ACTION_DOWN x=146.0 y=307.0
:Sending Pointer ACTION_UP x=146.0 y=307.0
:Sending Pointer ACTION_DOWN x=58.0 y=305.0
:Sending Pointer ACTION_UP x=58.0 y=305.0
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCH
ER;launchFlags=0x10000000;component=com.android.easou/.EasouSearchActivity;end
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.categ
ory.LAUNCHER] cmp=com.android.easou/.EasouSearchActivity } in package com.android.easou
:Sending Pointer ACTION_DOWN x=163.0 y=3.0
:Sending Pointer ACTION_UP x=163.0 y=3.0
:Sending Pointer ACTION_MOVE x=0.0 y=4.0
:Sending Pointer ACTION_DOWN x=131.0 y=305.0
:Sending Pointer ACTION_UP x=131.0 y=305.0
:Sending Pointer ACTION_MOVE x=1.0 y=0.0
    // Allowing start of Intent { cmp=com.android.easou/.SetActivity } in package com.andr
oid.easou
:Sending Pointer ACTION_DOWN x=0.0 y=293.0
    // Allowing start of Intent { cmp=com.android.easou/.SearchSetActivity } in package co
m.android.easou
:Sending Pointer ACTION_UP x=0.0 y=293.0
:Sending Pointer ACTION_MOVE x=1.0 y=-1.0
:Sending Pointer ACTION_MOVE x=-4.0 y=-1.0
    // Rejecting start of Intent { act=android.intent.action.CALL_BUTTON cmp=com.android.c
ontacts/.DialtactsActivity } in package com.android.contacts
:Sending Pointer ACTION_DOWN x=188.0 y=34.0
:Sending Pointer ACTION_UP x=188.0 y=34.0
:Sending Pointer ACTION_MOVE x=2.0 y=-4.0
    // Sending event #300
    // Rejecting start of Intent { act=android.intent.action.MAIN cat=[android.intent.cate
gory.HOME] cmp=com.android.launcher/.Launcher } in package com.android.launcher
:Sending Pointer ACTION_MOVE x=-3.0 y=4.0
:Sending Pointer ACTION_DOWN x=164.0 y=211.0
:Sending Pointer ACTION_UP x=164.0 y=211.0
:Sending Pointer ACTION_DOWN x=83.0 y=258.0
:Sending Pointer ACTION_UP x=83.0 y=258.0
:Sending Pointer ACTION_MOVE x=-2.0 y=3.0
:Sending Pointer ACTION_MOVE x=2.0 y=-1.0
:Sending Flip keyboardOpen=false
:Sending Pointer ACTION_DOWN x=193.0 y=137.0
:Sending Pointer ACTION_UP x=178.0 y=139.0
:Sending Pointer ACTION_DOWN x=215.0 y=131.0
:Sending Pointer ACTION_UP x=215.0 y=131.0
:Sending Pointer ACTION_MOVE x=2.0 y=-3.0
:Sending Pointer ACTION_DOWN x=9.0 y=305.0
:Sending Pointer ACTION_UP x=9.0 y=305.0
:Sending Pointer ACTION_DOWN x=233.0 y=176.0
:Sending Pointer ACTION_UP x=232.0 y=185.0
:Sending Pointer ACTION_DOWN x=225.0 y=316.0
:Sending Pointer ACTION_UP x=225.0 y=316.0
    // Sending event #400
:Sending Pointer ACTION_MOVE x=4.0 y=3.0
:Sending Pointer ACTION_DOWN x=12.0 y=310.0
:Sending Pointer ACTION_UP x=12.0 y=310.0
:Sending Pointer ACTION_MOVE x=2.0 y=-1.0
:Sending Pointer ACTION_DOWN x=129.0 y=234.0
:Sending Pointer ACTION_UP x=129.0 y=234.0
:Sending Pointer ACTION_DOWN x=45.0 y=292.0
:Sending Pointer ACTION_UP x=45.0 y=292.0
:Sending Pointer ACTION_MOVE x=2.0 y=2.0
:Sending Pointer ACTION_DOWN x=219.0 y=139.0
:Sending Pointer ACTION_UP x=219.0 y=139.0
:Sending Pointer ACTION_MOVE x=-4.0 y=1.0
:Sending Pointer ACTION_DOWN x=217.0 y=224.0
:Sending Pointer ACTION_UP x=217.0 y=224.0
:Sending Pointer ACTION_DOWN x=64.0 y=5.0
:Sending Pointer ACTION_UP x=64.0 y=6.0
:Sending Pointer ACTION_MOVE x=1.0 y=3.0
:Sending Pointer ACTION_MOVE x=-2.0 y=-3.0
Events injected: 500
:Dropped: keys=0 pointers=2 trackballs=0 flips=0
## Network stats: elapsed time=21118ms (0ms mobile, 0ms wifi, 21118ms not connected)
// Monkey finished

    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章