20170209整理
很抱歉,文檔里的圖片都未能copy過來。。。
Monkey術(shù)語叫“猴子測試”,是指沒有測試經(jīng)驗的人進(jìn)行的測試是毫無目的,亂按亂點。
Monkey是Android系統(tǒng)自帶的一個命令行測試工具。通過monkey用隨機重復(fù)的方法對應(yīng)用程序進(jìn)行一些穩(wěn)定性,健壯性方面的測試,是一種快速有效的測試方法。
Monkey測試本身非常簡單,就是模擬用戶的按鍵輸入,觸摸屏輸入,手勢輸入等,看設(shè)備多長時間會出異常。原理就是向被測試的程序發(fā)送偽隨機的用戶事件流。
一. 初步分析方法:
Monkey測試出現(xiàn)錯誤后,一般的差錯步驟為以下幾步:
1、 找到是monkey里面的哪個地方出錯
2、 查看Monkey里面出錯前的一些事件動作,并手動執(zhí)行該動作
3、 若以上步驟還不能找出,可以使用之前執(zhí)行的monkey命令再執(zhí)行一遍,注意seed值要一樣。
一般的測試結(jié)果分析:1、 ANR問題:在日志中搜索“ANR”
2、 崩潰問題:在日志中搜索“Exception”
二. 詳細(xì)分析monkey日志:
將執(zhí)行Monkey生成的log,從手機中導(dǎo)出并打開查看該log;在log的最開始都會顯示Monkey執(zhí)行的seed值、執(zhí)行次數(shù)和測試的包名。首先我們需要查看Monkey測試中是否出現(xiàn)了ANR或者異常,具體方法如上述。然后我們要分析log中的具體信息,方法如下:查看log中第一個Switch,主要是查看Monkey執(zhí)行的是那一個Activity,譬如下面的log中,執(zhí)行的是 com.tencent.smtt.SplashActivity,在下一個swtich之間的,如果出現(xiàn)了崩潰或其他異常,可以在該Activity中查找問題的所在。:Switch:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.tencent.smtt/.SplashActivity
具體問題將在后面詳細(xì)分析。
1. 執(zhí)行monkey都需要什么基礎(chǔ)玩意呢?
因為Monkey是個命令行執(zhí)行的,所以我們需要執(zhí)行工具
這個工具叫adb.exe,那么adb如何執(zhí)行呢?當(dāng)然是cmd.exe!
Cmd.exe 里執(zhí)行 adb shell 查看本機是否有adb.
推薦綁定環(huán)境變量。
比如我的地址是:
D:/tools/adt-bundle-windows-x86_64-20140702/sdk/platform-tools
將此右擊 “我的電腦”à “屬性”à “高級設(shè)置”à “環(huán)境變量”
Path里加入上面地址。
然后cmd,輸入adb.exe試試吧,一定要重新打開cmd。
2. 運行adb sheel monkey
在cmd里運行:adb shell monkey
這是沒有虛擬機或者沒有連接設(shè)備。
當(dāng)你連接設(shè)備后出下面提示:
我想查看當(dāng)前手機都裝了什么軟件?
步驟:
1. adb shell
2. su root
3. cd data
4. cd data
5. ls
將列出所有安裝的軟件的包名!爽吧?
悲催的事1:運行su root的時候:
pc進(jìn)入android手機shell需要root權(quán)限(su: notfound)
“網(wǎng)上說,因為操作系統(tǒng)本來就沒有添加root用戶,需要下載一個一鍵root來生成root用戶;下了個,安裝后,運行一鍵root;再運行 su,果然好使了,變成 #了。”
3. 簡單的monkey測試---測試日歷程序
前文書說過我查看手機都裝啥軟件的時候提示我shell命里需要root權(quán)限。
Monkey是不需要root權(quán)限的,可以直接用。
我已知日歷程序的包名是:com.android.calendar
輸入:adb shell monkey –p com.android.calendar 100
如圖:
在你的設(shè)備上將看到:日歷被啟動,噼里啪啦的一頓亂變!并在測試后停到最終頁面。
如圖:
4. 如何查看monkey執(zhí)行過程信息?
通過 –v 參數(shù)。
通過-v參數(shù)可以指定打印信息的詳細(xì)級別,多一個-v多一個級別!
級別 | 表示 | 描述 |
0 | -v | 打印最基本的事件 |
1 | -v-v | 更全面的信息,如增加了那些Activity被選中 |
2 | -v-v-v | 最全面的信息 |
舉例:
還是日歷程序,我們看看-v都返回了什么信息。
Cmd輸入: adb shell monkey -v -p com.android.calendar 100
結(jié)果如圖:
具體解讀:
1. Seed字段
我們剛才執(zhí)行monkey時,沒有指定seed,在報告一開始,可以看到其自動生成的seed值,如果我們指定了seed,則可以使用相同的seed來生成相同的序列。注意:不能完全重復(fù)上次操作,但是具體操作事件是相同的。比如點擊->向左拖動->釋放這幾個事件這是相同的,但具體涉及的坐標(biāo)是不相同的。
2. AllowPackage字段
只允許com.android.calendar包中的Activity(活動)
3. IncludeCategory字段
啟動的意圖
4. 本次偽隨機事件中各種類型的事件比例
這里將事件分為了10種類型,分別為:
0:觸摸事件百分比,即參數(shù)--pct-touch
1:滑動事件百分比,即參數(shù)--pct-motion
2:縮放事件百分比,即參數(shù)--pct-pinchzoom
3:軌跡球事件百分比,即參數(shù)--pct-trackball
4:屏幕旋轉(zhuǎn)事件百分比,
5:基本導(dǎo)航事件百分比,即參數(shù)--pct-nav
6:主要導(dǎo)航事件百分比,即參數(shù)--pct-majornav
7:系統(tǒng)事件百分比,即參數(shù)--pct-syskeys
8:Activity啟動事件百分比,即參數(shù)--pct-appswitch
9:鍵盤翻轉(zhuǎn)事件百分比,即參數(shù)--pct-flip
10:其他事件百分比,即參數(shù)--pct-anyevent
更為具體的類型信息,可以查看查看Monkey源碼中
5. Switch
表示跳轉(zhuǎn)到com.android.calendar里的AllInOneActivity里。
6. //Allowing start of Intent
表示允許啟動這個活動意圖。
7. Sleeping
允許在發(fā)送各種隨機事件時有一個延時。如果沒有表示立即執(zhí)行,不停頓。
8. Sending:
具體執(zhí)行的隨機事件。
9. injected
執(zhí)行100次具體事件
10. rotation
屏幕旋轉(zhuǎn)信息,角度和是否保持旋轉(zhuǎn)狀態(tài)。
11. Dropped
丟棄的事件。
12. 網(wǎng)絡(luò)耗時
包括:手機占用的,wifi占用的,連接占用的。
5. 如何查看anr,崩潰問題?
在注意查找日志中的無響應(yīng)問題和崩潰問題。
無響應(yīng)問題可以在日志中搜索 “ANR”,崩潰問題搜索 “CRASH”,內(nèi)存泄露問題搜索"GC"(需進(jìn)一步分析),異常問題搜索 “Exception”(如果出現(xiàn)空指針, NullPointerException,需格外重視)。
6. Monkey各類事件(參數(shù))
常規(guī)--help列出簡單的用法。-v命令行的每一個-v將增加反饋信息的級別。Level 0(缺省值)除 啟動提示、測試完成和最終結(jié)果之外,提供較少信息。Level 1提供較為詳細(xì)的測試信息,如逐個發(fā)送到Activity的 事件。Level 2提供更加詳細(xì)的設(shè)置信息,如測試中被選中的或未被選中的Activity。事件-s <seed>偽隨機數(shù)生成器的seed值。如果用相同的seed值再次運行Monkey, 它將生成相同的事件序列。
例子:
adb shell monkey -v -p com.android.calendar –s 404 100
如果兩次執(zhí)行,那么事件相同。--throttle <milliseconds>在事件之間插入固定延遲。通過這個選項可以減緩Monkey的執(zhí)行速度。如果不指定該選項,Monkey將 不會被延遲,事件將盡可能快地被產(chǎn)成。例子:
adb shell monkey -v -p com.android.calendar –throttle 1000 100
表示每次事件間隔1秒。
--pct-touch <percent>調(diào)整觸摸事件的百分比(觸摸事件是一個down-up事件,它發(fā)生在屏幕上的某單一 位置)。--pct-motion <percent>調(diào)整動作事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的偽隨機事 件和一個up事件組成)。--pct-trackball <percent>調(diào)整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)。--pct-nav <percent>調(diào)整“基本”導(dǎo)航事件的百分比(導(dǎo)航事件由來自方向輸入 設(shè)備的up/down/left/right組成)。--pct-majornav <percent>調(diào)整“主要”導(dǎo)航事件的百分比(這些導(dǎo)航事件通常引發(fā)圖 形界面中的動作,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵)--pct-syskeys <percent>調(diào)整“系統(tǒng)”按鍵事件的百分比(這些按鍵通常被保留,由 系統(tǒng)使用,如Home、Back、StartCall、End Call及音量控制鍵)。--pct-appswitch <percent>調(diào)整啟動Activity的百分比。在隨機間隔里,Monkey將執(zhí)行一個startActivity()調(diào) 用,作為最大程度覆蓋包中全部Activity的一種方法。--pct-anyevent <percent>調(diào)整其它類型事件的百分比。它包羅了所有其它類型的事件,如:按鍵、其它不常用的設(shè)備按鈕、等等。約束限制-p <allowed-package-name>如果用此參數(shù)指定了一個或幾個包,Monkey將只允許系統(tǒng)啟動這些包里的Activity。 如果你的應(yīng)用程序還需要訪問其它包里的Activity(如選擇取一個聯(lián)系人),那些包也需要在此 同時指定。如果不指定任何包,Monkey將允許系統(tǒng)啟動全部包里的Activity。要指定多個 包,需要使用多個 -p選項,每個-p選項只能用于一個包。-c <main-category>如果用此參數(shù)指定了一個或幾個類別,Monkey將只允許系統(tǒng)啟動被這些類別中的某個類別列出的Activity。 如果不指定任何類別,Monkey將選 擇下列類別中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多 個類別,需要使用多個-c選項,每個-c選 項只能用于一個類別。調(diào)試--dbg-no-events設(shè)置此選項,Monkey將執(zhí)行初始啟動,進(jìn)入到一個測試Activity,然后不 會再進(jìn)一步生成事件。為了得到最佳結(jié)果,把它與-v、一個或幾個包約 束、以及一個保持Monkey運 行30秒或更長時間的非零值聯(lián)合起來,從而提供一個環(huán)境,可以監(jiān)視應(yīng)用程序所調(diào)用的包之間的轉(zhuǎn)換。--hPRof設(shè)置此選項,將在Monkey事件序列之前和之后立即生成profiling報告。 這將會在data/misc中生成大文件(~5Mb),所以要小心使用它。--ignore-crashes通常,當(dāng)應(yīng)用程序崩潰或發(fā)生任何失控異常時,Monkey將停止運行。如果設(shè)置此選項,Monkey將 繼續(xù)向系統(tǒng)發(fā)送事件,直到計數(shù)完成。--ignore-timeouts通常,當(dāng)應(yīng)用程序發(fā)生任何超時錯誤(如“application Not Responding”對 話框)時,Monkey將停止運行。如果設(shè)置此選項,Monkey將繼 續(xù)向系統(tǒng)發(fā)送事件,直到計數(shù)完成。--ignore-security-exceptions通常,當(dāng)應(yīng)用程序發(fā)生許可錯誤(如啟動一個需要某些許可的Activity)時,Monkey將 停止運行。如果設(shè)置了此選項,Monkey將繼續(xù)向系統(tǒng)發(fā)送事件,直到計數(shù)完成。--kill-process-after-error通常,當(dāng)Monkey由于一個錯誤而停止時,出錯的應(yīng)用程序?qū)⒗^續(xù)處于運行狀態(tài)。當(dāng)設(shè)置了此選項時,將會通知系 統(tǒng)停止發(fā)生錯誤的進(jìn)程。注意,正常的(成功的)結(jié)束,并沒有停止啟動的進(jìn)程,設(shè)備只是在結(jié)束事件之 后,簡單地保持在最后的狀態(tài)。--monitor-native-crashes監(jiān)視并報告Android系統(tǒng)中本地代碼的崩潰事件。如果設(shè)置了--kill-process-after-error, 系統(tǒng)將停止運行。--wait-dbg停止執(zhí)行中的Monkey,直到有調(diào)試器和它相連接。
綜合示例:
adb shell monkey -v -v --ignore-crashes --ignore-timeouts --kill-process-after-error-p com.android.calendar --throttle 500 -s 404 100
7. 如何將結(jié)果輸出到文件?
只需要 在后面加上>路徑即可。
例:adb shell monkey -v -p com.android.calendar 100 >D:/calendar_1.txt
8. Monkey也是可以做自動化測試的,你知道不?
后續(xù)補充。
難點在于你要知道都有什么控件,叫啥名字,位置。但是這些是可以解決的,有一個工具叫:uiautomatorviewer 在sdk/tools/uiautomatorviewer.bat.
來,看一眼這個牛掰liti的工具截圖:
新聞熱點
疑難解答