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"

       好了,今天關於日志就到這里了!

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

個人公眾號

微信群

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM