1. 程式人生 > >Monkey 穩定性測試

Monkey 穩定性測試

一、什麼是穩定性測試?

通過隨機點選螢幕一段時間,看看app會不會奔潰,能不能維持正常執行

二. Money是什麼?

Monkey測試是Android平臺自動化測試的一種手段,通過Monkey程式模擬使用者觸控式螢幕幕、滑動Trackball、按鍵等操作來對裝置上的程式進行測試,檢測程式多久的時間會發生異常。和MonkeyRunner幾乎是完全不同的,MonkeyRunner相當於是搞自動化測試的了

三. Monkey的介紹

  • Monkey程式由Android系統自帶,使用Java語言寫成,在Android檔案系統中的存放路徑是:/system/framework/monkey.jar
  • Monkey.jar程式是由一個名為“monkey”的Shell指令碼來啟動執行,shell指令碼在Android檔案系統中的存放路徑是:/system/bin/monkey
  • Monkey 命令啟動方式 
    a. 可以通過PC機CMD視窗中執行: adb shell monkey {+命令引數}來進行Monkey測試 
    b. 在PC上adb shell 進入Android系統,通過執行monkey {+命令引數} 來進行Monkey 測試 
    c. 在Android機或者模擬器上直接執行monkey 命令,可以在Android機上安裝Android終端模擬器

這裡寫圖片描述

四. Monkey架構

這裡寫圖片描述

五. Monkey弱點

Monkey雖然可以根據一個指定的命令指令碼傳送按鍵訊息,但不支援條件判斷,不支援讀取待測介面的資訊來執行驗證操作

六. Monkey的壓力測試引數

這裡寫圖片描述

那麼這個option通常又分為4大類:常用選項,事件選項,約束選項,除錯選項

1.常用選項的引數通常有:

-v  用於反饋資訊級別(一個-v表示一個層級,兩個-v表示兩個層級,通常最多三個-v)

示例Level0:

adb shell monkey -p com.swartz.cicada –v 100

說明 預設值,僅提供啟動提示、測試完成和最終結果等少量資訊 相應原始碼如圖所示了,這十分有利於除錯了

示例Level1:

adb shell monkey -p com.swartz.cicada -v-v 100

說明 

提供較為詳細的日誌,包括每個傳送到Activity的事件資訊

示例Level2:

adb shell monkey -p com.swartz.cicada -v-v-v 100

說明 

最詳細的日誌,包括了測試中選中/未選中的Activity資訊

2.時間選項的引數通常有:

-s 表示偽隨機數生成的seed值,如果seed值相同,則兩次monkey所產生的事件序列也是一樣的

示例:

Monkey測試1:adb shell monkey -p com.swartz.cicada –s 10 100

   Monkey 測試2:adb shell monkey -p com.swartz.cicada –s 10 100

   兩次測試的效果是相同的,因為模擬的使用者操作序列(每次操作按照一定的先後順序所組成的一系列操作,即一個序列)是一樣的。操作序列雖然是隨機生成的,但是隻要我們指定了相同的Seed值,就可以保證兩次測試產生的隨機操作序列是完全相同的,所以這個操作序列偽隨機的;

--throttle:每個事件結束後的間隔時間

3.約束選項的引數通常有:

-p 指定檔名

count 指定要傳送的事件數

-c 用此引數指定一個或幾個類別,activity必須指定一個category,才能被啟動,否則將會啟動不了

4.除錯選項的引數通常有:

--dbg-no-events:初始化啟動的activity,但是不產生任何事件。--hprof:指定該項後在事件序列傳送前後會立即生成分析報告--ignore-crashes:忽略崩潰--ignore-timeouts:忽略超時--ignore-security-exceptions:忽略安全異常--kill-process-after-error:發生錯誤後直接殺掉程序--monitor-native-crashes:跟蹤本地方法的崩潰問題工作中為了保證測試數量的完整進行,我們一般不會在發生錯誤時立刻退出壓力測試。monkey 測試命令如下:adb shell monkey -p com.swartz.cicada -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 10000 > E:\monkey_log\20170831.txtkill此引數用來殺掉程序:kill pid 先執行adb shell  再ps |grep monkey 查詢結果如下圖中15248 即為PID  再kill pid(15248)即可

例子:

adb shell monkey -p com.tpnet.hlquery --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkeytest.txt
  • 1

測試com.tpnet.hlquery這個app,間隔100毫秒,50%的觸控事件,50% 
的滑動事件,三個-v輸出詳細的日誌,執行1000個事件,日誌輸出到c:\monkeytest.txt

ps: 命令執行前手機先解鎖,win8 以上要用管理員身份開啟cmd

七. Monkey的結果於分析

1. 初步分析方法:

Monkey: seed=20 count=100  --隨機種子和執行次數

