Android Monkey壓力測試使用

一缚柏、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

image
image
image
image
image
image

2)異常情況:

image
image
image

其中adb shell procrank 查詢各進(jìn)程內(nèi)存使用情況;adb shell cat /proc/meminfo 查看當(dāng)前的內(nèi)存情況...

image

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.access2100(VideoView.java:50) at android.widget.VideoView6.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.SlideshowPresenter3.run(SlideshowPresenter.java:531) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4627) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInitMethodAndArgsCaller.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)程號]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遍坟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晴股,更是在濱河造成了極大的恐慌愿伴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件电湘,死亡現(xiàn)場離奇詭異隔节,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寂呛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門怎诫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昧谊,你說我怎么就攤上這事刽虹。” “怎么了呢诬?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵涌哲,是天一觀的道長胖缤。 經(jīng)常有香客問我,道長阀圾,這世上最難降的妖魔是什么哪廓? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮初烘,結(jié)果婚禮上涡真,老公的妹妹穿的比我還像新娘。我一直安慰自己肾筐,他們只是感情好哆料,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吗铐,像睡著了一般东亦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唬渗,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天典阵,我揣著相機(jī)與錄音,去河邊找鬼镊逝。 笑死壮啊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撑蒜。 我是一名探鬼主播歹啼,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼减江!你這毒婦竟也來了染突?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤辈灼,失蹤者是張志新(化名)和其女友劉穎份企,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巡莹,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡司志,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了降宅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骂远。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腰根,靈堂內(nèi)的尸體忽然破棺而出激才,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布瘸恼,位于F島的核電站劣挫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏东帅。R本人自食惡果不足惜压固,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靠闭。 院中可真熱鬧帐我,春花似錦、人聲如沸愧膀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩淋。三九已至矿咕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狼钮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工捡絮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熬芜,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓福稳,卻偏偏與公主長得像涎拉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子的圆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容