日誌是很是重要的,用於記錄系統、軟件操做事件的記錄文件或文件集合,可分爲事件日誌和消息日誌。具備處理歷史數據、診斷問題的追蹤以及理解系統、軟件的活動等重要做用,在開發或者測試軟系統過程當中出現了問題,咱們首先想到的就是她——logging。她可不像泰戈爾說的:「天空沒有留下翅膀的痕跡,但我已經飛過」;Monkey這個小姑娘,她但是一個愛炫耀,愛顯擺的人已經達到了人過留名、雁過留聲的境界。只要咱們按圖索驥就必定能夠定位到問題所在,而後分析問題,解決問題。好了逗你們一樂,下面開始進入今天的正題。html
Monkey日誌管理是Monkey測試中很是重要的一個環節,經過日誌管理分析,能夠獲取當前測試對象在測試過程當中是否會發生異常,以及發生的機率,同時還能夠獲取對應的錯誤信息,幫助開發定位和解決問題。這樣你就不會只停留在一個點點點的點工上,對本身也是一個很好的提高。java
當monkey測試時出現問題,此時咱們須要分析定位問題,咱們須要分析monkey日誌android
Monkey測試出現的異常的緣由:
通常是兩種緣由致使的,一個是crash 程序崩潰,致使crash緣由以下
a)、程序存在空指針
b)、cpu不足
c)、內存不足git
另外一種是ANR 程序無響應,致使anr無響應緣由以下:
a)、線程阻塞
b)、cpu不足
c)、內存不足shell
查找分析緣由:數據庫
1. 當monkey測試出現異常終止,請打開logcat日誌搜索關鍵字‘anrin’,若是存在該關鍵字,說明app出現了ANR異常,咱們須要把/data/anr目錄下的trace.txt文件取下來。
2. 取下來trace.txt文件後,將出現問題的進程號對應的日誌發給軟件工程師定位,若是在logcat日誌裏沒有搜索到’anrin’關鍵字,就搜索’nullpointer’異常關鍵字的上下日誌,發給開發定位
3. 當出現ANR後,須要導出,步驟以下:
1. 輸入adb shell
2. 輸入cd /data/anr/
3. 輸入ls數組
退出exit後,直接在cmd下輸入
4. adb pull /data/anr/traces.txt d:\trace.txt
5. 在logcat將出現anr問題的進程號複製,而後在trace.txt文件裏按ctrl+F 查找,粘貼進程號,查找對應的問題安全
☀ 僞隨機種子數與事件總數 :Monkey: seed=1519697645236 count=10 ☀ 容許測試包 :AllowPackage: 包名1 ☀ Category包含的LAUNCHER :IncludeCategory: android.intent.category.LAUNCHER ☀ Category包含的MONKEY :IncludeCategory: android.intent.category.MONKEY ☀ 查詢容許包的activity 結果列表 // Selecting main activities from category android.intent.category.LAUNCHER ☀ 這些都不是指定包的activity // - NOT USING main activity com.android.browser.BrowserActivity (from package com.android.browser) // - NOT USING main activity com.android.calendar.homepage.AllInOneActivity (from package com.android.calendar) // - NOT USING main activity com.android.camera.Camera (from package com.android.camera) .... ☀ 中間忽略,從這也能夠看出你手機上都安裝了哪些應用 ☀ 這個就是咱們指定的包的activity // + Using main activity 包名1.ui.portal.WelcomeActivity (from package 包名1) // Selecting main activities from category android.intent.category.MONKEY ☀ 種子爲1519697645236 // Seeded: 1519697645236 ☀ 事件百分比 // 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% ☀ 表示跳轉到com.crazyhornets.MyHokageAndroidZSY包中的com.crazyhornets.MyHokage.MyHokageActivity裏 ☀ 查看log中第一個Switch,主要是查看 Monkey 執行的是那一個 Activity,譬以下面的 log 中,執行的是com.yulore.yellowpage/.activity.SplashActivity, 在下一個swtich之間的,若是出現了崩潰或其餘異常,能夠在該Activity中查找問題的所在。 :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity;end ☀ 容許此Intent跳轉 // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily ☀ 如下就是事件間的延遲和發送的各類事件 ☀ --pct-nav事件 ☀ sleeping for 0 milliseconds這句 log 是執行Monkey測試時,throttle設定的間隔時間,每出現一次,就表明一個事件。(這個事件是指從用戶角度來講的一個事件,好比點擊:實際包括手指按下與擡起兩個動做,monkey日記將被記爲2個事件) Sleeping for 0 milliseconds :Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU :Sending Key (ACTION_UP): 82 // KEYCODE_MENU Sleeping for 0 milliseconds :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity;end // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily ☀ --pct-touch事件 Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(532.0,1392.0) :Sending Touch (ACTION_UP): 0:(542.04724,1391.5958) ☀ --pct-motion事件 Sleeping for 0 milliseconds :Sending Touch (ACTION_DOWN): 0:(838.0,113.0) :Sending Touch (ACTION_UP): 0:(852.82526,101.77225) ☀ --pct-trackball事件 Sleeping for 0 milliseconds :Sending Trackball (ACTION_MOVE): 0:(1.0,4.0) :Sending Trackball (ACTION_MOVE): 0:(-5.0,-3.0) ☀ --pct-rotation屏幕旋轉百分比 ####隱藏事件 : Sending rotation degree=0, persist=true : Sending rotation degree=1, persist=false: : Sending rotation degree=2, persist=true : Sending rotation degree=3, persist=false ☀ 注入事件10 Events injected: 10 ☀ 發送屏幕翻轉 度=0,存留=假 :Sending rotation degree=0, persist=false ☀ 丟棄:鍵=0,指針=0,軌跡球=0,鍵盤輕彈=0,屏幕翻轉=0 :Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0 ☀ 網絡狀態:佔用時間=42ms(手機0ms,wifi0ms,未鏈接42ms) ## Network stats: elapsed time=42ms (0ms mobile, 0ms wifi, 42ms not connected) ☀ 若是 Monkey 測試順利執行完成,在 log 的最後,會打印出當前執行事件的次數和所花費的時間Monkey finished表明執行完成。Monkey 執行完成的 log 具體以下: Events injected: 100:Sending rotation degree=0, persist=false:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0## Network stats: elapsed time=2042ms (0ms mobile, 0ms wifi, 2042ms not connected)// Monkey finished ☀ Monkey 執行中斷,在 log 的最後也能查看到當前大約已執行的次數 :Sending Trackball (ACTION_MOVE): 0:(-3.0,1.0):Sending Trackball (ACTION_MOVE): 0:(4.0,0.0) //[calendar_time:2018-04-02 11:23:50.322 system_uptime:718998] // Sending event #7500:Sending Trackball (ACTION_MOVE): 0:(3.0,-2.0) ☀ Monkey測試完成 // Monkey finished ☀ CRASH輸出LOG: // CRASH: cn.包名1 (pid 3165) // Short Msg: java.lang.IllegalStateException // Long Msg: java.lang.IllegalStateException: Fragment SingleChatFragment{366281} not attached to Activity // Build Label: Xiaomi/sagit/sagit:7.1.1/NMF26X/V9.2.4.0.NCACNEK:user/release-keys // Build Changelist: V9.2.4.0.NCACNEK // Build Time: 1516183841000 // java.lang.IllegalStateException: Fragment SingleChatFragment{366281} not attached to Activity // at android.support.v4.app.Fragment.getResources(Fragment.java:646) // at cn.yaomaitong.app.ui.message.fragment.SingleChatFragment$13$1.run(SingleChatFragment.java:586) // at android.os.Handler.handleCallback(Handler.java:754) // at android.os.Handler.dispatchMessage(Handler.java:95) // at android.os.Looper.loop(Looper.java:163) // at android.app.ActivityThread.main(ActivityThread.java:6365) // at java.lang.reflect.Method.invoke(Native Method) // at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) // at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791) ☀ ANR輸出LOG //NOT RESPONDING:com.android.quicksearchbox(pid 6333) ANR in com.android.quicksearchbox(com.android.quicksearchbox/.SearchActivity) CPU usage from 8381ms to 2276ms ago: procrank: ->adb shell procrank anr traces: ->保存於/data/anr/traces.txt meminfo: ->adb shell dumpsys meminfo Bugreport ->adb bugreport 可選經過 --bugreport 參數控制
1.monkey執行時未加--ignore-crashes
--ignore-crashes
參數,就先瀏覽日誌中Events injected: 值
,查看當前已執行的次數,就知道有無bug微信
2.程序無響應的問題:在日誌中搜索 「ANR」網絡
3.崩潰問題:在日誌中搜索 「Exception」 ,在這裏順便提一下常見的Java異常:
1 算術異常類:ArithmeticExecption 2 空指針異常類:NullPointerException 3 類型強制轉換異常:ClassCastException 4 數組負下標異常:NegativeArrayException 5 數組下標越界異常:ArrayIndexOutOfBoundsException 6 違背安全原則異常:SecturityException 7 文件已結束異常:EOFException 8 文件未找到異常:FileNotFoundException 9 字符串轉換爲數字異常:NumberFormatException 10 操做數據庫異常:SQLException 11 輸入輸出異常:IOException 12 違法訪問錯誤:IllegalAccessError 13 內存不足錯誤:OutOfMemoryError 14 堆棧溢出錯誤:StackOverflowError 15.其餘,請參考:https://www.cnblogs.com/cvst/p/5822373.html
1.找到是monkey裏面的哪一個地方出錯
2.查看Monkey裏面出錯前的一些事件動做,並手動執行該動做
3.若以上步驟還不能找出,可使用以前執行的monkey命令再執行一遍,注意seed值要同樣。
細心地小夥伴可能經過前邊的一系列操做和查找日誌定位問題,發現docs命令窗口在查看和操做的時候特別地不方便,那麼Monkey有沒有像Tomcat等其餘工具那樣有log日誌文件,很不幸告訴小夥伴們答案是:NO!,可是好消息是:咱們能夠將日誌導出到文件中。而後將文件導出到手機或者是電腦上。
C:\Users\Shuqing>adb shell monkey -v 100 >/sdcard/monkeylog.log 注意:不能寫成C:\Users\Shuqing>adb shell monkey -f /sdcard/kyb.txt -v 1 > /mnt/sdcard/monkey.log 不然會報錯「系統找不到指定的路徑」。 須要將手機鏈接PC,拷貝以上文件:咱們須要對這3個文件進行分析整理,以便提交開發人員處理。 固然了除了這種方法也比較麻煩,你能夠經過命令直接導出到PC電腦端
例如:保存到電腦上並命名爲monkey.txt >adb shell monkey [option] <count> >d:\monkey.txt eg: C:\Users\Shuqing>adb shell monkey -v -v 100 >d:\monkeylog.txt
以上的導出方法,導出日誌後,標準流和錯誤流的日誌混合在一塊兒,給咱們定位和分析問題又帶來麻煩了,所以須要將其分開導出保存。
標準流與錯誤流分開保存,代碼以下: Monkey [option] <count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt C:\Users\Shuqing>adb shell monkey -v 100 1>d:\monkey.log 2>d:\error.log 執行以上命令,Monkey的運行日誌和異常日誌將被分開保存。此時Monkey的運行日誌將被保存在monkey.txt文件中,而異常日誌將被保存在D盤下的error.txt中。
info.txt:主要記錄了MONKEY測試時發送的各類事件,如觸摸事件的位置等等。 error.txt:主要記錄了MONKEY測試時產生的一些ANR、強制關閉等異常。 LOG文件:主要主要記錄程序對MONKEY測試時的響應狀況。
一、-v 較少的日誌信息
二、-v -v 較爲豐富的日誌信息
三、-v -v -v 最高級別的日誌信息(推薦)
初步分析方法:
(1)、找到是monkey裏面的哪一個地方出現錯誤
(2)、查看monkey裏面出錯前的一些事件動做,並手動執行該動做
(3)、若以上步驟還不能找到,可使用以前執行monkey命令,再執行一遍,注意使用的seed值要同樣
測試結果分析:
(1)、ANR問題(程序無響應):在日誌中搜索「ANR"(application no response)
(2)、閃退問題:在日誌中搜索"crash"
(3)、異常:搜索"exception"
(4)、強制退出:搜索"force closed"
好了,今天關於日誌就到這裏了!
您的確定就是我進步的動力。若是你感受還不錯,就請鼓勵一下吧!記得點波 推薦 哦!!!(點擊右邊的小球便可)
我的公衆號
微信羣