:AllowPackage: com.swartz.cicada  --指定的測試包
:IncludeCategory: android.intent.category.LAUNCHER  --Category包含LAUNCHER
:IncludeCategory: android.intent.category.MONKEY   --Category包含MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
//   + Using main activity com.swartz.cicada.LauncherActivity (from package com.swartz.cicada)
// Selecting main activities from category android.intent.category.MONKEY  --查詢結果列表
// Seeded: 20 --隨機種子
// Event percentages:
//   0: 15.0%  --事件0 為touch事件,就是相當於按下之後彈起來的一個動作
//   1: 10.0%  --事件1 為motion,相當於說從起始點到終點有移動了多少步,就是步驟數量 
//   2: 2.0%   --事件2 為pinchzoom,為兩個手指有同時按下去後,都向中間移動後up起來,相當於一個縮放的動作。
//   3: 15.0%  --事件3 為trackball,為軌跡球事件 
//   4: -0.0%  --事件4 為rotation 為螢幕旋轉百分比隱藏事件
//   5: 25.0%  --事件5 為nav導航事件,就是上下左右
//   6: 15.0%  --事件6 為majornav主導航事件,會產生一些視窗的事件
//   7: 2.0%   --事件7 為系統按鍵
//   8: 2.0%   --事件8,app應用的開啟就是用的這個事件
//   9: 1.0%   --事件9,鍵盤的開,關

//   10: 13.0% --事件10,按鍵按下在彈起等動作

日誌結尾:

如果Monkey測試順利執行完成,在log的最後,會打印出當前執行事件的次數和所花費的時間;Monkey
finished代表執行完成。

(如果Monkey執行中斷,在log的最後也能檢視到當前已執行的次數。)

2.詳細分析:

Monkey測試出現錯誤之後,一般的分析步驟分為以下幾種: 

2.1看Monkey日誌(注意第一個switch以及異常資訊等) 

2.11程式無響應問題,在日誌中搜索 “ANR”

2.12奔潰問題: 在日誌中搜索 “Exception”

ANR問題:在日誌中搜索“ANR”(什麼是ANR:Application Not Responding,即應用無響應,具體有關ANR的知識詳見:):https://www.tuicool.com/articles/IfQvY3

2.13ForceClosed和程式異常退出問題:在日誌中搜索“致命” 

3.檢視Monkey裡面錯誤前的一些事件動作,並手動執行該動作。

如果Monkey測試順利執行完成,在log的最後,會打印出當前執行事件的次數和所花費的時間; // Monkey finished代表執行完成。 

Monkey執行中斷,在log的最後也能檢視到當前的已經執行的次數。

八. Monkey測試中記憶體問題分析

1. 怎麼樣去確定記憶體洩漏?

1. 記憶體洩漏彈出out of memory對話方塊
2. 對於有記憶體洩漏但是沒有單出out of memory對話方塊的情況,可以通過logcat檔案GC出資訊,(GC:java的垃圾回收機制)
    GC_FOR_ALLOC: 因為在分配記憶體時候記憶體不夠引起的
    GC_EXPLICIT 表明GC被顯式請求觸發的,如System.gc呼叫,
    GC_CONCCURRENT: 表明GC在記憶體使用率達到一定的警戒值時候,自動觸發
    GC_BEFORE_OOM 表明在虛擬機器丟擲記憶體不夠異常oom之前,執行最後一次回收記憶體垃圾
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

九. –hprof 引數報告

adb shell monkey -p com.tpnet.hlquery --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkeytest.txt
  • 1

如果指定了這個選項,monkey會在傳送事件的前後生成app記憶體快照檔案,一般會在裝置的/dada/misc目錄下生成hprof檔案(ps: /data/misc/需要root許可權)

拖進AndroidStudio即可檢視

(ps: 我測試了沒有生成。。不知道什麼回事)

十. Monkey Script指令碼製作

Monkey script是按照一定語法規則編寫有序的使用者事件流並且適用於monkey命令工具的指令碼,可以用txt寫。

指令碼編寫完畢放入手機的sdcard目錄下,cmd中執行命令

adb shell monkey -f/sdcard/指令碼名字 執行次數
  • 1

結合monkey的-v和–hhprof輸出日誌和效能報告

adb shell monkey --hprof -f/sdcard/*.txt -v -v -v 3 > c:\monkey.txt
  • 1
  • 2

一些指令碼命令:

  • start data>> 
    將控制 monkey 的一些引數設定和具體的 monkey 命令分隔開來

  • LaunchAcitivity(pkg_name, cl_name) 
    啟動任意應用的一個活動(介面) 
    pkg_name, 要啟動的應用包名 
    cl_name, 要開啟的活動的類名

  • DispatchPointer(downTime,eventTime,action,x,y,pressure,size,metaState,xPrecision,yPrecision,device,edgeFlags) 
    向一個指定位置傳送單個手勢訊息 
    downTime: 傳送訊息的時間,只要是合法的長整型數字即可 
    eventTime: 主要是用在指定傳送兩個事件之間的停頓 
    action: 訊息是按下還是擡起,0表示按下,1表示擡起 
    x:x 座標 
    y:y 座標 
    其餘 7 個引數均可以設定為 0

模版

count = 1  // 下面這個 count 選項, monkey 並沒有用到,可以忽略它  
speed = 1.0    //speed  選項是用來調整兩次按鍵的傳送瀕率的 
start data >>   // “start data >>” 是 有 大小寫敏感的,而且單詞間的間隔只用有一個空格!
LaunchActivity(com.zhengping.contact, com.zhengping.contact.Main)   //# Activity 值可以通過 aapt 命令檢視
DispatchPointer(5109520,5109520,0,261,128,0,0,0,0,0,0,0);
DispatchPointer(5109521,5109521,1,261,128,0,0,0,0,0,0,0);
UserWait(2000)  // 停頓時間

DispatchPress (KEYCODE_Z) // 文字輸入 monkey 只識別英文和數字輸入