基於代碼鏈路分析的精準測試體系

轉載:https://mp.weixin.qq.com/s/aik3CetmoOvP1jSHqGODiQ

1. "要不要測、要怎麼測?"引發的思考

    隨着優酷業務規模的增長,服務端的架構和功能趨近複雜化,代碼變更上線也越來越快,面對需要快速上線的功能,測試資源無法參與每個變更的交付過程,變更要不要測、要怎麼測?成爲服務端交付質量和效率最關鍵問題:
變更要不要測試?

  • 這次變更代碼有多少是空行、多少是註釋、多少是有效代碼,是不是對原有代碼邏輯產生了影響?
  • 這次變更方法是新增還是修改,變更方法的圈複雜度高不高、代碼耦合度高不高,是不是線上熱度調用方法?

變更要怎麼測試?

  • 這次變更影響了哪些業務邏輯、代碼鏈路,是否要做接口全量回歸測試?
  • 要能完整覆蓋這次變更影響的業務邏輯、代碼鏈路,需要執行哪些測試用例?

    面對這些問題,僅靠開發的提測文檔和常規的代碼分析,很難給出準確答案。爲此,優酷質量保障團隊開始了服務端精準測試的探索,經過半年的技術沉澱和體系搭建,形成了具備變更內容識別、變更影響分析、測試能力推薦、測試覆蓋評估的精準測試體系。

 

2. 基於代碼鏈路分析的精準測試體系

    精準測試本質上是一種基於變更分析的測試決策和評估的過程,要做好這個過程中,需要能準確的回答下面這個問題:變更了什麼內容、產生了什麼影響、需要做哪些測試、變更覆蓋夠不夠?從問題可以看到,變更內容、影響對象的定義是精準測試體系的基石,直接決定需要識別的變更對象和需要評估的影響對象,並基於識別、評估結論推薦相關測試用例,以及最終評估測試活動的覆蓋率。通過參考業界已有方案,也結合優酷的業務特性,我們最終確定了優酷精準測試體系的探索方向:基於代碼調用鏈路分析的精準測試體系。用一句話描述:
以應用Java方法爲觀測對象,通過靜態分析識別變更的Java方法,通過動態採集獲取線上Java方法調用鏈路,然後基於代碼知識庫的方法匹配,精準分析變更影響的Java方法調用鏈路,並基於影響的鏈路推薦測試流量,評估測試覆蓋率的測試體系
    在此,特別說明一下應用Java方法調用鏈路的定義:是指業務流量在應用內部處理過程中,產生的完整Java方法調用棧。我們認爲,相比外部子調用鏈路,Java方法調用鏈路更能代表業務場景和代碼邏輯,作爲變更影響、測試覆蓋率評估對象,具有更高的業務價值。

2.1 實現方案

    爲了實現通過變更內容識別變更方法,通過變更方法分析影響代碼鏈路,通過影響的代碼鏈路推業務流量作爲迴歸測試用例,既需要靜態代碼分析能力,能準確識別和分析變更內容。還需要能動態採集業務流量的請求參數、返回結果,代碼調用鏈路。然後以方法爲核心對象,準確建立變更內容、代碼方法、調用鏈路、業務入口、業務流量的關聯關係:

 基於不重複造輪子的原則,我們選擇通過螞蟻的Sparrow做靜態代碼分析,通過集團的Sandbox做動態流量採集,在此基礎上通過構建數據中心、決策引擎實現精準測試體系的支撐能力,並且通過平臺化提供給業務團隊接入使用。方案的整體架構如下:

2.2 數據中心

    主要是對靜態代碼分析數據、動態流量採集數據做結構化存儲,包括主幹代碼知識庫、變更代碼知識庫、流量知識庫。

  • 主幹代碼知識庫

    對應用主幹代碼做靜態分析,獲取應用全量方法的結構化信息,包括:方法簽名、方法修飾、方法註解、入參類型、返回類型、圈複雜度、耦合度。主幹代碼知識庫定義了精準測試體系需要的全部觀測對象(應用代碼的Java方法),將作爲後續變更方法匹配、變更方法風險評估、代碼鏈路採集方法篩選的統一知識庫


  • 變更代碼知識庫

    對變更分支代碼做靜態分析,獲取變更代碼的結構化信息,包括:變更文件、變更方法、變更代碼語義。首先通過變更代碼語義分析,能準確識別變更代碼行是空行、註釋、日誌打印、邏輯判斷,還是變量操作,從而計算有效變更代碼行數。然後通過匹配主幹代碼知識庫,獲取變更方法在代碼知識庫的唯一ID,爲後續變更影響分析和變更風險評估建立方法關聯關係

  • 流量知識庫

    動態採集業務入口的線上實時流量、線下測試流量,包括請求參數、返回結果、代碼調用鏈路。爲了獲取業務入口完整的代碼調用鏈路,需要給Sandbox配置需要採集的Java方法,爲此,我們首先定義了應用核心方法模型,然後通過匹配主幹代碼知識庫,可以實時分析出需要採集的核心方法,最後通過Sandbox對這些方法插樁和採集,從而獲取到流量進入應用內部後的完整代碼調用鏈路,如下圖:

