Monkey随机性能压测初探(一)
Monkey介紹
Monkey程序由Android系統(tǒng)自帶,是Android SDK提供的一個命令行工具, 可運行Android模擬器和實體設(shè)備上。Monkey會發(fā)送偽隨機的用戶事件流,通過Monkey程序模擬用戶觸摸屏幕、滑動、 按鍵等操作來對程序進(jìn)行壓力測試,檢測多長時間發(fā)生異常、會Crash、以及內(nèi)存泄露檢測可稱為隨機測試或穩(wěn)定性測試。
Monkey 命令啟動方式: ?
a)可以通過PC機CMD窗口中執(zhí)行: adb shell monkey {+命令參數(shù)}來進(jìn)行Monkey測試?
b)在PC上adb shell 進(jìn)入Android系統(tǒng),通過執(zhí)行 monkey {+命令參數(shù)} 來進(jìn)行Monkey 測試 ? ?
c ) ?在Android機或者模擬器上直接執(zhí)行monkey 命令,可以在Android機上安裝Android終端模擬器
Monkey框架
Monkey命令基本參數(shù)
-p
用此參數(shù)指定一個或多個包。指定包之后,monkey將只允許系統(tǒng)啟動指定的app。如果丌指定包, monkey將允許系統(tǒng)啟動設(shè)備中的所有app。
指定一個包:adb shell monkey -p com.shjt.map 100 ??
指定多個包:adb shell monkey -p fishjoy.control.menu ?–p com.shjt.map ?100 ?
-v
用亍指定反饋信息級別(信息級別就是日志的詳細(xì)程度),總共分3個級別,分別對應(yīng)的參數(shù)如下 表所示:?
Level 0 ?: ?adb shell monkey -p com.shjt.map -v 100 ? ? ? ? ? ? ? // 缺省值,僅提供啟動提示、測試完成和最終結(jié)果等少量信息 ??
Level 1 ?: ?adb shell monkey -p com.shjt.map -v ?-v 100 ? ? ? ? ?// 提供較為詳細(xì)的日志,包括每個發(fā)送到Activity的事件信息
Level 2 ?: ?adb shell monkey -p com.shjt.map -v ?-v ?-v 100 ? ? // 最詳細(xì)的日志,包括了測試中選中/未選中的Activity信息
—s隨機數(shù)種子(沒有指定此值會默認(rèn)生成一個seed)
用亍指定偽隨機數(shù)生成器的seed值,如果seed相同,則兩次Monkey測試所產(chǎn)生的事件序列也相同的。 ?示例:
monkey測試1:adb shell monkey -p com.shjt.map –s 10 100
monkey測試2:adb shell monkey -p com.shjt.map –s 10 100
—throttle毫秒
每個事件的間隔時間3000毫秒
例:adb shell monkey -p com.shjt.map --throttle 3000 100 ??
?
實時測試
1、配好sdk、adb環(huán)境
2、手機連接電腦,開啟開發(fā)者模式和調(diào)試模式
3、adb devices查看設(shè)備連接情況
4、進(jìn)入要測試的app,查看包名
adb shell dumpsys window | findstr mCurrentFocus
adb shell dumpsys window w |findstr \/ |findstr name=
5、向app發(fā)送一些事件
向app發(fā)送10個隨機事件,adb shell monkey -p com.rabbit.doctor -v 10 ? ?僅提供啟動提示、測試完成和最終結(jié)果等少量信息
向app發(fā)送10個隨機事件,adb shell monkey -p com.rabbit.doctor -v -v 10 ?提供較為詳細(xì)的日志,包括每個發(fā)送到Activity的事件信息
向app發(fā)送10個隨機事件,adb shell monkey -p com.docrab.pro -v -v -v 10 ?最詳細(xì)的日志,包括了測試中選中/未選中的Activity信息
指定一個seed值-s 10,相同的seed值執(zhí)行的操作相同 ? adb shell monkey -p com.rabbit.doctor -v -s 10 10
向app發(fā)送100個隨機事件,每個事件間隔3秒 adb shell monkey -p com.docrab.pro --throttle 3000 -v -v -v ?50
向app發(fā)送10個隨機事件,并保存至路徑下adb shell monkey -p com.rabbit.doctor -v 10 >c:\monkeylog.txt
向指定設(shè)備device壓測 ? adb -s emulator-5554 shell monkey -p your.www.com -v 500 ?-s 加 device ? emulator-5554?
6、測試結(jié)果展示
C:\Windows\system32>adb shell monkey -p com.docrab.pro -v 100? ? ? ? ? ? ? ? ? ? ?//p表示指定測試程序,v表示monkey生成的詳細(xì)隨機事件名,100事件數(shù)
:Monkey: seed=1510018290134 count=100? ? ? ? ? ? ? ?//開始未指定時,隨機生成的seed值
:AllowPackage: com.docrab.pro? ? ? ? ? ? ? ? ?//包名
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:? ? ? ? ? ? ? ? ? ??//各種事件占的比例
// ? 0: 15.0%
// ? 1: 10.0%
// ? 2: 2.0%
// ? 3: 15.0%
// ? 4: -0.0%
// ? 5: -0.0%
// ? 6: 25.0%
// ? 7: 15.0%
// ? 8: 2.0%
// ? 9: 2.0%
// ? 10: 1.0%
// ? 11: 13.0%? ? ? ? ? ? ? ? ? ??//表示跳轉(zhuǎn)到com.example.android.apis 里面的ApiDemos這一個Activity里。
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.docrab.pro/com.squareup.leakcanary.internal.DisplayLeakActivity;end
? ? ? ? // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.docrab.pro/com.squareup.leakcanary.internal.DisplayLeakActivity } in package com.docrab.pro
:Sending Touch (ACTION_DOWN): 0:(501.0,218.0)
? ? ??// Injection Failed
:Sending Touch (ACTION_UP): 0:(492.16553,221.75143)
? ? ?// Injection Failed
:Sending Trackball (ACTION_MOVE): 0:(-2.0,-4.0)? ? ? ? ? ? ??//發(fā)送的一些動作,如點擊按下,點擊放開,移動。
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
:Sending Touch (ACTION_DOWN): 0:(462.0,51.0)
:Sending Touch (ACTION_UP): 0:(377.56924,0.0)
:Sending Trackball (ACTION_MOVE): 0:(1.0,-1.0)
:Sending Touch (ACTION_DOWN): 0:(451.0,1139.0)
:Sending Touch (ACTION_UP): 0:(445.72433,1140.6277)
:Sending Touch (ACTION_DOWN): 0:(717.0,464.0)
:Sending Touch (ACTION_UP): 0:(720.0,483.52737)
:Sending Trackball (ACTION_MOVE): 0:(-4.0,3.0)
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
:Sending Touch (ACTION_DOWN): 0:(684.0,69.0)
:Sending Touch (ACTION_UP): 0:(691.5189,169.68057)
:Sending Touch (ACTION_DOWN): 0:(376.0,1005.0)
:Sending Touch (ACTION_UP): 0:(382.10815,1030.8892)
Events injected: 100? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??//完成次數(shù)
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=2 trackballs=0 flips=0 rotations=0? ? ? ? ? ? ?//丟棄的,鍵=0,指針=2,軌跡球=0,翻轉(zhuǎn)=0。
## Network stats: elapsed time=327ms (0ms mobile, 0ms wifi, 327ms not connected)? ? ??//花費時間
// Monkey finished? ? ? ? ? ??//完成
?
Monkey日志分析
1、正常情況, ?如果Monkey測試順利執(zhí)行完成, 在log的最后, 會打印出當(dāng)前執(zhí)行事件的次數(shù)和所花費的時間; // Monkey finished 代表執(zhí)行完成\
2、異常情況? ??
Monkey 測試出現(xiàn)錯誤后,一般的分析步驟?
看Monkey的日志 (注意第一個swith以及異常信息等)
? ? ? ? ? 1. 程序無響應(yīng)的問題: 在日志中搜索 “ANR”,ANR: Application Not Responding 應(yīng)用程序無響應(yīng)。ANR一般有以下三種類型:
? ? ? ? ? ? ? ? ? ? ? ? ??1:KeyDispatchTimeout(5 seconds) --主要類型:按鍵或觸摸事件在特定時間內(nèi)無響應(yīng)
? ? ? ? ? ? ? ? ? ? ? ? ??2:BroadcastTimeout(10 seconds):BroadcastReceiver在特定時間內(nèi)無法處理完成
? ? ? ? ? ? ? ? ? ? ? ? ??3:ServiceTimeout(20 seconds) --小概率類型:Service在特定的時間內(nèi)無法處理完成
? ? ? ? ? ? ? ? ? ? ? ? ?
此外當(dāng)ANR問題發(fā)生后我們可以使用adb pull命令(此命令無需root權(quán)限)從被測設(shè)備的/data/anr目錄下導(dǎo)出名為traces.txt的對應(yīng)log文件。例子: adb pull /data/anr/traces*.txt > C:\ ??
? ? ? ? ? ? 2. 崩潰問題搜索 “CRASH”? ? ?
? ? ? ? ? ? ?3、異常問題搜索 “Exception”(如果出現(xiàn)空指針, NullPointerException,需格外重視,肯定有bug)。
? ? ? ? ? ? ?
? ? ? ? ? ? ? ?4、內(nèi)存泄露問題搜索"GC"(需進(jìn)一步分析)
? ? ? ? ? ? ? ? ? ? ? 1、當(dāng)手機提示Out of Memory(內(nèi)存不足)時基本確定有內(nèi)存泄露的問題。
? ? ? ? ? ? ? ? ? ? ? 2、當(dāng)查看logcat時有GC字段,可能有內(nèi)存泄露問題。
? ? ? ? ? ? ? ??與GC相關(guān)的字段有如下四個:
? ? ? ? ? ? ? ??GC_FOR_ALLOC 在分配內(nèi)存時內(nèi)存不夠引發(fā)
? ? ? ? ? ? ? ? GC_EXPLICIT 表明GC被顯式請求觸發(fā)的,如System.gc調(diào)用
? ? ? ? ? ? ? ? GC_CONCURRENT, 表明GC在內(nèi)存使用率達(dá)到一定的警戒值時,自動觸發(fā)
? ? ? ? ? ? ? ? GC_BEFORE_OOM, 表明在虛擬機拋出內(nèi)存不夠異常OOM之前,執(zhí)行最后一次回收內(nèi)存垃圾
?當(dāng)出現(xiàn)內(nèi)存泄露問題時可以加上--hprof參數(shù)再執(zhí)行一次monkey測試,便可獲得對應(yīng)的profiling報告。
如果指定了這個選項,monkey會在發(fā)送時間的前后生成app內(nèi)存快照文件,一般會在手機設(shè)備的/data/misc目錄下生成hprof的文件?!?data/misc ?需要root權(quán)限,可以在手機上安裝個RE查看或通過手機助手查看
? ? ? ? ? ? ? ??
BUG實例1:
BUG實例2:
?
?
adb指令:
關(guān)閉adb服務(wù) ?adb kill-server
開啟adb服務(wù) ?adb start-server
上傳文件:
adb push <本地文件><遠(yuǎn)程路徑> 例:adb push d:\3.txt storage/sdcard
下載文件:
adb pull <遠(yuǎn)程路徑><本地路徑> 例:adb pull storage/sdcard/3.txt d:\
輸出調(diào)試的信息:adb bugreport
?
android list targets ?#顯示系統(tǒng)中全部android平臺
adb install -r 應(yīng)用程序.apk ?#安裝apk程序
adb push D:Test.apk/syste/app/ ? #安裝apk程序
adb push D:file.txt/system/temp/ ? #向手機寫入文件
adb pull /system/temp/ D:file.txt ?#從手機獲取文件
adb logcat ?#查看日志
adb logcat | find "com.rabbit.doctor" >c:\hello.txt ?#記錄日志到電腦上
adb logcat -v time > ?d:/sss.log ? #當(dāng)前日志輸出到d盤的sss.log中
?
打印日志保存下來
adb logcat | find "com.koubeigongzuo.ck" >C:/logg.txt
實時監(jiān)控對應(yīng)app日志
adb logcat | find "com.koubeigongzuo.ck"
實時監(jiān)控對應(yīng)app報錯日志
adb logcat *:E | find "com.koubeigongzuo.ck"
顯示所有優(yōu)先級大于等于錯誤(Error)的日志
adb logcat *:E
顯示所有優(yōu)先級大于等于嚴(yán)重錯誤的日志
adb logcat *:F
查看安卓版本號
adb shell pm dump com.koubeigongzuo.ck | findstr "versionName
apk的應(yīng)用信息、版本信息
adb shell dumpsys package com.koubeigongzuo.ck
獲取應(yīng)用執(zhí)行時的內(nèi)存等相關(guān)信息
adb shell dumpsys meminfo com.koubeigongzuo.ck
點擊
adb shell input tap 250 250
滑動
adb shell input swipe 250 250 300 300
總結(jié)
以上是生活随笔為你收集整理的Monkey随机性能压测初探(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生物大分子的计算机模拟就业,生物大分子模
- 下一篇: 教师进修学校计算机教学反思,优秀教学反思