Appium+python自動化(二十)- 猴哥失散多年的混血弟弟還是妹妹- Monkey(猴子)日誌(超詳解)
簡介
日誌是非常重要的,用於記錄系統、軟體操作事件的記錄檔案或檔案集合,可分為事件日誌和訊息日誌。具有處理歷史資料、診斷問題的追蹤以及理解系統、軟體的活動等重要作用,在開發或者測試軟系統過程中出現了問題,我們首先想到的就是她——logging。她可不像泰戈爾說的:“天空沒有留下翅膀的痕跡,但我已經飛過”;Monkey這個小姑娘,她可是一個愛炫耀,愛顯擺的人已經達到了人過留名、雁過留聲的境界。只要我們按圖索驥就一定可以定位到問題所在,然後分析問題,解決問題。好了逗大家一樂,下面開始進入今天的正題。
1.為什麼要看Monkey日誌管理
Monkey日誌管理是Monkey測試中非常重要的一個環節,通過日誌管理分析,可以獲取當前測試物件在測試過程中是否會發生異常,以及發生的概率,同時還可以獲取對應的錯誤資訊,幫助開發定位和解決問題。這樣你就不會只停留在一個點點點的點工上,對自己也是一個很好的提升。
2.Monkey Log分析:
當monkey測試時出現問題,此時我們需要分析定位問題,我們需要分析monkey日誌
Monkey測試出現的異常的原因:
一般是兩種原因導致的,一個是crash 程式崩潰,導致crash原因如下
a)、程式存在空指標
b)、cpu不足
c)、記憶體不足
另一種是ANR 程式無響應,導致anr無響應原因如下:
a)、執行緒阻塞
b)、cpu不足
c)、記憶體不足
查詢分析原因:
1. 當monkey測試出現異常終止,請開啟logcat日誌搜尋關鍵字‘anrin’,如果存在該關鍵字,說明app出現了ANR異常,我們需要把/data/anr目錄下的trace.txt檔案取下來。
2. 取下來trace.txt檔案後,將出現問題的程序號對應的日誌發給軟體工程師定位,如果在logcat日誌裡沒有搜尋到’anrin’關鍵字,就搜尋’nullpointer’異常關鍵字的上下日誌,發給開發定位
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 查詢,貼上程序號,查詢對應的問題
2.1Monkey結果分類
Monkey執行log輸出,按下列順序輸出
下面就是我貼出的詳細LOG分析:(表情代替註釋符號,以免跟日誌搞混)
☀ 偽隨機種子數與事件總數 :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 引數控制
3.快速從monkey.txt日誌中定位問題
3.1測試結果初步判斷
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
3.2找出問題後的操作步驟:
1.找到是monkey裡面的哪個地方出錯
2.檢視Monkey裡面出錯前的一些事件動作,並手動執行該動作
3.若以上步驟還不能找出,可以使用之前執行的monkey命令再執行一遍,注意seed值要一樣。
4.日誌匯出
細心地小夥伴可能通過前邊的一系列操作和查詢日誌定位問題,發現docs命令視窗在檢視和操作的時候特別地不方便,那麼Monkey有沒有像Tomcat等其他工具那樣有log日誌檔案,很不幸告訴小夥伴們答案是:NO!,但是好訊息是:我們可以將日誌匯出到檔案中。然後將檔案匯出到手機或者是電腦上。
4.1匯出方法
匯出到手機:
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測試時的響應情況。
5.日誌引數
1、-v 較少的日誌資訊
2、-v -v 較為豐富的日誌資訊
3、-v -v -v 最高級別的日誌資訊(推薦)
6.小結
初步分析方法:
(1)、找到是monkey裡面的哪個地方出現錯誤
(2)、檢視monkey裡面出錯前的一些事件動作,並手動執行該動作
(3)、若以上步驟還不能找到,可以使用之前執行monkey命令,再執行一遍,注意使用的seed值要一樣
測試結果分析:
(1)、ANR問題(程式無響應):在日誌中搜索“ANR"(application no response)
(2)、閃退問題:在日誌中搜索"crash"
(3)、異常:搜尋"exception"
(4)、強制退出:搜尋"force closed"
好了,今天關於日誌就到這裡了!
您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得點波 推薦 哦!!!(點選右邊的小球即可)
個人公眾號
微信群