前言: 針對目前系列突出問題整理 發現幾類問題總容易被用戶吐槽 時間長了 就造成了重災區 針對重災區的重點分析就顯得尤其重要.css
通常有較大版本的更新、版本發佈後用戶反饋問題多、監控的崩潰率等明顯上升等狀況下 須要作專項測試html
一、崩潰類問題(anr 主線程加載>5s Java crash native crash)java
二、某場景下易卡頓( 掉幀 cpu問題)python
三、用戶反應使用過程當中相應太慢( 複雜場景冷啓動 交互影響 H5頁面加載)linux
四、發熱(硬件)android
五、兼容性(機型)web
...chrome
針對用戶反應的重災區進行分類後基本上歸爲幾類: shell
一、崩潰(Crash,弱網)
二、卡頓 (掉幀、gc、cpu) 數據庫
三、響應慢(啓動時間、交互響應、H5加載)
四、發熱 (cpu,mem、io、network、gps等硬件使用)
五、掉電快(硬件佔用)
六、兼容性問題 (機型覆蓋、迴歸)
...
解決方案:
APM方案:OneApm 聽雲 NewRelic
Crash分析:騰訊Bugly Fabric
LeakCanary:內存泄漏檢測方案
BlockCanary:UI卡頓檢測方案
弱網:測試雲服務
...
根據反饋問題指定專項測試策略:
一、崩潰 自動遍歷、monkey測試、橫豎屏切換、快速進退
二、卡頓 (掉幀、gc、cpu) 卡頓測試、內存泄漏測試、method profile
三、響應慢(啓動時間、交互響應、H5加載) 冷熱啓動、界面切換、h5性能測試
四、發熱 (cpu,mem、io、network、gps等硬件使用)
五、method profile、gc統計、io統計、流量統計、硬件使用統計、耗電量分析
六、兼容性問題 (機型覆蓋、迴歸) 兼容性測試、自動化測試、自動遍歷、monkey測試
1、App性能測試:
Android應用加載流程:
Android是基於Linux的開發的, 打開一個app,首先是liunx先建立一個進程, 併爲其分配內存等資源,
而後進入到Android的虛擬機層,ART ---applicationOncreat啓動一個主線程加載Activity會話 ActivityOncreat去加載資源(聯網,下載廣告,獲取基礎數據並渲染,第三方apk)
一、Activity 加載時間測試(只能計算出activity建立時間)
501 package='包名'
502 adb shell pm clear $package #清緩存
503 adb shell am force-stop $package #中止進程
504 adb shell am start -S -W $package/.view.WelcomeActivityAlias #啓動app 包名加主activity
507 adb logcat |grep "Displayed " #獲取Displayed數據
二、經過錄屏+拆幀計算響應時間 https://developer.android.google.cn/studio/command-line/adb#screenrecord
511 adb shell screenrecord /sdcard/demo.mp4 #開始錄屏
515 adb pull /sdcard/demo.mp4 #將錄屏pull到本地後 執行open
ffmpeg -i demo.mp4 -r 20 image-%03d.png # 使用黑盒工具ffmpeg 將mp4視頻文件拆幀,每50ms一幀;
ffmpeg -i demo.mp4
-b:v 640k demo.flv #使用黑盒工具ffmpeg將mp4文件轉換成flv格式,並將碼率設置成640kbps。
ffmpeg -i demo.mp4 -ss 00:00:09.85 -to 00:00:12.70 demo.gif #將視頻的第09.85到12.70時間段的圖片幀數製做成gif動圖
三、手機webview頁面性能測試 檢測工具:chrome://inspect
四、webview,H5頁面性能測試 (W3C 標準)
加載流程: Dns解析,主資源及附加資源加載,cs加載,js加載,頭圖
查看單個資源的性能:
五、接口性能: CDN DNS解析 HTTP JSON解析 download
···
2、崩潰測試, 能夠深度遍從來補充自動化測試 期間監控系統的logcat 實時上報錯誤信息
adb logcat *:S *:E | grep AndroidRuntime
508 adb logcat |grep -i displayed #找到哪一個應用啓動在首頁
adb shell ps |grep xxx.xxx.xx 找到進程號
512 adb logcat |grep 9744 |grep *:E 過濾進程中的錯誤信息
520 adb shell monkey -p com.xueqiu.android -v 5000
一、通常在發版前進行測試 使用mongkey appcrawler 進行遍歷測試
弱網可使用charles代理工具配置或者啓動模擬器時
$(which emulator) -avd [your-avd-image] -netdelay 20000 -netspeed gsm
二、場景測試:
後端接又問題:
弱網:徹底超時、2G、3G
接又返回異常:null返回
接又變動問題:字段類型變動
邏輯問題:
異步線程問題:打開新頁面再快速返回
邏輯處理不當:橫豎屏切換、先後臺切換
內存消耗:低內存、循環翻頁、執行可累計內存的操做
三、測試過程當中能夠創建監控體系, 將測試崩潰日誌上報留檔
日誌捕獲
外接sdk 如bugly
3、卡頓分析
通常是在頁面加載滑動的時候, 頁面的幀數來判斷頁面是否卡頓,通常標準是美妙不低於60fps
內存問題:(內存抖動、full gc)
cpu (計算耗時 計算佈局 控件大小應該如何渲染 計算完成後交給GPU完成渲染工做)
render (佈局複雜、overdraw在開發者選項中能夠直接配置,配置完成後,頁面會出現4中顏色來表示頁面的渲染複雜度)
一、打開頁面渲染複雜度
二、查看GPU的渲染分析, 頁面開啓渲染分析, 若是頁面有卡頓, 綠線以上部分表明大於16ms(可是不能表明卡頓,肉眼仍感受流暢)
查看硬件資源佔用:
adb shell dumpsys procstats --hours 3
adb shell dumpsys meminfo package_name|pid [-d]
adb shell dumpsys batterystats --charged package- name
adb shell dumpsys netstats detail
adb shell dumpsys gfxinfo package-name #繪製出界面幀的狀況 (獲取想要的包名adb shell pm list package |grep zhiyihealth)
janky 稱爲一次跳幀,繪製出現延遲.
三、使用頁面卡頓分析工具systrace來分析卡頓頁面
python 2.7.x only 使用pyenv管理python版本切換到2.7 pyenv global 2.7
505 find $ANDROID_HOME -name 'systrace.py'
506 cd /Users/wangjianqing/Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/systrace
./systrace.py -l 列舉全部支持的性能數據分類 ./systrace.py -t 10 收集10s左右的系統性能數據 ./systrace.py -t 10 -j 保存一份json數據文件用於編程分析
#運行systrace
python2.7 systrace.py
#等待開始提示
#操做app
#操做完成
#在systrace窗口內按enter
open trace.html 查看html報告
3、內存及CPU
pids=$(adb shell ps -ef | grep packageName | head -1 | grep -v grep | awk '{print $2}' | xargs | sed 's# #,#g')
#獲取要測試的package的pid 用逗號隔開
#adb shell top -n 1 -d 1 -p ${pids} 去掉-n 1能夠持續刷新
for((i=0;i<20;i++)); do
content=$(adb shell top -d 1 -p $pids -o %CPU,%MEM,NAME -n 1 -b | grep bili)
echo $content #經過linux的top命令每過一秒獲取一次cpu和mem的數據 -d 1 一秒刷新一次 -n 1只展現一次數據, -p 制定一個pid列表 -o輸出的結果顯示標題
cpu=$(echo "$content" | awk '{print $1}') #經過awk取cpu數據
mem=$(echo "$content" | awk '{print $2}')
echo curl -i -XPOST 'http://47.95.238.18:8086/write?db=android' --data-binary "cpu,user=$USER,app=bili value=$cpu" #將cpu和mem寫入到infludb數據庫中
echo curl -i -XPOST 'http://47.95.238.18:8086/write?db=android' --data-binary "mem,user=$USER,app=bili value=$mem"
done
監控平臺