天天看點

Android自動化測試手段之Monkey(adb shell monkey)

android monkey源碼下載下傳見:http://fanfq.iteye.com/blog/781694

Monkeyrunner在這裡:http://www.51testing.com/html/59/n-242759.html

=======================================================

        Monkey測試是Android自動化測試的一種手段,Monkey測試本身非常簡單,就是模拟使用者的按鍵輸入,觸摸屏輸入,手勢輸入等,看裝置多長時間會出異常。

當Monkey程式在模拟器或裝置運作的時候,如果使用者出發了比如點選,觸摸,手勢或一些系統級别的事件的時候,它就會産生随機脈沖,是以可以用Monkey用随機重複的方法去負荷測試你開發的軟體.

最簡單的方法就是用用下面的指令來使用Monkey,這個指令将會啟動你的軟體并且觸發500個事件.

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

Monkey是一個指令行工具,可以運作在模拟器裡或實際裝置中。它向系統發送僞随機的使用者事件流,實作對正在開發的應用程式進行壓力測試。Monkey包括許多選項,它們大緻分為四大類:

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

• 運作限制選項,如設定隻對單獨的一個包進行測試。

• 事件類型和頻率。

• 調試選項。

在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 ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]

[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]

[--ignore-crashes] [--ignore-timeouts]

[--ignore-security-exceptions] [--monitor-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]

[--wait-dbg] [--dbg-no-events] [-f scriptfile]

[--port port]

[-s SEED] [-v [-v] ...] [--throttle MILLISEC]

COUNT

講了這麼多,好像很枯燥,很難懂,即使看完了選項也不知道如何使用。

首先我們應該明白我們不可能使用monkey來制定做一樣測試,重複做很多次,因為monkey是僞随機的,就是說雖然有一定規律可循,但是并不是我們就可以指定動作,但是我們可以通過添加指令選項來将操作限制在一定的範圍内。

monkey -v -p com.android.camera --throttle 5000 --pct-anyevent 100 500

這條指令的解釋是:

-v顯示預設程度的資訊;

-p com.android.camera是指定測試的程式,// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.camera/.Camera } in package com.android.camera這是開始測試的camera的内容;

--throttle 5000 設定延時;

--pct-anyevent 100設定啟動activity的百分比為100%。如果沒有指定,我們可以看到在開始執行的時候8個事件(上面的選項中有介紹)的百分比如下:

# monkey -v -p com.android.camera --throttle 5000 500

monkey -v -p com.android.camera --throttle 5000 500

:Monkey: seed=0 count=500

:AllowPackage: com.android.camera

:IncludeCategory: android.intent.category.LAUNCHER

:IncludeCategory: android.intent.category.MONKEY

// 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%

指定事件之後

# monkey -v -p com.android.camera --throttle 5000 --pct-anyevent 100 500

monkey -v -p com.android.camera --throttle 5000 --pct-anyevent 100 500

:Monkey: seed=0 count=500

:AllowPackage: com.android.camera

:IncludeCategory: android.intent.category.LAUNCHER

:IncludeCategory: android.intent.category.MONKEY

// Event percentages:

//   0: 0.0%

//   1: 0.0%

//   2: 0.0%

//   3: 0.0%

//   4: 0.0%

//   5: 0.0%

//   6: 0.0%

//   7: 0.0%

//   8: 100.0%

最後count就是事件數設定為500

接下來看一個執行個體

Monkey的用法是$ adb shell monkey -p your.package.name -v 500 ,首先,我們要找到應用程式在Emulator中所對應的包名,我一開始是一個個目錄找得,前7步完成了這項工作,最終發現應用程式包都在data/data下,你可以在shell中cd data/data,然後ls檢視目前Emulator中的所有應用程式包。

假如我們想對SDK中的APIDemos做壓力測試,

1.在Eclipse中建立工程,将: \android-sdk-windows\samples\android-8\samples\ApiDemos添加到工程中點選運作,此時,他的APK應該加載到了Emulator上

