一缚柏、Monkey簡介:
Monkey是Android中的一個命令行工具砾肺,可以運(yùn)行在模擬器里或者現(xiàn)實(shí)設(shè)備中凑术,向系統(tǒng)發(fā)送偽隨機(jī)的用戶事件流(點(diǎn)擊翩蘸、滑動、Application切換淮逊、橫豎屏催首、應(yīng)用關(guān)閉)實(shí)現(xiàn)對正在開發(fā)的應(yīng)用程序進(jìn)行壓力測試。monkey測試是一種為了測試軟件的穩(wěn)定性泄鹏,健壯性的快速有效的方法郎任。只針對Activity做測試,不能對Service做測試备籽。
簡單的理解:
Monkey 是一個 Android 自動化測試小工具舶治。主要用于Android 的壓力測試, 主要目的就是為了測試app 是否會Crash.
Monkey測試车猬,就像一只猴子霉猛, 在電腦面前,亂敲鍵盤在測試珠闰。 猴子什么都不懂惜浅, 只知道亂敲。通過Monkey程序模擬用戶觸摸屏幕铸磅、滑動Trackball赡矢、 按鍵等操作來對設(shè)備上的程序進(jìn)行壓力測試,檢測程序多久的時(shí)間會發(fā)生異常阅仔。
二吹散、質(zhì)量要求:
版本release(發(fā)布)前,Monkey跑出來的結(jié)果中crash要為0八酒,final release前空民,Monkey跑完的總次數(shù)應(yīng)為25W,結(jié)果里不允許有nullPointException出現(xiàn)羞迷。
三界轩、使用Monkey:
在cmd命令或者AndroidStudio中的Terminal中都可以使用adb(注意adb的位置,在SDK的tools文件夾下)
1衔瓮、首先需要將手機(jī)連接到PC浊猾,測試連接是否正常,找到adb的位置热鞍,一般在sdk的tools文件下 葫慎,找到位置然后輸入adb devices來進(jìn)行驗(yàn)證衔彻;
2、因測試多針對一個特定的APP包偷办,所以需要知道需要測試包的包名艰额;可以直接問開發(fā),也可以通過 adb shell pm list packages 列出所有包名來進(jìn)行查找
(不確定包是否已安裝椒涯,可以用adb shell pm list packages [options] <INTENT> 來進(jìn)行確認(rèn)柄沮,它的含義是列舉出所有包含<INTENT>的package。 e.g. adb shell pm list packages com.taobao.taobao)
3废岂、對特定APP包進(jìn)行測試的命令為adb shell monkey -p <pakage.name>
三祖搓、Monkey的基本參數(shù):
1、允許啟動手機(jī)里面所有的 App 泪喊, 隨機(jī)操作 1000 次
adb shell monkey 1000
2棕硫、-p : 允許啟動 App 的包名
- 啟動一個包名的應(yīng)用
QQ 的包名為: com.tencent.mobileqq
adb shell monkey -p com.tencent.mobileqq 1000
隨機(jī)操作 手機(jī) QQ 1000 次
- 啟動指定的多個 App
微信的包名為:com.tencent.mm
adb shell monkey -p com.tencent.mobileqq -p com.tencent.mm 1000
隨機(jī)操作 手機(jī) QQ 和 微信 1000 次
3、-v : 操作日志記錄
命令行的每一個-v將增加反饋信息的級別袒啼。
- -v:Level 0(缺省值)除 啟動提示哈扮、測試完成和最終結(jié)果之外,提供較少信息蚓再。
- -v -v :Level 1提供較為詳細(xì)的測試信息滑肉,如逐個發(fā)送到Activity的 事件。
- -v -v -v :Level 2提供更加詳細(xì)的設(shè)置信息摘仅,如測試中被選中的或未被選中的Activity靶庙。
adb shell monkey -p com.tencent.mobileqq -v -v -v 100
4、-s : 偽隨機(jī)數(shù)生成器的seed值
如果用相同的seed值再次運(yùn)行monkey娃属,將生成相同的事件序列六荒。
adb shell monkey -s 12345 -v 10
5、--ignore-crashes : 忽略操作是崩潰異常
通常矾端,應(yīng)用發(fā)生崩潰或異常時(shí)Monkey會停止運(yùn)行掏击。如果設(shè)置此項(xiàng),Monkey將繼續(xù)發(fā)送事件給系統(tǒng)秩铆,直到事件計(jì)數(shù)完成砚亭。
adb shell monkey --ignore-crashes -v 1000
6、--ignore-timeouts : 忽略超時(shí)
通常殴玛,應(yīng)用程序發(fā)生任何超時(shí)錯誤(如“Application Not responding”對話框)Monkey將停止運(yùn)行捅膘,設(shè)置此項(xiàng),Monkey將繼續(xù)發(fā)送事件給系統(tǒng)滚粟,直到事件計(jì)數(shù)完成寻仗。
adb shell monkey --ignore-timeouts -v 1000
7、--ignore-security-exceptions : 忽略程序發(fā)生許可異常
通常凡壤,當(dāng)程序發(fā)生許可錯誤(例如啟動一些需要許可的Activity)導(dǎo)致的異常時(shí)愧沟,Monkey將停止運(yùn)行蔬咬。設(shè)置此項(xiàng),Monkey將繼續(xù)發(fā)送事件給系統(tǒng)沐寺,直到事件計(jì)數(shù)完成。
adb shell monkey --ignore-security-exceptions -v 1000
8盖奈、--throttle : 插入固定延遲
在事件之間插入固定延遲混坞。通過這個選項(xiàng)可以減緩Monkey的執(zhí)行速度。如果不指定該選項(xiàng)钢坦,Monkey將不會被延遲究孕,事件將盡可能快地被執(zhí)行。
adb shell monkey --throttle 500 -v 500
隨機(jī)執(zhí)行 500 個事件爹凹,每個事件之間延遲 500 毫秒被執(zhí)行厨诸。
9、--help : 列出簡單的用法
adb shell monkey -help
四禾酱、將log日志文件保存到指定位置:
android studio 的terminal 下執(zhí)行命令并且將測試結(jié)果保存到指定文件下:
adb shell monkey -p 包名 -s 100 --ignore-crashes --ignore-timeouts 1000000 >C:\Users\dingchao\Desktop\testlog.txt
五微酬、日志分析:
1)正常情況:順利執(zhí)行完成, 在log的最后颤陶, 會打印出當(dāng)前執(zhí)行事件的次數(shù)和所花費(fèi)的時(shí)間颗管; // Monkey finished 代表執(zhí)行完成\
詳細(xì)分析參考:
http://blog.sina.com.cn/s/blog_44d19b500102vefp.html
http://blog.csdn.net/huangyabin001/article/details/38442359
2)異常情況:
其中adb shell procrank 查詢各進(jìn)程內(nèi)存使用情況;adb shell cat /proc/meminfo 查看當(dāng)前的內(nèi)存情況...
Monkey 測試出現(xiàn)錯誤后滓走,一般的分析步驟
看Monkey的日志 (為了進(jìn)一步分析問題的來源垦江,可以找到Log中出現(xiàn)問題處的前一次Switch,隨后根據(jù)Log主要是查看相關(guān)的Activity)
1搅方、程序無響應(yīng)的問題:在日志中搜索 “ANR”
可能原因:當(dāng)前有耗時(shí)操作在UI線程指定比吭,導(dǎo)致卡UI了;在5秒內(nèi)沒有響應(yīng)輸入的事件(例如姨涡,按鍵按下衩藤,屏幕觸摸);BroadcastReceiver在10秒內(nèi)沒有執(zhí)行完畢
2、崩潰問題:在日志中搜索 “Exception” (如果出現(xiàn)空指針绣溜, NullPointerException) 肯定是有bug
3慷彤、搜索"crash" 、"error"
Monkey 執(zhí)行中斷怖喻, 在log最后也能看到當(dāng)前執(zhí)行次數(shù)底哗;若以上步驟還不能定位問題,可以使用之前執(zhí)行的monkey命令再執(zhí)行一遍锚沸,注意seed值要一樣
可能出現(xiàn)Crash的場景
1)圖片放大縮小
2)輸入框無限輸入各種類型字符
3)快速操作
4)和系統(tǒng)的交互等等
什么時(shí)候會有Log文件的產(chǎn)生 跋选?Log的產(chǎn)生大家都知道 , 大家也都知道通過DDMS來看log 哗蜈, 但什么時(shí)候會產(chǎn)生log文件呢 前标?一般在如下幾種情況會產(chǎn)生log文件 坠韩。
1,程序異常退出 炼列, uncaused exception
2只搁,程序強(qiáng)制關(guān)閉 ,F(xiàn)orce Closed (簡稱FC)
3俭尖,程序無響應(yīng) 系枪, Application No Response (簡稱ANR) 鳍烁, 順便,一般主線程超過5秒么有處理就會ANR
4,手動生成 尸饺。
拿到一個日志文件鸟整,要分成多段來看 炼团。 log文件很長疲牵,其中包含十幾個小單元信息,但不要被嚇到 虑椎,事實(shí)上他主要由三大塊兒組成 震鹉。
1,系統(tǒng)基本信息 绣檬,包括 內(nèi)存足陨,CPU ,進(jìn)程隊(duì)列 娇未,虛擬內(nèi)存 墨缘, 垃圾回收等信息 。------ MEMORY INFO (/proc/meminfo) ------
------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------
------ PROCRANK (procrank) ------
------ VIRTUAL MEMORY STATS (/proc/vmstat) ------
------ VMALLOC INFO (/proc/vmallocinfo) ------
格式如下:
------ MEMORY INFO (/proc/meminfo) ------
MemTotal: 347076 kB
MemFree: 56408 kB
Buffers: 7192 kB
Cached: 104064 kB
SwapCached: 0 kB
Active: 192592 kB
Inactive: 40548 kB
Active(anon): 129040 kB
Inactive(anon): 1104 kB
Active(file): 63552 kB
Inactive(file): 39444 kB
Unevictable: 7112 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 44 kB
Writeback: 0 kB
AnonPages: 129028 kB
Mapped: 73728 kB
Shmem: 1148 kB
Slab: 13072 kB
SReclaimable: 4564 kB
SUnreclaim: 8508 kB
KernelStack: 3472 kB
PageTables: 12172 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 173536 kB
Committed_AS: 7394524 kB
VmallocTotal: 319488 kB
VmallocUsed: 90752 kB
VmallocChunk: 181252 kB
2零抬,時(shí)間信息 镊讼, 也是我們主要分析的信息 。
------ VMALLOC INFO (/proc/vmallocinfo) ------
------ EVENT INFO (/proc/vmallocinfo) ------
格式如下:
------ SYSTEM LOG (logcat -b system -v time -d *:v) ------
01-15 16:41:43.671 W/PackageManager( 2466): Unknown permission com.wsomacp.permission.PROVIDER in package com.android.mms
01-15 16:41:43.671 I/ActivityManager( 2466): Force stopping package com.android.mms uid=10092
01-15 16:41:43.675 I/UsageStats( 2466): Something wrong here, didn't expect com.sec.android.app.twlauncher to be paused
01-15 16:41:44.108 I/ActivityManager( 2466): Start proc com.sec.android.widgetapp.infoalarm for service com.sec.android.widgetapp.infoalarm/.engine.DataService: pid=20634 uid=10005 gids={3003, 1015, 3002}
01-15 16:41:44.175 W/ActivityManager( 2466): Activity pause timeout for HistoryRecord{48589868 com.sec.android.app.twlauncher/.Launcher}
01-15 16:41:50.864 I/KeyInputQueue( 2466): Input event
01-15 16:41:50.866 D/KeyInputQueue( 2466): screenCaptureKeyFlag setting 0
01-15 16:41:50.882 I/PowerManagerService( 2466): Ulight 0->7|0
01-15 16:41:50.882 I/PowerManagerService( 2466): Setting target 2: cur=0.0 target=70 delta=4.6666665 nominalCurrentValue=0
01-15 16:41:50.882 I/PowerManagerService( 2466): Scheduling light animator!
01-15 16:41:51.706 D/PowerManagerService( 2466): enableLightSensor true
01-15 16:41:51.929 I/KeyInputQueue( 2466): Input event
01-15 16:41:51.933 W/WindowManager( 2466): No focus window, dropping: KeyEvent{action=0 code=26 repeat=0 meta=0 scancode=26 mFlags=9}
3平夜,虛擬機(jī)信息 蝶棋, 包括進(jìn)程的,線程的跟蹤信息忽妒,這是用來跟蹤進(jìn)程和線程具體點(diǎn)的好地方 玩裙。 ------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------
------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------
格式如下 :
----- pid 21161 at 2011-01-15 16:49:01 -----
Cmd line: com.android.mms
DALVIK THREADS:
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 s=N obj=0x4001d8d0 self=0xccc8
| sysTid=21161 nice=0 sched=0/0 cgrp=default handle=-1345017808
| schedstat=( 4151552996 5342265329 10995 )
at android.media.MediaPlayer._reset(Native Method)
at android.media.MediaPlayer.reset(MediaPlayer.java:1218)
at android.widget.VideoView.release(VideoView.java:499)
at android.widget.VideoView.access6.surfaceDestroyed(VideoView.java:489)
at android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:572)
at android.view.SurfaceView.updateWindow(SurfaceView.java:476)
at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206)
at android.view.View.dispatchDetachedFromWindow(View.java:6082)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
at android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:2296)
at android.view.ViewGroup.removeAllViews(ViewGroup.java:2254)
at com.android.mms.ui.SlideView.reset(SlideView.java:687)
at com.android.mms.ui.SlideshowPresenter.presentSlide(SlideshowPresenter.java:189)
at com.android.mms.ui.SlideshowPresenterMethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
閑話少說, 我總結(jié)了觀察log文件的基本步驟 段直。 1吃溅,如果是ANR問題 , 則搜索“ANR”關(guān)鍵詞 鸯檬。 快速定位到關(guān)鍵事件信息 决侈。
2,如果是ForceClosed 和其它異常退出信息喧务,則搜索"Fatal" 關(guān)鍵詞赖歌, 快速定位到關(guān)鍵事件信息 枉圃。
3,定位到關(guān)鍵事件信息后 庐冯, 如果信息不夠明確的孽亲,再去搜索應(yīng)用程序包的虛擬機(jī)信息 ,查看具體的進(jìn)程和線程跟蹤的日志展父,來定位到代碼 墨林。
用這種方法,出現(xiàn)問題犯祠,根本不需要斷點(diǎn)調(diào)試 , 直接定位到問題酌呆,屢試不爽 衡载。
下面,我們就開始來分析這個例子的log 隙袁。
打開log文件 痰娱, 由于是ANR錯誤,因此搜索"ANR " 菩收, 為何要加空格呢梨睁,你加上和去掉比較一下就知道了 。 可以屏蔽掉不少保存到anr.log文件的無效信息 娜饵。
關(guān)閉Monkey
在monkey運(yùn)行中坡贺,斷開USB連接,mokey仍可繼續(xù)運(yùn)行
1. ps命令查找進(jìn)程
adb shell ps | grep monkey 返回來的第一個數(shù)字箱舞,即是monkey的進(jìn)程號
2.kill 命令結(jié)束進(jìn)程
adb shell kill [剛才查到的進(jìn)程號]