背景
移動網際網路浪潮中,To C的移動應用疊代速度非常之快,應用的玩法也是層出不窮,那麼相應的對于應用品質的保障也提出了更高的要求:響應迅速、目标明确、手段有效等。品質保障團隊為了更好地達成上述要求,需要制定一系列的流程、系統或者工具來輔助測試的展開,但無論測試側要建立的是什麼,都有一個明确的原則貫穿始終,即有效性(由于流程、系統或工具等都用于測試,也稱為測試有效性)。
那麼如何來衡量測試有效性變得尤為重要,其評估體系的建設則是重中之重。本着從實踐中來到實踐中去的原則,建設了優酷用戶端測試有效性評估能力去輔助測試人員調整測試方向,改變測試政策等。
方案選型
不同團隊會定義自己的規則去衡量測試有效性,這些規則幾乎包羅萬象,例如:Bug數量和趨勢、測試用例的評審、測試政策的評審亦或代碼覆寫率的資料等等。
評價測試的有效性是無法脫離開發的實作及項目的上下文的,測試從來就不是獨立存在的,測試和開發密不可分。
結合優酷品質保障體系的現狀,我們優先選擇最直接的,也最能從資料化的角度評估測試有效性的規則入手:即代碼測試覆寫率。
代碼測試覆寫率工具(Android端)
- JaCoCo - 通過代碼注入的方式來實作擷取覆寫率的功能
- 優酷内部覆寫率采集工具 - 優酷自研的類覆寫統計工具
【工具對比】
工具名稱 | 代碼侵入 | 性能損耗 | 可否用于灰階釋出 | 統計範圍 |
JaCoCo | 需要侵入并針對每個子產品進行打包 | 性能損耗較大,可以會引入非功能性bug | 不可以用于灰階釋出 | 子產品、類、方法和行級别 |
優酷内部覆寫率采集工具 | 無代碼侵入且無須進行單子產品重新打包 | 幾乎無性能損耗,不會引入額外bug | 可用于灰階釋出,使用者無感覺 | 子產品和類級别 |
通過兩個版本的線下測試覆寫率資料的收集,優酷用戶端測試在類這個緯度上的覆寫率資料目前是不盡如人意的,目前隻有40%左右。
結合工具對比結論和用戶端測試現狀,優酷内部覆寫率采集工具作為目前的首選方案進行實施。
從宏觀到微觀地進行測試有效性分析。
整體架構及流程

參考上圖,具體擷取類是否被加載的流程概述如下:
- 通過Native層的ClassTable擷取所有ClassLoader的ClassTable對象
- 通過ClassTable對象擷取類名清單
- 通過libart.so中ClassTable的Lookup方法判斷類是被加載
整體方案的設計參考下圖:
示例結果
優酷用戶端測試平台
- 綜述結果
- TOP子產品類覆寫率對比結果
- 子產品細節對比資料
技術實作
1. 資料下載下傳與分析部分使用Python3開發完成
2. 30萬zip * (10萬-12萬)個類,分析統計時間在1小時左右完成。
分析機器為8*CPU,16GRAM Ubuntu20.04LTS
3. 主要包四個部分
- 資料反混淆邏輯
- 類覆寫統計算法相關
- 中繼資料下載下傳,基于pyspark對子產品與類調用次數進行分析統計
> 下載下傳邏輯基于multiprocessing與asyncio實作
> 程序間(下載下傳&分析)通信基于隊列實作
- 基于測試平台的任務建立與定時機制進行任務觸發
結果收益
- 建立了Android端主客子產品/類緯度的測試有效性評估手段
- 由于使用了線上代碼熱度分析機制,基于其性能無損性,可以直接用于日常自動化測試及灰階測試
- 有效地收集了優酷主客多個版本的測試有效性資料
- 有效地針對業務子產品進行測試覆寫優化
後續計劃
- 推動測試有效性分析能力落地優酷主客TOP子產品,提升單子產品覆寫率不低于10%。
- 全鍊路自動化,基于優酷用戶端測試平台進行的自動化測試專項任務,都可以進行測試覆寫率統計。
- 結合優酷主客技術圖譜進行覆寫率可視化輸出,更加直覺地展示測試鍊路覆寫情況。
- And more...