Monkey程序由Android系統自帶,使用Java語言寫成,在Android文件系統中的存放路徑是:/system/framework/monkey.jar
Monkey.jar程序是由一個名為「monkey」的Shell腳本來啟動執行,shell腳本在Android文件系統中的存放路徑是:/system/bin/monkey
Monkey 命令啟動方式:
可以通過PC機CMD窗口中執行: adb shell monkey {+命令參數}來進行Monkey測試
在PC上adb shell 進入Android系統,通過執行monkey {+命令參數} 來進行Monkey 測試
在Android機或者模擬器上直接執行monkey 命令,可以在Android機上安裝Android終端模擬器
Monkey雖然可以根據一個指定的命令腳本發送按鍵消息,但不支持條件判斷,不支持讀取待測界面的信息來執行驗證操作
那麼這個option通常又分為4大類:
1、常用選項的參數通常有:
示例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、時間選項的參數通常有:
示例:
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值,就可以保證兩次測試產生的隨機操作序列是完全相同的,所以這個操作序列偽隨機的;
3、約束選項的參數通常有:
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.txt
adb shell monkey -p com.tpnet.hlquery --throttle 100--pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkeytest.txt
測試com.tpnet.hlquery這個app,間隔100毫秒,50%的觸摸事件,50% 的滑動事件,三個-v輸出詳細的日誌,執行1000個事件,日誌輸出到c:\monkeytest.txt
ps: 命令運行前手機先解鎖,win8 以上要用管理員身份打開cmd
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:
// 15.0% --事件0 為touch事件,就是相當於按下之後彈起來的一個動作
// 10.0% --事件1 為motion,相當於說從起始點到終點有移動了多少步,就是步驟數量
// 2.0% --事件2 為pinchzoom,為兩個手指有同時按下去後,都向中間移動後up起來,相當於一個縮放的動作。
// 15.0% --事件3 為trackball,為軌跡球事件
// -0.0% --事件4 為rotation 為屏幕旋轉百分比隱藏事件
// 25.0% --事件5 為nav導航事件,就是上下左右
// 15.0% --事件6 為majornav主導航事件,會產生一些窗口的事件
// 2.0% --事件7 為系統按鍵
// 2.0% --事件8,app應用的打開就是用的這個事件
// 1.0% --事件9,鍵盤的開,關
// 13.0% --事件10,按鍵按下在彈起等動作
日誌結尾:
如果Monkey測試順利執行完成,在log的最後,會列印出當前執行事件的次數和所花費的時間;Monkey
finished代表執行完成。
(如果Monkey執行中斷,在log的最後也能查看到當前已執行的次數。)
2、詳細分析:
Monkey測試出現錯誤之後,一般的分析步驟分為以下幾種:
看Monkey日誌(注意第一個switch以及異常信息等)
程序無響應問題,在日誌中搜索 「ANR」
奔潰問題: 在日誌中搜索 「Exception」
ANR問題:在日誌中搜索「ANR」(什麼是ANR:Application Not Responding,即應用無響應,具體有關ANR的知識詳見:):https://www.tuicool.com/articles/IfQvY3
ForceClosed和程序異常退出問題:在日誌中搜索「致命」
3、查看Monkey裡面錯誤前的一些事件動作,並手動執行該動作
如果Monkey測試順利執行完成,在log的最後,會列印出當前執行事件的次數和所花費的時間; // Monkey finished代表執行完成。
Monkey執行中斷,在log的最後也能查看到當前的已經執行的次數。
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之前,執行最後一次回收內存垃圾
adb shell monkey -p com.tpnet.hlquery --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkeytest.txt
如果指定了這個選項,monkey會在發送事件的前後生成app內存快照文件,一般會在設備的/dada/misc目錄下生成hprof文件(ps: /data/misc/需要root權限)
拖進AndroidStudio即可查看
Monkey script是按照一定語法規則編寫有序的用戶事件流並且適用於monkey命令工具的腳本,可以用txt寫。
腳本編寫完畢放入手機的sdcard目錄下,cmd中運行命令
adb shell monkey -f/sdcard/腳本名字 運行次數
結合monkey的-v和–hhprof輸出日誌和性能報告
adb shell monkey --hprof -f/sdcard/*.txt -v -v -v 3 > c:\monkey.txt
一些腳本命令:
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 只識別英文和數字輸入學習安排上!
▲ 助力千萬測試人員 ▲
免費領Python+Java雙語視頻
關注下方公眾號免費領取
不想錯過就把我們設為星標吧!
第一步:點擊頂部藍字「自動化軟體測試」,進入公眾號主頁第二步:點擊右上角「···」
第三步:點擊「設為星標」
轉載自:http://navo.top/BVJZ3a
「在看」點一點
心中有光萬物明朗😁
👇👇👇