2.3 決策引擎

    決策引擎對代碼知識庫、流量知識庫的做變更方法匹配和鏈路聚合分析,從而提供變更方法風險決策、變更鏈路測試用例推薦、測試覆蓋率評估能力

  • 代碼鏈路分析

    通過聚合分析應用過去一週的線上流量,可以獲取應用的全部代碼調用鏈路,然後通過匹配主幹代碼知識庫,獲取鏈路上每個方法的知識庫ID,最後以圖形結構(點、邊)對調用鏈路做結構化存儲,從而可以實時計算每條鏈路的長度、深度、熱度,以及從應用、入口、鏈路等維度,計算方法熱度、調用熱度

 

 

  • 變更風險決策

    以變更方法爲分析對象,基於代碼知識庫,可以獲取變更方法是否爲有效代碼變更,以及變更方法的圈複雜度、代碼耦合度等靜態分析數據。再基於代碼鏈路分析結果,可以實時獲取變更方法影響的代碼鏈路、鏈路熱度、方法熱度、調用熱度等動態採集數據。從而可以實現精準評估變更方法的風險等級和實際影響對象。爲此,我們建立了以下變更風險評估模型:

 

其中:M(r)爲方法變更風險值、M(c)爲方法圈複雜度、M(e)爲方法代碼耦合度、M(c,h)爲方法影響鏈路的熱度、M(h)爲變更方法熱度

  • 測試用例推薦

    基於線上代碼鏈路聚合分析結果,可以建立業務流量和代碼調用鏈路的關聯關係,再基於變更方法影響的代碼調用鏈路,就可以分析出變更影響鏈路對應的全部業務流量,從而實現基於代碼鏈路影響的測試用例推薦

 

 (如上圖所示,將爲代碼變更1推薦業務流量1、業務流量2,這些業務流量會被自動推薦給智能回放、自動化測試等迴歸測試任務)

2.4 平臺能力

    藉助優酷服務端研發效能平臺,我們將精準測試體系完備的基礎能力和海量數據化繁爲簡,可以爲業務同學提供更直觀的變更分析、場景分析、鏈路分析,以及通過智能回放、自動化測試提供更高效精準的迴歸測試能力。以下對部分核心功能做簡單說明和展示:

  • 變更分析

對Aone線下部署流程的每次構建做增量代碼分析,提供代碼變更內容、代碼變更影響面的展示和分析

  • 場景分析

通過對業務入口的請求參數、返回結果建立業務特徵,可以對採集到的全部業務流量做聚合分析,提供業務場景的特徵組合結果、熱度的展示和分析

  • 鏈路分析

通過建立代碼調用鏈路特徵標識,可以對採集到的全部代碼調用鏈路做聚合分析,提供代碼調用鏈路熱度、完整調用棧的展示和分析

  • 智能回放、自動化測試

將變更方法影響鏈路的業務流量推薦給智能回放、自動化測試等迴歸測試任務,提供精準迴歸測試能力,實現變更鏈路100%測試覆蓋

3. 核心能力解決方案

    藉助Sandbox、Sparrow提供的基礎能力,雖然可以快速實現靜態代碼分析和動態流量採集,但在實際落地過程中,還是遇到了很多基礎能力之外的技術挑戰,比如:

  • 由於採集機異常下線、採集限流等問題,導致採集流量無法有效覆蓋線上實際流量模型,導致應用代碼調用鏈路不完備
  • 由於人工配置採集方法的差異性,導致無業務意義方法(get\set等)被採集,而關鍵鏈路上的方法沒有采集,導致代碼調用鏈路不完整
  • 靜態代碼分析可以獲取變更文件、類、方法、代碼行信息,但不知道變更代碼語義,無法準確識別變更有效性,導致變更分析不準確

    爲此,在Sparrow、Sandbox基礎能力之上,優酷自研了流量採集智能調度、應用核心方法自動解析、變更代碼語義精準識別等創新解決方案,不僅保障了代碼調用鏈路採集完備性、提升了變更方法分析準確性,也實現了在無需人工介入的情況下,優酷服務端大規模接入精準測試體系。

