【測試實用小技巧】adb命令與monkey命令的聯合使用

2020-09-24 15:01:24

前言

在移動自動化測試中,通常是需要adb命令和monkey命令的聯合使用來進行測試,adb命令何其多,monkey命令也不少,組合起來讓人頭疼,本文講列出一些常用的命令,幫助大家更好地進行移動自動化測試

Monkey 簡介

Monkey 在英文裡的含義是「猴子」,在測試行業對應有一個術語叫「猴子測試」,那麼什麼是「猴子測試」

  • Android自帶命令列工具,執行在模擬器或實際裝置中
  • 向被測應用傳送偽隨機事件流(如按鍵、觸控螢幕、手勢等)
  • 通過 monkey用隨機重複的方式來對應用程式進行一些穩定性、健壯性方面的測試

Monkey 原理

  • 利用 socket 通訊(Android 使用者端和伺服器以 TCP/UDP 方式)
  • 使用的事件流資料流是隨機的,不能自定義 monkey
  • 是用 Java 語言寫成,名為 Monkey.jar
  • 通過名為 monkey 的 shell 指令碼啟動執行,shell指令碼的存放路徑為:/system/bin/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
  • –throttle 每個事件結束後的間隔時間。用於降低系統壓力。如果不指定,系統會盡快的傳送事件序列
adb shell monkey -p com.huomaotv.mobile --throttle 300 100 
# 每個指令間延時 300 毫秒
  • -s 指定測試的種子值(編號),如果兩次的種子值相同,則兩次測試的隨機指令完全相同。主要用於迴歸和 重現出現的 Bug。 這裡稍微難以理解一點, 每次 monkey 命令的指令都是完全隨機的,導致如果測試過程中 發現問題,就無法復現。這也就導致開發修復問題之後,我們也無法確定之前的問題是否被修復。 為了保證 能重現問題,在執行 monkey 指令的時候加一個 種子值,只要後續的指令帶上該種子值,那麼兩次執行的隨 機命令完全一致。
adb shell monkey -p com.huomaotv.mobile -s 5555 -v 100

可以修改命令其他引數,保留 -s 5555 可以看到隨機指令都一樣。如果修改了數量,應該是百分比和前面的指令 是一致的。比如把數量從 100 改為 200,前面的百分比和前面的隨機指令是一致的

偵錯引數

以下命令主要用於控制在 monkey 命令執行過程中的一些偵錯選項。 其中 --ignore-crashes 和 --ignoretimeouts 在長時間執行(比如下班後執行幾個小時),可以保證在執行過程中遇到崩潰等問題的時候,依然能執 行剩餘的指令。避免剛開始執行就遇到 Crash 和 ANR 導致後續指令不會執行。

引數說明備註
–ignorecrashes用於指定當應用程式崩潰時,Monkey是否停止執行。如果使用此引數,即使應用程式 崩潰,Monkey依然會傳送事件,直到事件計數完成。長 時 間 運 行 必 備
–ignoretimeouts用於指定當應用程式發生ANR(Application No Responding)錯誤時,Monkey是否 停止執行。如果使用此引數,即使應用程式發生ANR錯誤,Monkey依然會傳送事件, 直到事件計數完成。長 時 間 運 行 必 備
–ignoresecurityexceptions用於指定當應用程式發生許可錯誤時(如證書許可,網路許可等),Monkey是否停止 執行。如果使用此引數,即使應用程式發生許可錯誤,Monkey依然會傳送事件,直到 事件計數完成
–killprocessafter-erro用於指定當應用程式發生錯誤時,是否停止其執行。如果指定此引數,當應用程式發 生錯誤時,應用程式停止執行並保持在當前狀態(注意:應用程式僅是靜止在發生錯 誤時的狀態,系統並不會結束該應用程式的程序)。
–monitornativecrashes用於指定是否監視並報告應用程式發生崩潰的原生程式碼。
-wait-dbg停止執行中的Monkey,直到有偵錯程式和它相連線。
-dbg-noevents設定此選項,Monkey將執行初始啟動,進入到一個測試Activity,然後不會再進一步 生成事件。為了得到最佳結果,把它與-v、一個或幾個包約束、以及一個保持Monkey 執行30秒或更長時間的非零值聯合起來,從而提供一個環境,可以監視應用程式所調 用的包之間的轉換

