Android 穩定性測試工具 Monkey(1) - Monkey 介紹及最常用指令
Monkey 簡介
Monkey 在英文裡的含義是“猴子”,意如其名,其實就是模擬隨機無目的的測試應用。通過長時間、快速的隨機發送的事件流,對 Android 應用不斷造成操作的壓力。優化不好,相容不好的應用很容易在這種快速的隨機操作中出現一些嚴重的異常問題,比如 Crash(崩潰), ANR(無響應)等。
- Monkey 是一種命令列工具,Android 裝置或模擬器中都自帶該工具;
- 向被測應用傳送偽隨機事件流(如按鍵、觸屏、手勢等),且使用的事件流資料流是隨機的,不能自定義;
- Monkey 使用 java 語言編寫,名為 monkey.jar ,位於 /system/framework 目錄;
- 通過 monkey 用隨機重複的方式來對應用程式進行一些穩定性、健壯性方面的測試;
- 通過名為 monkey 的 shell 指令碼啟動執行,shell指令碼的存放路徑為: /system/bin/monkey;
- 通過 adb 連線裝置或模擬器後執行 monkey 命令。
Monkey 命令
adb shell monkey [+ 命令引數] [指令數]
最簡單的示例:
adb shell monkey 100 # 傳送 100 個隨機指令
上面的 monkey 命令傳送了 100 個隨機指令,因為並沒有指定具體的應用包名。會在整個系統內隨機執行。
Monkey 引數
最常用的引數
-p
用於約束限制,用此引數指定一個或多個包。指定包後,所有的隨機指令都會針對該應用進行操作。(如何查詢包名,請檢視文章最後)
示例:
adb shell monkey -p com.huomaotv.mobile 100 # 對“火貓 TV”傳送 100 個隨機指令
接下來的 100 條指令都會在 火貓TV
應用內進行。不過注意,100 條指令會在極快的時間完成。
-
-v
用於指定反饋資訊級別(資訊級別就是日誌的詳細程度),總共分 3 個級別,以
-v
引數在命令中的個數決定級別,
-v
引數個數越多日誌就越詳細。
- Level 1: 預設值,僅提供啟動提示、測試完成、最終結果及 Crash 日誌等少量資訊
adb shell monkey -p com.huomaotv.mobile -v 100
- Level 2: 提供較為詳細的日誌,包括每個傳送到 Activity 的事件資訊
adb shell monkey -p com.huomaotv.mobile -v -v 100
- *Level 3:最詳細的日誌,包括了測試中選中/未選中的Activity資訊
adb shell monkey -p com.huomaotv.mobile -v -v -v 100
- Level 1: 預設值,僅提供啟動提示、測試完成、最終結果及 Crash 日誌等少量資訊
-
--throttle
每個事件結束後的間隔時間。用於降低系統壓力。如果不指定,系統會盡快的傳送事件序列
adb shell monkey -p com.huomaotv.mobile --throttle 300 100 # 每個指令間延時 300 毫秒
-s
指定測試的種子值(編號),如果兩次的種子值相同,則兩次測試的隨機指令完全相同。主要用於迴歸和重現出現的 Bug。
這裡稍微難以理解一點, 每次 monkey 命令的指令都是完全隨機的,導致如果測試過程中發現問題,就無法復現。這也就導致開發修復問題之後,我們也無法確定之前的問題是否被修復。
為了保證能重現問題,在執行 monkey 指令的時候加一個 種子值,只要後續的指令帶上該種子值,那麼兩次執行的隨機命令完全一致。
示例:
[C:\~]$ adb shell monkey -p com.huomaotv.mobile -s 5555 -v 100
:Monkey: seed=5555 count=100
:AllowPackage: com.huomaotv.mobile
... # 其他日誌省略 公眾號測試員小何
:Sending Touch (ACTION_DOWN): 0:(124.0,20.0)
:Sending Touch (ACTION_UP): 0:(114.721886,7.5346775)
// activityResuming(com.huomaotv.mobile)
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.huomaotv.mobile/.ui.main.activity.SplashActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.huomaotv.mobile/.ui.main.activity.SplashActivity } in package com.huomaotv.mobile
:Sending Trackball (ACTION_MOVE): 0:(0.0,-3.0)
// activityResuming(com.huomaotv.mobile)
:Sending Touch (ACTION_DOWN): 0:(718.0,217.0)
:Sending Touch (ACTION_UP): 0:(720.0,201.25154)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,1.0)
:Sending Touch (ACTION_DOWN): 0:(340.0,1100.0)
:Sending Touch (ACTION_UP): 0:(333.30652,1094.6205)
:Sending Trackball (ACTION_MOVE): 0:(4.0,3.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,1.0)
... #其他日誌省略
可以修改命令其他引數,保留 -s 5555
可以看到隨機指令都一樣。如果修改了數量,應該是百分比和前面的指令是一致的。比如把數量從 100 改為 200,前面的百分比和前面的隨機指令是一致的。
如何查詢應用的 packageName
包名不是指你下載的應用的名稱(如 huomaotv.apk ),而是應用的唯一標識packagename
(如 com.huomaotv.mobile )。
那麼這裡要如何檢視應用包名?有如下幾種方法(使用以下命令要保證 Android SDK 環境已配置,保證其中 tools、platform-tools 兩個目錄在環境變數中):
- 該應用已經安裝在裝置上,通過
adb shell pm list packages
命令檢視
adb shell pm list packages -3 # 檢視當前裝置安裝的第三方應用的 packagename #公眾號測試員小何
示例:
[C:\~]$ adb shell pm list packages -3
package:io.appium.settings
package:com.huomaotv.mobile
package:com.wude.guild
- 有 apk 安裝包的情況下,通過
aapt dump badging <apk路徑>
檢視包名。
aapt dump badging <apk路徑>
示例:
[C:\~]$ aapt dump badging "D:\huomaotv.apk"
package: name='com.huomaotv.mobile' versionCode='79' versionName='3.1.1' platformBuildVersionName=''
sdkVersion:'16'
targetSdkVersion:'23'
uses-permission: name='android.permission.SEND_SMS'
uses-permission: name='android.permission.CHANGE_NETWORK_STATE'
uses-permission: name='android.permission.WRITE_SETTINGS'
... # 其他部分省略
找到其中的package: name='com.huomaotv.mobile'
, com.huomaotv.mobile
就是package name 了。
- 還有一種方法,檢視已安裝應用的安裝目錄,Android 中的應用都安裝在
/data/data
目錄下, 通過adb shell ls
命令檢視即可。
adb shell ls /data/data
示例:
[C:\~]$ adb shell ls /data/data
... # 省略部分內容
com.android.wallpapercropper
com.android.webview
com.baidu.yuedu
com.cyanogenmod.filemanager
com.huomaotv.mobile
找到 com.huomaotv.mobile
即可。
"有錢的捧個錢場,沒錢的點個讚唄!"