2.在指令行輸入adb shell

3.輸入ls檢視目前檔案夾下的目錄,執行結果如下

C:\Documents and Settings\fanfq>adb shell

# ls

ls

config

cache

sdcard

acct

mnt

d

etc

system

sys

sbin

proc

init.rc

init.goldfish.rc

init

default.prop

data

root

dev

4.應用程式包都在data下,我們輸入cd data進入data檔案夾,如下

# cd data

cd data

5.輸入ls檢視檔案夾下的内容,如下所示:

# ls

ls

backup

property

data

misc

local

app-private

dontpanic

system

app

dalvik-cache

lost+found

6.還有個data,所有的應用程式就在這個data下了,進入這個data,然後輸入ls如下:

# cd data

cd data

# ls

ls

com.android.fallback

com.android.providers.settings

com.android.inputmethod.pinyin

com.android.launcher

com.android.providers.telephony

com.android.providers.contacts

com.android.providers.downloads

com.android.email

com.android.alarmclock

com.android.mms

com.example.android.apis

com.android.settings

com.android.inputmethod.latin

com.android.providers.userdictionary

com.android.music

com.android.camera

com.android.certinstaller

android.tts

com.svox.pico

com.android.browser

com.android.providers.applications

com.android.netspeed

com.android.gallery

com.android.htmlviewer

com.android.customlocale

com.android.term

com.android.providers.media

com.android.wallpaper.livepicker

com.android.providers.drm

com.android.speechrecorder

com.android.server.vpn

com.android.packageinstaller

com.android.protips

com.android.development

com.android.defcontainer

com.android.carhome

com.android.cardock

com.android.calculator2

com.android.spare_parts

jp.co.omronsoft.openwnn

com.android.sdksetup

com.android.contacts

com.android.soundrecorder

com.android.providers.subscribedfeeds

com.android.phone

7.最後一個就是我們剛才加載的APIDemo的應用程式包

8.可以直接輸入monkey -p com.example.android.apis -v 50,結果如下,也可以退出shell,在指令行輸入,adb shell monkey -p com.example.android.apis -v 500 ,運作過程中,Emulator中的應用程式在不斷地切換畫面,可以看一下,呵呵

Android自動化測試手段之Monkey(adb shell monkey)

# monkey -p com.example.android.apis -v 50

monkey -p com.example.android.apis -v 50

:Monkey: seed=0 count=50

:AllowPackage: com.example.android.apis

:IncludeCategory: android.intent.category.LAUNCHER

:IncludeCategory: android.intent.category.MONKEY

// 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.categ

ory.LAUNCHER;launchFlags=0x10000000;component=com.example.android.apis/.ApiDemos

;end

// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.android.apis/.ApiDemos } in package com.

example.android.apis

:Sending Pointer ACTION_MOVE x=-4.0 y=2.0

:Sending Pointer ACTION_UP x=0.0 y=0.0

// Allowing start of Intent { cmp=com.example.android.apis/.ApiDemos } in pa

ckage com.example.android.apis

:Sending Pointer ACTION_DOWN x=207.0 y=282.0

:Sending Pointer ACTION_UP x=189.0 y=289.0

// Allowing start of Intent { cmp=com.example.android.apis/.app.Intents } in

package com.example.android.apis

:Sending Pointer ACTION_DOWN x=95.0 y=259.0

:Sending Pointer ACTION_UP x=95.0 y=259.0

:Sending Pointer ACTION_DOWN x=295.0 y=223.0

:Sending Pointer ACTION_UP x=290.0 y=213.0

:Sending Pointer ACTION_MOVE x=-5.0 y=3.0

:Dropped: keys=0 pointers=0 trackballs=0 flips=0

## Network stats: elapsed time=3799ms (3799ms mobile, 0ms wifi, 0ms not connecte

d)

// Monkey finished

此文檔居然有被翻譯成英文版的,http://www.codeweblog.com/the-android-monkey-automated-testing-tools/