Appium+python自動化(二十)- 猴哥失散多年的混血弟弟仍是妹妹- Monkey(猴子)日誌(超詳解)

簡介

   日誌是很是重要的,用於記錄系統、軟件操做事件的記錄文件或文件集合,可分爲事件日誌和消息日誌。具備處理歷史數據、診斷問題的追蹤以及理解系統、軟件的活動等重要做用,在開發或者測試軟系統過程當中出現了問題,咱們首先想到的就是她——logging。她可不像泰戈爾說的:「天空沒有留下翅膀的痕跡,但我已經飛過」;Monkey這個小姑娘,她但是一個愛炫耀,愛顯擺的人已經達到了人過留名、雁過留聲的境界。只要咱們按圖索驥就必定能夠定位到問題所在,而後分析問題,解決問題。好了逗你們一樂,下面開始進入今天的正題。html

1.爲何要看Monkey日誌管理

  Monkey日誌管理是Monkey測試中很是重要的一個環節,經過日誌管理分析,能夠獲取當前測試對象在測試過程當中是否會發生異常,以及發生的機率,同時還能夠獲取對應的錯誤信息,幫助開發定位和解決問題。這樣你就不會只停留在一個點點點的點工上,對本身也是一個很好的提高。java

2.Monkey Log分析:

當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 查找,粘貼進程號,查找對應的問題安全

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.日誌參數

一、-v 較少的日誌信息 
二、-v -v 較爲豐富的日誌信息 
三、-v -v -v 最高級別的日誌信息(推薦)

6.小結

初步分析方法:

(1)、找到是monkey裏面的哪一個地方出現錯誤

(2)、查看monkey裏面出錯前的一些事件動做,並手動執行該動做

(3)、若以上步驟還不能找到,可使用以前執行monkey命令,再執行一遍,注意使用的seed值要同樣

測試結果分析:

(1)、ANR問題(程序無響應):在日誌中搜索「ANR"(application no response)

(2)、閃退問題:在日誌中搜索"crash"

(3)、異常:搜索"exception"

(4)、強制退出:搜索"force closed"

       好了,今天關於日誌就到這裏了!

您的確定就是我進步的動力。若是你感受還不錯,就請鼓勵一下吧!記得點波 推薦 哦!!!(點擊右邊的小球便可)

我的公衆號

微信羣

相關文章
相關標籤/搜索