範例:

adb shell monkey -p com.huomaotv.mobile --ignore-crashes --ignore-timeouts --monitornative-crashes -v 100000

指定時間型別百分比引數

monkey 隨機傳送的命令中包含各種隨機事件,各種型別的事件按照某種比例產生。如果想要指定某種型別的事件更多一些,可以指定該事件的百分比。
比如當前測試的應用中主要支援的操作就是觸控和滑動等常規操作,那麼就可以提高這兩種型別的隨機事件的比例。

事件類別調整事件說明
–pct-touch調整觸控事件的百分比(觸控事件是一個down-up事件,它發生在螢幕上的某單一位置)
–pctmotion調整滑動事件的百分比(動作事件由螢幕上某處的一個down事件、一系列的偽隨機事件和一 個up事件組成)
–pctpinchzoom調整縮放事件的百分比(縮放事件即智慧機上的放大縮小手勢)
–pcttrackball調整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點選)
–pctrotation調整橫豎屏切換事件的比例
–pct-nav調整「基本」導航事件的百分比(導航事件由來自方向輸入裝置up/down/left/right組成)
–pctmajornav調整「主要」導航事件的百分比(這些導航事件通常引發圖形介面中的動作,如:回退按鍵、菜 單按鍵)
–pct-flip調整鍵盤事件的百分比(鍵盤事件如點選輸入框、鍵盤彈起、點選輸入框以外區域、鍵盤收 回等)
–pctsyskeys調整「系統」按鍵事件的百分比(這些按鍵通常被保留,由系統使用,如Home、Back、Start Call、End Call及音量控制鍵)
–pctappswitch調整啟動Activity的百分比。在隨機間隔裡,Monkey將執行一個startActivity()呼叫,作為最 大程度覆蓋包中全部Activity的一種方法
–pctanyevent調整其它型別事件的百分比。它包羅了所有其它型別的事件,如:按鍵、其它不常用的裝置 按鈕、等等

範例:

# 單個引數設定百分比 
adb shell monkey -p com.huomaotv.mobile --pct-appswitch 20 10000
# 多個引數設定百分比 
adb shell monkey -p com.huomaotv.mobile --pct-appswitch 20 --pct-rotation 20 --pcttouch 30 --pct-motion 20 10000
注意: 引數後面緊接百分比 ,百分比的總量不能大於 100% 

紀錄檔分析

在命令的最後,加上 > 重定向到本地檔案。 d:/monkey.log 放在 d 盤的根目錄

範例:

adb shell monkey -p com.huomaotv.mobile --pct-appswitch 20 --pct-rotation 20 --pcttouch 30 --pct-motion 20 --ignore-crashes --ignore-timeouts --monitor-native-crashes 10000 > d:/monkey.log

那麼對於 monkey 跑完之後,我們要如何去確認有沒有出現 bug 呢? 最直觀簡單的方式就是通過搜尋以下關鍵字:

  1. 程式無響應的情況:搜尋鍵碼「ANR in」
  2. 崩潰的情況1:搜尋鍵碼「CRASH」
  3. 崩潰的情況2:搜尋鍵碼「Exception」
  4. 記憶體溢位的情況:搜尋鍵碼「OOM」
  5. 測試成功的情況:搜尋鍵碼「Monkey finished」
  6. 如果出現空指標 NullPointerException ,就一定是 bug

結語

需要更多資料歡迎關注聯絡我,也歡迎大家進群一起交流自動化測試遇到的問題或經驗,點選並輸入暗號:CSDN