3.1 代碼調用鏈路採集完備性

    要獲取應用完備的代碼調用鏈路,需要具備2個前提:採集流量有效覆蓋7*24小時全部時間段、採集方法有效覆蓋應用全部核心方法。

  • 流量採集智能調度

    要能採集應用線上全部代碼調用鏈路,就要保障採集流量的完備性,採集流量能有效覆蓋業務全天流量模型。爲此,我們首先構建了採集模塊自動運維的能力,應用接入火影后,平臺會實時監測採集機狀態,一旦發現採集模塊異常下線(應用彈性縮容、機器異常等原因),會再實時激活一臺採集機,從而保障採集模塊7*24小時在線。然後還構建了採集配置智能調度能力,我們將一天分爲48個採集調度窗口,每個調度窗口會根據入口當天入庫流量數、當前窗口入庫流量數,自動調整下個採集窗口的採集白名單和採樣率,從而不僅可以保障採集流量能覆蓋全天各個時間段,也有效解決了高QPS接口採集過量,低QPS接口採集不到流量的情況。整個過程完全由平臺自動調度,不僅極大降低了業務團隊採集模塊、採集配置的維護成本,也提升了採集效率和質量。


  • 應用核心方法自動解析

    Sandbox採集代碼調用鏈路,需要配置採集方法列表,這個對業務團隊接入提出了很大挑戰,配置方法太多,會導致採集鏈路過於複雜、無業務意義的鏈路噪音比較多,極大增加了變更分析成本。配置方法太少,會導致採集鏈路過於簡單,無法體現完備的代碼邏輯和業務場景。這些問題都讓精準測試體系變的不那麼”精、準“。爲此,我們通過靜態代碼分析,構建了應用代碼全量方法知識庫,結構化存儲了類、方法的全部基礎信息,然後通過建立核心方法模型:接口類的實現方法 + 圈複雜度大於5的方法 + 代碼耦合度大於0方法,實現了應用核心方法自動解析能力。相比人工配置採集方法,代碼調用鏈路完備性提升了50%(基於鏈路深度、鏈路長度做對比),變更方法採集率從30%提升到90%,保障了絕大多數變更方法都能分析出鏈路影響面。

3.2 變更代碼語義精準識別

    傳統靜態代碼分析可以知道變更文件、類、方法、代碼行等信息,基於這些信息分析出來的變更方法通常會比較多,但可能變更方法只是加了一些註解,或者減少了一些空行,這些方法變更並不影響代碼業務邏輯,並不需要測試關注。因此,要能準確識別變更有效性和風險,除了需要知道變更多了行,還需要知道變更代碼什麼內容。爲此我們藉助Sparrow變更代碼語義分析能力,通過獲取變更代碼完整的ast語義結構,能有效識別變更代碼是否是空行、日誌、註釋、變量操作、邏輯判斷等,從而實現了變更方法有效性評估。相比傳統靜態代碼分析結果,有效變更方法數量降低了30%,同時也避免了無效代碼改動對變更分析準確性的影響。

4. 落地效果和未來展望

4.1 落地效果

    通過升級優酷應用部署流程,可以支持在"測試准入"階段對構建產物實時分析,在”提交測試“階段提供變更分析結果和測試用例推薦,從而在無需人工介入的情況下,實現應用無感接入優酷精準測試體系。

並且對接了服務端提測流程,在提測單中可以直觀的看到提測變更的分析結論:

 

4.2 未來展望

    基於精準測試體系的代碼知識庫和變更分析能力,未來會在代碼質量治理、變更免測評估上面做更多的探索:

  • 代碼質量治理:利用主幹代碼知識庫和調用鏈路分析結果,持續治理3高(圈複雜度高、代碼耦合度高、線上調用熱度高)方法的代碼質量,提升優酷代碼健康分
  • 變更免測評估:基於變更代碼知識庫、調用鏈路分析結果、測試用例推薦結果,持續優化變更風險分析模型,減少低風險變更(變更方法圈複雜度低、線上調用熱度低、推薦用例覆蓋率高)對測試資源的佔用,提升服務端變更免測率

感謝

    優酷精準測試體系依賴Sandbox、Sparrow基礎能力的支持,對代碼分析和流量採集有興趣的同學可以參考:

  • Sandbox:https://github.com/alibaba/jvm-sandbox
  • Sparrow:https://gangfan.github.io/assets/papers/sparrow.pdf

 

 

 

 

 

 

 

 

 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章