Monkey測試

2022-05-25 12:00:11

這段時間工作上出現變動,接觸到Monkey測試,在這做個總結。

Monkey是一個在安卓上測試的工具包,功能實現不復雜,花了幾個小時擼了一遍原始碼,將原始碼解讀和蒐集到的資訊彙總一下。

Monkey測試概要

Monkey 是一個在模擬器或裝置上執行的程式,可生成偽隨機使用者事件(例如點選、輕觸或手勢)流以及很多系統級事件。您可以使用 Monkey 以隨機且可重複的方式對正在開發的應用進行壓力測試。(這些介紹來自官網

1.1 概覽

Monkey 是一個命令列工具,可以在任何模擬器範例或裝置上執行。它會將偽隨機使用者事件流傳送到系統中,從而對您正在開發的應用軟體進行壓力測試。
Monkey 包含許多選項,主要分為以下四個類別:
  • 基本設定選項,例如設定要嘗試的事件數。
  • 操作限制條件,例如將測試物件限制為單個軟體包。
  • 事件型別和頻率。
  • 偵錯選項。
Monkey 在執行時會生成事件並將其傳送到系統。它還會監視被測系統並查詢三種特殊情況:
  • 如果您已將 Monkey 限制為在一個或多個特定軟體包中執行,它會監視並阻止轉到任何其他軟體包的嘗試。
  • 如果應用崩潰或收到任何未處理的異常,Monkey 會停止並報告錯誤。
  • 如果應用生成「應用無響應」錯誤,Monkey 會停止並報告錯誤。
根據您選擇的詳細程度級別,您還將看到有關 Monkey 進度和所生成事件的報告。
 

1.2 Monkey 的基本用法

可以使用開發計算機上的命令列啟動 Monkey,也可以通過指令碼啟動。由於 Monkey 在模擬器/裝置環境中執行,因此您必須從該環境中通過 shell 啟動它。
為此,您可以在每個命令前面加上adb shell,或者直接進入 shell 並輸入 Monkey 命令。所以需要先安裝SDK以支援adb命令
基本語法如下:
$ adb shell monkey [options] <event-count>

如果未指定任何選項,Monkey 將以靜默(非詳細)模式啟動,並將事件傳送到目標上安裝的任何(及所有)軟體包。

下面是一個更典型的命令列,它會啟動您的應用並向其傳送 500 個偽隨機事件:

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

 

1.3 命令選項參考資訊

https://developer.android.google.cn/studio/test/other-testing-tools/monkey?hl=zh_cn
 

1.4 Monkey框架

參考:http://www.uml.org.cn/Test/202004211.asp?artid=23192
 

1.5 業界Monkey測試

(1)百度SmartMonkey
基於Robotium自動測試框架,開發了SmartMonkey工具
  • 1 準確識別頁面上的操作,避免無效點選
  • 2 支援關鍵路徑設定,使測試範圍可控
  • 3 操作優先順序動態變化,覆蓋更多功能和頁面
  • 4 多程序基礎效能資訊自動採集
  • 5 支援Checklist設定,提供簡單的功能驗證
  • 6 結合效能專項工具,進一步挖掘效能隱患
參考:https://mp.weixin.qq.com/s?__biz=MzA5NjcxMDU5MQ==&mid=2650045323&idx=3&sn=0aa884012c07c8b8d7c6cb97dfef2fb9&scene=21#wechat_redirect
(2)騰訊NewMonkey
基於控制元件和加權。
 

2. Monkey功能

以下內容根據原始碼解讀。

2.1 執行機制

 

 

 
(1)monkey是基於事件的測試工具包
(2)支援命令列、指令碼、網路的方式接收指令,啟動Monkey測試。
(3)執行入口,monkey可執行檔案
 
# Script to start "monkey" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/monkey.jar
trap "" HUP
for a in "$@"; do
    echo "  bash arg:" $a
done
exec app_process $base/bin com.android.commands.monkey.Monkey "$@"
 
(4)在命令中count引數決定觸發多少次事件,對應測試多長時間。
(5)在所有事件執行完後,記錄紀錄檔
(6)隨機的生成,依賴mFactors陣列中百分比,偽隨機是指陣列中元素對應的事件是固定的,只是百分比不同,如mFactors[0]是touch事件
 
 

2.2 事件型別

頂層父類別:MonkeyEvent
 
 
型別
MonkeyEvent實現
備註
key事件
MonkeyKeyEvent
 
touch事件
MonkeyTouchEvent
繼承自MonkeyMotionEvent,還支援多次touch事件(根據引數個數判斷)
trackball事件
MonkeyTrackballEvent
繼承自MonkeyMotionEvent
wait事件
MonkeyWaitEvent
sleep,模擬操作間有間隔
profileWait事件
MonkeyWaitEvent
 
rotation事件
MonkeyRotationEvent
 
tap事件
MonkeyTouchEvent
生成ACTION_DOWN和ACTION_UP 2個事件
pressAndHold事件
MonkeyTouchEvent
生成ACTION_DOWN和ACTION_UP 2個事件,
兩個事件之間存在 pressDuration 的wait時間
drag事件
MonkeyTouchEvent
生成ACTION_DOWN和ACTION_UP 2個事件,
兩個事件之間多次ACTION_MOVE事件
pinchAndZoom事件
MonkeyTouchEvent
 
生成ACTION_DOWN和ACTION_UP 2個事件,
兩個事件之間多次ACTION_MOVE、
ACTION_POINTER_DOWN、
ACTION_POINTER_INDEX_SHIFT事件
flip事件
MonkeyFlipEvent
鍵盤事件
launch事件
MonkeyActivityEvent
 
wakeUp事件
MonkeyActivityEvent、
MonkeyKeyEvent
涉及鎖屏、解鎖等事件
launchInstrumentation事件
MonkeyInstrumentationEvent
 
keypress事件
MonkeyKeyEvent
 
生成ACTION_DOWN和ACTION_UP 2個事件,並攜帶引數keyCode,
兩個事件之間無時間間隔
longpress事件
 
MonkeyKeyEvent
生成ACTION_DOWN和ACTION_UP 2個事件,並攜帶引數KEYCODE_DPAD_CENTER,
兩個事件之間存在 2ms 的wait時間
powerLog事件
MonkeyPowerEvent
The power log event is mainly for the automated power framework
writeLog事件
MonkeyPowerEvent
無參
runCmd事件
MonkeyCommandEvent
執行shell命令
dispatchString事件
MonkeyCommandEvent
通過shell命令傳入引數
StartCaptureFramerate事件
MonkeyGetFrameRateEvent
引數:start
EndCaptureFramerate事件
MonkeyGetFrameRateEvent
引數:end+輸入引數
StartCaptureAppFramerate事件
MonkeyGetAppFrameRateEvent
引數:start+app
EndCaptureAppFramerate事件
MonkeyGetAppFrameRateEvent
引數:end+app+label
 

2.3 一點思考

原生的Monkey雖然功能已經很強大,但依然存在一些不足,比如:

  • 有些動作是基於畫素位置的,對不同裝置測試不友好
  • 測試不可控,比如你想摸你使用者測一連串操作,monkey值停留在登陸頁一直登陸。(跑一晚上白跑了個寂寞)
  • 不支援截圖等儲存現場的功能
  • 不支援實時捕獲異常,需要肉眼爬紀錄檔找問題

改進的思考點:

  • 將基於畫素,改為基於畫素相對位置,以適配不同的裝置
  • 支援關鍵路徑設定,可有針對性的測試
  • 指令碼模組化,複用和組合,快速構建測試指令碼
  • 增加基於控制元件的功能,能夠識別控制元件,並判斷下一步操作
  • 控制元件去重,防止無效測試
  • 根據堆疊異常資訊,發郵件給開發,快速定位問題。

 

  技術牛逼,技術就是讓人無腦操作。 --- me