Monkey——輕鬆帶你上手安卓壓力測試

生活真是不可預料,四月這個欲夏還春的季節,我的生活又攪起了一池漣漪。

今天談談Monkey:

Monkeytest也有人叫做 搞怪測試。就是用一些稀奇古怪的操作方式去測試被測試系統,以測試系統的穩定性。

Monkey測試是Android自動化測試的一種手段,Monkey測試本身非常簡單,就是模擬用戶的按鍵輸入,觸摸屏輸入,手勢輸入等,看設備多長時間會出異常。
當Monkey程序在模擬器或設備運行的時候,如果用戶觸發了比如點擊,觸摸,手勢或一些系統級別的事件的時候,它就會產生隨機脈衝,所以可以用Monkey用隨機重複的方法去負荷測試你開發的軟件.


談到Monkey,必須介紹一下ADB:

ADB是android sdk裏的一個工具, 用這個工具可以直接操作管理android模擬器或者真實的android設備. 它的主要功能有:
* 運行設備的shell(命令行)
* 管理模擬器或設備的端口映射
* 計算機和設備之間上傳/下載文件
* 將本地apk軟件安裝至模擬器或android設備
* ADB是一個 客戶端-服務器端 程序, 其中客戶端是你用來操作的電腦, 服務器端是android設備.


如何讓ADB幫助我們工作呢?
只要在各操作系統的控制檯(Windows 是 cmd, Mac OS 是Terminal ,Linux不用說了)執行相應的命令即可。

當然,在Android Studio 中的Terminal直接執行也是可以的。只要進行簡單的配置:(Windows舉例)

這裏寫圖片描述

之後,在控制檯輸入 : adb version

這裏寫圖片描述

如果能輸出ADB的 版本號。就大功告成了。


以下是乾貨階段:

adb 的常用命令:

adb devices 獲取所有連接ADB的模擬器或者真機
adb install c:/xxx.apk 安裝自己的apk到設備上
adb uninstall apk包名 從設備上卸載apk
adb -s emulator-5556 uninstall apk包名 指定某設備卸載apk
adb start-server 重啓adb
adb kill-server 殺死adb
adb shell pm list packages 獲取所有應用的包名


monkey的常用命令:

adb shell monkey –help (獲取幫助命令)
adb shell monkey 1000 (隨機執行1000個模擬事件)
adb shell monkey -p xxxx 1000 (指定某個應用隨機執行1000個模擬事件,xxx填應用包名)
adb shell monkey (參數) 100 (帶參數執行100個模擬事件)


關於各種命令,就不多說了,小夥伴們多敲就熟悉了。

這裏主要講講monkey命令的各個參數

-v 參數
adb shell monkey -v 1000
adb shell monkey -v -v 1000
adb shell monkey -v -v -v 1000

用於指定反饋信息級別(信息級別就是日誌的詳細程度),總共分3個級別,分別對應的參數如下表所示:
日誌級別 Level 0
說明 缺省值,僅提供啓動提示、測試完成和最終結果等少量信息

日誌級別 Level 1
說明 提供較爲詳細的日誌,包括每個發送到Activity的事件信息

日誌級別 Level 2
說明 最詳細的日誌,包括了測試中選中/未選中的Activity信息

-s 參數
adb shell monkey -s xxx 1000

用於指定僞隨機數生成器的seed值(int型),如果seed相同,則兩次Monkey測試所產生的事件序列也相同的。
這個參數在復現錯誤的時候非常好用

-p 參數
adb shell monkey -p com.xxx.xxx 1000
adb shell monkey -p com.xxx.xxx -p com.xxx.xxx 1000

用於指定產生隨機事件的應用,如果想多個應用同時測試,就傳多個-p 參數


這裏是分割線,注意,以上參數是帶一個”-“的,以下參數將是帶兩個”-“的


–throttle 參數
adb shell monkey –throttle 500 1000

