1.簡介
Monkey是Android系統自帶的一款穩定性測試小工具,簡單易用
2.環境搭建
(1)下載Android SDK
(2)將Android SDK目錄下的platform-tools和tools目錄配置到系統環境變量Path中
(3)打開cmd窗口,輸入adb命令,查看環境是否配置成功,如下圖所示,則環境配置成功
3.Monkey啟動
(1)最簡單的例子:命令行中輸入 adb shell monkey 1000后,你會發現手機(或者虛擬機)自動運行起來了,命令行也會輸出相關的日志。
(2)標準的Monkey命令:monkey [options] <count>
其中options表示Monkey執行可配置的參數,是可選項,如果不指定options,Monkey將以無反饋模式啟動,并把事件任意發送到安裝在目標環境中的全部包,count表Monkey執行的事件數,必須設置
(3)options的類型及其使用
下面將Monkey的Options操作分為四類:常規類,事件類,約束類和調試類。
常規類命令 | 使用 | 詳解 |
---|---|---|
-h | adb shell monkey -h | 顯示monkey參數幫助信息 |
-v | adb shell monkey -v -v -v<event-count> | 打印出日志信息,每個-v將增加反饋信息的級別,-v越多日志信息越詳細:0級,除啟動提示、測試完成和最終結果提供較少信息。1級,提供較詳細調試信息,比如逐個發送到Activity的事件。2級,提供更詳細安裝信息,如測試中被選中或未被選中的Activity |
事件類命令 | 使用 | 詳解 |
---|---|---|
-f | adb shell monkey -f<測試腳本名><event-count> | 表示要使用Monkey運行指定的腳本 |
-s | adb shell monkey -s<seed><event-count> | 指定隨機數生成器seed值,如果用相同的seed值再次運行moneky,將重復執行剛才的隨機操作 |
--throttle | adb shell monkey --throttle<時間間隔> | 表示每執行一個指令間隔的時間,單位ms,注意是-“--”開頭 |
--pct-touch | adb shell monkey --pct-touch<percent> | 表示觸摸事件百分比 |
--pct-motion | adb shell monkey --pct-motion<percent> | 表示動作事件百分比 |
--pct-trackball | adb shell monkey --pct-trackball<percent> | 表示軌跡球事件百分比 |
--pct-nav | adb shell monkey --pct-nav<percent> | 表示基本導航事件百分比 |
--pct-majornav | adb shell monkey --pct-majornav<percent> | 表示主要導航事件百分比 |
--pct-syskeys | adb shell monkey --pct-syskeys<percent> | 表示系統按鍵事件百分比 |
--pct-appswitch | adb shell monkey --pct-appswitch<percent> | 表示應用啟動事件百分比 |
約束類命令 | 使用 | 詳解 |
---|---|---|
-p | adb shell monkey -p<一個或者多個包名><event-count> | 指定測試一個或者多個包 |
-c | adb shell monkey -c<一個或者多個類別><event-count> | 指定測試一個或者多個類別(即<main-category>參數) |
調試類命令 | 使用 | 詳解 |
---|---|---|
--dbg-no-events | adb shell monkey --dbg-no-events<event-count> | 監視應用程序所調用的包之間的轉換 |
--hprof | adb shell monkey --hprof <event-count> | 在事件序列前后立即生成profiling report,在data/misc中生成5MB大小左右的文件 |
--ignore-crashes | adb shell monkey --ignore-crashes<event-count> | 設置后,當應用程序崩潰或者發生異常的時候,Monkey將繼續運行直到計數完成,而不會停止運行 |
--ignore-timeouts | adb shell monkey --ignore-timeouts<event-count> | 設置后,當應用程序發生任何超時錯誤(比如ANR),Monkey將繼續運行直到計數完成,而不會停止運行 |
--ignore-security-exceptions | adb shell monkey --ignore-security-exceptions<event-count> | 設置后,當應用程序發生任何相關權限錯誤的時候,Monkey將繼續運行直到計數完成,而不會停止運行 |
--monitor-native-crashes | adb shell monkey--monitor-native-crashes<event-count> | 設置后,monkey會監視并報告Android系統的native code的崩潰事件 |
(4)Moneky腳本的編寫
事件 | 使用 | 詳解 |
---|---|---|
點擊事件 | DispatchPointer ( downTime , eventTime , action , x , y , pressure , size , metaState , xPrecision , yPrecision , device , edgeFlags) | 其實這么多參數,只需要關注action 、 x 、y 三個參數即可。action :事件是按下還是抬起,0 表示按下,1 表示抬起。x、y:表示當前事件觸發的X軸和Y軸的坐標 |
輸入字符串事件 | DispatchString(String text) | 輸入一個不加引號的字符串 |
啟動應用 | LaunchActivity ( pkg_name , act_name ) | 用于打開任意應用的一個頁面,但是前提條件是打開的Activity 需要屬性 android:exported 被設定為true,才可以通過 LaunchActivity 打開 |
等待事件 | UserWait(long sleeptime) | 操作需要等待的事件,單位為毫秒 |
按下鍵值 | DispatchPress(int keycode) | 用于模擬敲擊鍵盤的事件 |
長按鍵值 | LongPress(int keycode) | 用于模擬敲擊鍵盤的事件 |
(5)準確地獲取控件坐標
方法一:
因為Monkey是基于坐標來操作控件的,所以必須準確地獲取控件坐標才能進行正確測試。這里就需要getevent。在命令行上輸入adb shell getevent后,然后點擊手機界面,會獲得所點擊的位置的十六進制坐標。
比如上圖,我點擊點一個文本框后輸入的一系列數據(看起來好亂和復雜),每一行的三個數據分別代表type,code,value(具體的含義自己百度一下,這里就不多解釋),然后其實我們只需要關注的是code為0035和0036這兩行的數據,分別代表觸屏時的絕對坐標X和Y,然后將它們轉為十進制的坐標就可以了,就這樣我們得到了控件的x和y坐標。
方法二:我推薦另外一種更簡單的方式,來獲取當前你看見的,在待測試設備上的控件的坐標點的定位方式。那就是利用 Android 設備的開發者選項。設置 → 開發者選項 → 指針位置 ,將這個屬性開啟之后,當手指在屏幕上滑動的時候,就可以在頂部看到當前觸摸點的 X、Y 軸的坐標,這就是我們需要的。
(6)Monkey日志分析
- 正常情況: 如果Monkey測試順利執行完成, 在log的最后, 會打印出當前執行事件的次數和所花費的時間; // Monkey finished 代表執行完成\
- 異常情況:Monkey 測試出現錯誤后,一般的分析步驟:
1.程序無響應的問題: 在日志中搜索 “ANR”
2.崩潰問題:在日志中搜索 “Exception” (如果出現空指針, NullPointerException) 肯定是有bug
4.Monkey簡單實戰
下面我們寫一個簡單的Monkey腳本進行測試:就是兩個Activity頁面,第一個頁面輸入EditText,然后第二個頁面顯示第一個頁面的信息。(相信這部分代碼對各位大佬來說很簡單,就不粘貼出來了)
思路:
(1)選中文本框1
captureDispatchPointer(10,10,0,308,215,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,308,215,1,1,-1,1,1,0,0)
(2)往文本框1中輸入內容
captureDispatchString(111)
captureDispatchPress(66)
(3)選中文本框2
captureDispatchPointer(10,10,0,197,295,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,197,295,1,1,-1,1,1,0,0)
(4)往文本框2中輸入內容
captureDispatchString(222)
captureDispatchPress(66)
(5)點擊提交按鈕
UserWait(500)
captureDispatchPointer(10,10,0,264,403,1,1,-1,1,1,0,0);
captureDispatchPointer(10,10,1,264,403,1,1,-1,1,1,0,0);
(6)全部代碼
(7)運行腳本,比如下面指定執行腳本10次,輸出相關日志信息
5.Monkey總結
優點:功能強大, 主要用于壓力和穩定性測試
缺點:本身不提供截屏功能,本身無法完成錄制、回放的功能(不過都可以借用其他的開源工具來實現Monkey的截屏和錄制等功能)
不支持條件判斷,不支持讀取待測界面的信息來執行驗證操作