1. 程式人生 > >Appium+python自動化(二十)- 猴哥失散多年的混血弟弟還是妹妹- Monkey(猴子)日誌(超詳解)

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’異常關鍵字的上下日誌,發給開發定位 

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

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"

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

您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得點波 推薦 哦!!!(點選右邊的小球即可)

個人公眾號

微信群