用於指定用戶操作(即事件)間的時延,單位是毫秒;這裏我指定執行1000個事件,間隔是500毫秒.

–ignore-crashes 參數
adb shell monkey –ignore-crashes 1000

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

–ignore-timeouts 參數
adb shell monkey –ignore-timeouts 1000

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

–ignore-security-exceptions 參數
adb shell monkey –ignore-exceptions 1000

用於指定當應用程序發生許可錯誤時(如證書許可,網絡許可等),Monkey是否停止運行。如果使用此參數,即使應用程序發生許可錯誤,Monkey依然會發送事件,直到事件計數完成。


重中之重點來了


–pct-{事件類別} {事件類別百分比}
adb shell monkey –pct-touch 50 1000 示例

該參數用於指定每種類別事件的數目百分比(在Monkey事件序列中,該類事件數目佔總事件數目的百分比)
本示例的含義是,指定monkey執行1000次隨機事件,其中touch事件 佔 總事件數的 比例爲 50%

拿圖說事:

第一次執行
adb shell monkey 1000
結果如下圖:

這裏寫圖片描述

第二次執行
adb shell monkey –pct-touch 50 1000
結果如下圖:

這裏寫圖片描述

這裏我們看 Event percentages: 下的第一行

第一張圖
0: 15.0%

第二張圖
0: 50.0%

這裏的0是指 touch事件, 第一次沒有指定比例時,是隨機的,第二次指定後,就固定是50%了。

重複執行第二次的命令。會發現,序號爲0的事件是不變的,而序號爲1~11的其他事件,則會隨機變化


最後來說說這0~11大致是什麼事件吧:

目前我所知如下:

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

1
–pct-motion
調整動作事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的僞隨機事件和一個up事件組成),即滑動

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

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

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

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

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

7
–pct-flip
調整“鍵盤翻轉”事件的百分比。

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

此處可能有謬誤,歡迎指正


大致梳理了monkey的要點,更深刻的研究爭取下次有機會寫

這裏,我們不妨看看monkey的實戰

相信小夥伴們都有過應用上架審覈被拒的經歷,以下是某次小米應用商店被拒後的反饋

這裏寫圖片描述

我們重點來看中間的這段monkey命令:

adb shell monkey -v –throttle 300 –pct-touch 30 –pct-motion 20 –pct-nav 20 –pct-majornav 15 –pct-appswitch 5 –pct-anyevent 5 –pct-trackball 0 –pct-syskeys 0 -p ‘%s’ 1000

首先 -v參數,指定了輸出詳情的等級,-throttle 300,指定了事件間隔時間300毫秒,
其次–pct-xx xx 參數
–pct-touch 30 指定了 事件總量的百分之30是touch事件 ,以及後面連串的 –pct-xx xx 參數 ,翻譯過來就是,點擊事件30%,滑動事件20%,導航 20% , 主導航15%, 切換activity事件 5% 其他事件5%,軌跡球事件0%,系統按鍵0%.
算一下。 30 + 20 + 20 + 15 + 5 + 5 + 0 +0 = 95
即指定的總事件佔比95%,還剩5%事件就是隨機分配給未指定的剩餘事件。
最後 -p ‘%s’ 1000 ,-p參數是指定應用,那推測過去 ‘%s’就是佔位變量,對應的就是提交給小米的應用包名。最後的1000就是說,總事件數1000

小米的壓力測試大概是遵循這個事件比例去執行,至於到底執行了多少次,就不重要了,我們只需要照着這個命令,在自己的模擬器或者手機上多跑一跑這1000個隨機事件,復現出FC/ANR等結果,通過日誌就可以着手解決問題了。

文末,最後強調。因爲Markdown的排版,文中我沒能很好的區別出 一個”-“和兩個 “–”,各位小夥伴執行命令的時候切記看清上文所說的參數區別

有機會,再來寫日誌分析部分吧。估計接下來的幾個月,都無比忙碌。

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