一、精準化測試是什麼?
傳統的軟件測試技術主要基於測試人員對業務的理解,但由於經驗與真實業務數據的差距,肯定會測試不充分,所以很多情況下,測試結果無法精確保證對軟件質量的定義和判斷。
精準化測試技術從字面理解,就是非常準確的測試,這意味着要用量化的數字説話。
精準化測試是一種可追溯的軟件測試技術。通過構建一套計算機測試輔助分析系統,對測試過程的活動進行監控,將採集到的監控數據進行分析,得到精準的量化數據,使用這些量化數據進行質量評價,利用這些分析數據可以促進測試過程的不斷完善,形成度量及分析閉環。
精準化測試的核心思想就是:使用非常精確和智能的軟件來解決軟件測試的問題,從根本上引領軟件測試從經驗型方法向技術型方法的轉型。質量的評估不再靠經驗,而是通過精準的數據來判定。
二、精準化測試的發展歷史
早在十年之前,測試行業就已經有很多人陸續投入精準化測試的技術研究。2019 年開始,精準化測試在業界大熱,其中,螞蟻金服的兩位同學周為、翟帥在 MTSC 測試開發大會上分享的《進擊的覆蓋率 —— 實時代碼染色技術》,可以説把精準化測試技術提到了一個新的高度,並迅速推動了在業界的應用普及。
百度利用覆蓋率增量從迴歸數據中提取有效覆蓋
精準定位用例數據與覆蓋率關係
代碼行為流建模
星雲測試
有贊集成測試覆蓋率統計實踐
螞蟻金服的代碼實時染色
三、核心技術:代碼調用鏈分析
常見的調用鏈分析方法主要有:
基於 AST 的語法樹分析
基於字節碼分析
調用鏈的動態分析方法:
基於 gdb/jdb 的調試器分析
jvmti/jvmpi
jvm-sandbox、bytebuddy、btrace 等工具
代碼覆蓋率其實是一種丟失了時序結構的調用鏈數據。調用鏈的本質是一種具備調用節點順序的列表,覆蓋率則是為了方便分析把列表降級成了集合。
調用鏈是一種圖結構,可以適當的簡化為樹結構方便分析(誰説測試不需要懂數據結構與算法的……)
我們根據代碼的調用鏈,根據一些真實的項目做了一個調用鏈的示意圖,方便大家理解。
調用鏈就是一種帶有分支的流程圖。測試工程師提到的調用鏈,與架構師提到的調用鏈並不完全相同。
比如類似 Skywalking、Zipkin 之類的全鏈路 Trace 系統是可以追蹤代碼的執行鏈路,多數可以到函數級別,而測試工程師要分析代碼的與業務之間的關係,需要追蹤到代碼行與分支級別。
四、用例與代碼關聯
建立關聯關係的步驟:
執行用例
獲取用例對應的代碼調用鏈
建模分析
精準化的關鍵,其實就是對業務、用例、代碼進行關聯建模並追蹤他們的變化。
首先建立業務、用例、代碼調用鏈三者的關聯數據表,可以簡單理解為 Python 的三元組,或者 Java 的hashmap。
如果業務不清晰,可以暫時用用例代替業務,如果調用鏈沒分析清楚,可以暫時用覆蓋率數據作為替代。
五、精準化測試應用場景
精準化測試的用途:
根據代碼變更定位用例範圍
更準確深入的覆蓋被測業務
白盒探索式測試
從線上數據反推有效測試用例
當新版本發佈的時候,代碼會發生變化(數據變化是另外一大話題,暫時忽略),首先分析代碼範圍,然後分析變化點散落在哪些用例中,這樣就可以重點關注被影響波及的測試用例集合,這樣比全面迴歸測試能更高效精準的發現問題。
同時根據新增代碼的變更範圍,我們也可以瞭解到我們漏測的部分,並加強未覆蓋新增代碼的測試驗證。在白盒層面我們就可以建立起來具備快速探索與反饋的測試活動,有效避免漏測。
同樣利用線上的數據,也可以幫助我們反推測試用例,比如百度曾經就利用覆蓋率拆分技術,把為期2天的全量回歸測試優化為 2 個小時的迴歸測試。把每個測試用例對應的覆蓋率或者調用鏈拆分,根據覆蓋率的不同可以自動劃分為不同的等價類,從每個等價類集合中取少數代表性用例即可。通過這種方式,可以有效彌補人工設計用例的不足。
六、打造自己的精準化測試平台
越來越多的公司開始招聘測試開發工程師,甚至是通過研發工程師來設計自己的精準化測試平台。精準測試雖然起源於測試團隊,但是他的應用價值是超越測試,橫跨整個產品開發團隊的,所以精準化測試的平台會是大勢所趨。
為了照顧很多中小公司的同學,霍格沃茲測試學院為大家研究出了一套簡化的、適合中小公司使用的平民版精準化測試技術體系,可以用來簡單的實現精準化測試方案:
使用 SonarQube 作為覆蓋率與測試用例的分析平台
使用 JaCoCo 作為代碼覆蓋率的分析工具
使用 JaCoCo-cli 實現對單個用例的覆蓋率收集
使用 Scanner 完成覆蓋率導入
調整 SonarQube 平台中覆蓋率展示的信息,加入關聯測試用例的展示,方便在未覆蓋的代碼附近可以找到最接近的測試用例
總結一下,精準化測試不僅僅是測試左移的技術,它同時也可以是一種測試右移的實踐。
線上數據的提煉、線上用户的調用鏈分析,也會逐漸成為未來線上測試的一種趨勢,到時候就會需要一些強大的大數據平台做質量分析。