參考文章https://blog.csdn.net/just__like/article/details/83757492
https://www.jianshu.com/p/97268b83dc1d
1、什麼是monkey
Monkey是Android中的一個指令行工具,可以運作在模拟器裡或實際裝置中。它向系統發送僞随機的使用者事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實作對正在開發的應用程式進行壓力測試。Monkey測試是一種為了測試軟體的穩定性、健壯性的快速有效的方法。(其實可以想象成一隻猴子啥都不知道,瘋狂亂敲…)
2、monkey的特點
1、Monkey 程式是由 Android 系統自帶,使用 Java 語言寫成。在Android檔案系統中的存放路徑是:
/system/framework/monkey.jar;
2、Monkey.jar程式是由一個名為“monkey”的Shell腳本來啟動執行,shell腳本在Android檔案系統中 的存放路徑是:
/system/bin/monkey
3、monkey的優點
1、如果限制了Monkey在運作于特定的包,當檢測試圖轉移到其他包進行操作,将對其進行組織
這樣可以限定在執行app進行測試
2、如果程式發生崩潰或者接收到任何失控異常資訊,Monkey會記錄對應
錯誤日志
,并根據指令參數判斷是否繼續測試
3、如果應用程式發生程式無響應的錯誤,Monkey會記錄對應
錯誤日志
,并根據指令參數判斷是否繼續測試
4、按照標明的不同級别的回報資訊,Monkey還可以看到其執行過程包報告和生成事件
5、Monkey的建構
![](/image///upload-images.jianshu.io/upload_images/2326194-c0555a30ab0517e0.png?imageMogr2/auto-orient/strip|imageView2/2/w/623/format/webp)
3、運作Monkey
1、首先你要先搭建環境
先下載下傳jdk 具體安裝流程請參考:https://blog.csdn.net/write6/article/details/79136388
再下載下傳sdk 具體安裝流程請參考:https://blog.csdn.net/u011541946/article/details/77142045
2、啟動手機
3、用PC機adb指令與手機聯通
4、進入手機的shell指令(adb -s 等等 shell)
5、編寫Monkey指令
4、Monkey介入測試時間
等産品基本穩定,沒有特别多的bug,一般用Monkey去測試應用的
穩定性和健壯性
(是否閃退,崩潰)整機測試
5、Monkey基本用法
1、基本文法
1、-p
表示指定測試的程式(空格後面跟安裝包名字,拿剛才的第三方安裝包一個個試)一個或這多個
包名獲得方法
1、百度 aapt dump badging ****.apk
2、找開發要
3、aapt dump badging ***apk(apk位置) >> ***txt
然後找到launchable-activity:name = (包名)
4、aapt dump badging ***apk(apk位置)| find ‘launchable-activity’
2、-v 記錄日志級别
指令行不同個數的-v會有不同的效果
-v:Level 0(預設值)除 啟動提示、測試完成和最終結果之外,提供較少資訊。
-v -v :Level 1提供較為詳細的測試資訊,如逐個發送到Activity的 事件。
-v -v -v :Level 2提供更加詳細的設定資訊,如測試中被選中的或未被選中的Activity。
例題
/數字100:表示測試事件數為100
指定一個包 adb shell monkey -p com.tencent.news -v -v -v 100 (此時指定軟體會被打開并開始亂點亂按)
指定多個包 adb shell monkey -p com.tencent.news -p com.pdfreader -p com.widgets -v 1000
不指定包 adb shell monkey -v 1000
3、-s 僞随機數生成器的seed值(像旗幟)
1、用于産生seed值,有助于重制bug
2、seed值,相當于一個flag(旗幟),如果seed值相同,随機事件的事件流會一樣
3、seed值不指定 系統會自動生成
4、例子
adb shell monkey -p com.test -v-v -s 10 1000
如果這次出了bug,看日志也不是很好找到,可以adb shell monkey -p com.test -v-v -s 10 1000 把指令再次輸入,這樣這次和上次 運作過程一樣友善找到bug
4、–throttle : 事件之間加入延時操作
在某些不需要頻率過快,或需要定頻率進行互動時,可以采用–throttle來做事件之間的延時操作。(機關值毫秒)
6、發生事件類型
1、盡管monkey産生是僞随機事件流,但是我們希望我們的操作有一定的規律性,即按鍵、觸屏等各類事件操作有所偏重
比如
(1).對文本框操作,需要更多的按鍵操作。
(2).玩遊戲,需要更多的點選和滑動操作。
Event percentages(事件百分比)
0:觸摸事件百分比,參數–pct-touch
1:滑動事件百分比,參數–pct-motion
2:縮放事件百分比,參數–pct-pinchzoom
3:軌迹球事件百分比,參數–pct-trackball
4:螢幕旋轉事件百分比,參數–pct-rotation
5:暫時不知道這個是什麼
6:基本導航事件百分比,參數–pct-nav
7:主要導航事件百分比,參數–pct-majornav
8:系統事件百分比,參數–pct-syskeys
9:Activity啟動事件百分比,參數–pct-appswitch
10:鍵盤翻轉事件百分比,參數–pct-flip
11:其他事件百分比,參數–pct-anyevent
常用事件(
加起來不超100 ,可以一次指定多個
)
1、.–pct-touch (空格後加數字)設定觸屏事件生成的百分比。觸屏事件是一個有手指按下,擡起事件的手勢。
eg: adb shell monkey -p com.tencent.news --pct-touch 50 --throttle 3000 100
向騰訊新聞發送1000次随機事件,每次事件間隔為3秒。其中設定觸屏的事件占比為50%。
2.–pct-rotation 設定螢幕翻轉的百分比 橫屏豎屏。
eg: adb shell monkey --throttle 3000 --pct-rotation 50 -p com.tencent.news 100
或 adb shell monkey -p com.tencent.news --pct-rotation 50 --throttle 3000 100
向騰訊新聞發送1000次随機事件,每次事件間隔為3秒。其中設定螢幕翻轉的百分比 橫屏豎屏占比為50%。
3.–pct-syskeys 設定系統事件,是一些系統提供案件 Home,Back,start,end call,音量鍵等。
eg: adb shell monkey --throttle 3000 --pct-syskeys 50 -p com.tencent.news 100
或 adb shell monkey -p com.tencent.news --pct-syskeys 50 --throttle 3000 100
向騰訊新聞發送1000次随機事件,每次事件間隔為3秒。其中設定系統事件占比為50%。
34–pct-majornav 設定導航欄事件,是一些提供案件 Home,back,菜單鍵等。
eg: adb shell monkey --throttle 3000 --pct-majornav 50 -p com.tencent.news 100
或 adb shell monkey -p com.tencent.news --pct-majornav 50 --throttle 3000 100
向騰訊新聞發送1000次随機事件,每次事件間隔為3秒。其中設定系統事件占比為50%。
5.–pct-motion 設定滑動事件生成的百分比。滑動事件是一個先在某一個位置手指按下,滑動一段距離後再擡起手指的手勢。
eg: adb shell monkey --throttle 3000 --pct-motion 50 -p com.tencent.news 100
或 adb shell monkey -p com.tencent.news --pct-motion 50 --throttle 3000 100
向騰訊新聞發送1000次随機事件,每次事件間隔為3秒。其中設定滑動的事件占比為50%。
6.--pct-trackball 設定軌迹球事件生成的百分比。軌迹球事件是包含一系列随機移動和單擊事件的事件
eg:adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news 100
或 adb shell monkey -p com.tencent.news --pct-trackball 50 --throttle 3000 100
向騰訊新聞發送1000次随機事件,每次事件間隔為3秒。其中設定軌迹球的事件占比為50%。
7.–pct-nav 設定基本導航事件生成的百分比。基本導航事件是模拟方向性在裝置上輸入向上、向下、向左、向右的事件。(智能機沒有)
eg:adb shell monkey --throttle 3000 --pct-nav 40 -p com.tencent.news 100
或adb shell monkey -p com.tencent.news --pct-nav 40 --throttle 3000 100
向騰訊新聞發送1000次随機事件,每次事件間隔為3秒。其中設定基本導航事件的占比為40%。
7、調試選項(可以一次指定多個)
1.–ignore-crashes
或略(Porce&&close 強制關閉)
通常情況下,monkey會在測試應用程式崩潰或者發生異常後停止運作,若指定了該參數,則monkey将會在産生異常後,繼續向系統發送事件,直到指定事件全部運作完畢。
2.–ignore-timeouts
忽略ANP(程式無響應 逾時)
通常情況下,當應用程式發生任何逾時錯誤(application not responding)時,monkey将停止運作。若指定了該參數,則monkey将會在産生錯誤資訊後,繼續向系統發送事件,直到指定事件全部運作完畢
3.–ignore-security-exceptions
(應用程式權限錯誤)
通常情況下,指定應用程式發生許可錯誤時(如證書許可,網絡許可等),monkey将停止運作。若指定了該參數,即使應用程式發生許可錯誤,monkey會繼續向系統發送事件,直到指定事件全部運作完畢。
4、–ignore-native-crashes
忽略本地應用程式(Monkey崩潰),直到事件數執行完畢
5、–hprof
指定了該參數,Monkey會在發送事件序列的前、後,生成性能分析報告。通常會在data/misc目錄下生成一個5MB左右大小的檔案
6、–pkg-whitelist-file
–pag-blacklist-file(補充)
8、關閉monkey
第一步 adb shell ps #檢視所有程序
第二步 找出所執行launchable-activityname名的程序id
第三步 adb shell kill pid 殺死程序
9、Monkey錯誤資訊
其實我們比較關注的是app在使用過程中出現的錯誤資訊,像上面我們選擇忽略掉錯誤情況,這樣當monkey執行結束後,相關的資訊會被寫入到monkey檔案中,
但是錯誤資訊比如crash,anr等資訊會列印在dos視窗
,這些錯誤資訊會明确的指出哪裡發生的錯誤;如果需要複現,我們可以把忽略參數去掉,然後通過相同的seed值再次進行monkey測試,直到發生錯誤跳出monkey測試,
這裡我們也可以通過adb bugreport指令将手機運作日志導出來檢視,這裡面的資訊更詳細,包括出錯資訊。
//6.0及以下裝置
adb bugreport > bugreport.txt
//7.0及以上裝置
adb bugreport bugreport.zip
10.monkey腳本
1、意義
monkeyscript是monkey的腳本語言,能夠被monkey識别的指令集合,可以實作一些固定的重複性動作。Monkey可以通過指令加載腳本來進行測試,簡單友善。Monkey腳本如何編寫,官網并沒有介紹,我們隻能通過Moneky源碼去學習如何編寫腳本,可參考Monkey-Github的MonkeySourceScript.java類
type= raw events 腳本類型可以自定義 修改沒有意義
count= 1 腳本執行次數 修改沒有意義
speed= 1.0 腳本執行測試 修改沒有意義
start data >> 下面是腳本語言
腳本
LaunchActivity(pkg_name, cl_name)
2、腳本指令
1、LaunchActivity(pkg_name, cl_name): 啟動應用,第一個參數是包名,第二個是啟動的activity名
2、DispatchPointer(downtime,eventTime,action,x,y,xpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags) :向指定位置發送單個手勢,相當于我們把手指按在某個點上;這個方法參數有12個,但是我們主要關注owntime,eventTime,action,x,y這麼幾個參數,x,y表示按下的坐标,可以通過上一篇文章UI Automator擷取,這在你想測試點選某個具體view是很有用的
3、DispatchPress(keycode): 向系統發送一個固定的按鍵事件;例如home鍵,back鍵;參數是按鍵值 ,按鍵值可檢視keycode
UserWait:讓腳本的執行暫停一段時間,做一個等待操作
RotateScreen(rotationDegree, persist): 翻轉螢幕,第一個參數是旋轉角度,第二個是旋轉後是否停在目前位置
4、Tap(x, y) :單擊事件,點選螢幕,參數是點選坐标
Drag(xStart, yStart, xEnd, yEnd) :在螢幕上滑動,坐标是從哪一點滑到哪一點
5、LongPress(): 長按2s
6、ProfileWait(): 等待5s
7、PressAndHold(x, y, pressDuration) :模拟長按
8、PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟縮放
9、DispatchString(input): 輸入字元串
10、RunCmd(cmd) :執行shell指令,比如截圖 screencap -p /data/local/tmp/tmp.png
11、DispatchFlip(true/false) :打開或者關閉軟鍵盤
12、UserWait(sleepTime) :睡眠指定時間
13、DeviceWakeUp() :喚醒螢幕
腳本案例
type= raw events
count= 1
speed= 1.0
start data >>
LaunchActivity(com.android.mangodialog,com.android.mangodialog.MainActivity);
UserWait(1000);
# 按下
DispatchPointer(0,0,0,400,500,0,0,0,0,0,0,0)
# 擡起
DispatchPointer(0,0,1,400,500,0,0,0,0,0,0,0)
UserWait(1000);
Tab(500,300);
UserWait(1000);
DispatchPress(KEYCODE_ENTER)
UserWait(1000);
DispatchPress(KEYCODE_BACK);
UserWait(1000);
RunCmd(screencap -p /sdcard/tmp.png);
UserWait(1000);
Drag(0, 0, 500, 500);
UserWait(1000);
RotateScreen(90,1)
UserWait(1000);
DispatchString(www.baidu.com);
UserWait(1000);
DispatchPress(KEYCODE_BACK);
UserWait(1000);
- 腳本需要對照着MonkeySourceScript.java檔案編寫,這樣才能知道方法需要多少個參數,參數有什麼含義;同時要注意方法名是區分大小寫的,其實最重要的是腳本的編寫需要根據你的測試用例來寫,一步步怎麼操作就寫上對應的方法
- 因為Monkey是運作在裝置上的,是以需要将腳本先傳到裝置上,通過adb push d:\monkey.txt sdcard/monkey.txt 将檔案推送到手機sd卡上
- 最後通過adb shell monkey -f sdcard/monkey.txt -v -v 1 執行腳本檔案
- 用法參考這篇文章
- https://blog.csdn.net/qq_30993595/article/details/80748559