軟件行業長期存在一個痛點,即測試效果無法度量。通常依賴于測試人員的能力和經驗,測試結果往往不可控,極端情況下同一個業務功能,即使是同一個人員在不同的時間段,測試場景和過程也可能不一致,從而無法有效地保障軟件產品質量。
質量總監總是抱怨:每一次版本發布時,時間并不是很充分,我們不確定這些需求代碼變動到底影響范圍有多大,無法精準地評估出測試范圍,要么執行完整的全回歸測試,花費大量的時間,嚴重影響交付效率;要么靠個人經驗和主觀能力,有選擇的驗證部分功能,很容易忽略出問題的業務場景,導致漏測現象和bug泄露。
測試人員總是抱怨:這個任務明明只需要改A需求,為啥會影響到B需求?咨詢對應的開發人員,反饋為所有功能都需要重測。
多年來,許多大型企業都嘗試過各種不同的方法,比如提升測試人員技能、標準化流程、加大需求評審的投資等等,但這些措施只能暫時緩解問題,最終軟件產質量還是不盡人意。
有沒有一種解決方案或者工具可以量化、數字化地解決這個問題呢?
先來回答一下什么叫精準測試,它涉及軟件測試、數據分析、機器學習等多個交叉領域。其目的是通過收集和分析測試數據,預測軟件缺陷的位置和嚴重程度,從而提高測試效率和準確性。
收集覆蓋面廣、質量高的測試數據是實現精準測試的基礎。測試數據包括測試用例、代碼變動、業務工單、API接口等所有過程數據,這需要采用自動化測試工具、人工測試等手段,在不同的測試階段獲取足夠的有效數據。同時,建立測試數據管理平臺,對測試數據進行分類、存儲、分析和共享,以便在測試過程中為測試人員提供支持。
基于機器學習和數據挖掘技術,分析歷史測試數據,挖掘出潛在的測試用例覆蓋不足和冗余。通過對測試用例進行優化,可以提高測試覆蓋率和降低測試成本。
通過對測試數據的分析,建立軟件缺陷預測模型。該模型可以根據測試數據預測軟件中可能存在的缺陷位置和嚴重程度,從而幫助測試人員優先處理高風險的缺陷,提高測試效率。
通過大數據和機器學習技術,為測試人員提供輔助決策支持。例如,在測試過程中,根據測試數據為測試人員推薦合適的測試策略、測試用例和缺陷處理方法等。
將測試數據進行可視化處理,使測試人員能夠更直觀、快速地了解軟件測試狀況??梢暬治隹梢詭椭鷾y試人員發現測試過程中的問題和改進方向,提高測試效果。
將需求、代碼、用例建立映射關系,通過數字化、可量化的數據判斷,實現代碼覆蓋率的可衡量性,從而提高測試效率,提高版本質量。
精準測試從2012年開始提出和發展,至今已經過了10年多的歷程,越來越多的企業發現它的價值點,但是落地卻很困難,行業內的質疑聲也一直存在,并沒有形成一個通用、完整的解決方案,無法適配不同公司的產品業務。
總結一下,難點主要有如下方面:
打造精準測試框架是解決這些難點的最重要和有用的方案。為了實現這一目標,我們可以圍繞三個核心特征來定義企業級平臺:平臺底座、價值變現和用戶體驗。
平臺底座是技術架構的基礎構建,它包括四個主要部分:數據采集、代碼插樁、正向追溯和數據存儲。
數據采集:通過過多種消息中間件,利用流量隔離的技術并行采集,自動化采集數據并入庫,提升執行效率,解決數據采集困難的問題。
- 使用調用鏈做流量隔離,實現并行采集,這也是精準測試落地到人工測試的基礎條件,其最大的優勢為:
- 使用類似kafka做消息管道,利用其高可靠,高性能的優勢,支撐了每秒百萬級的消息處理。
代碼插樁:使用JAVA Instrumentation,無侵入的對業務代碼插樁,在容器化基礎上,進一步標準化啟動腳本,只需修改環境變量即可控制是否插樁使用調用鏈數據或者Agent插件注入來形成插樁方式。
- 無侵入性:此技術不會改變業務代碼,不會對應用程序的功能產生負面影響。
- 靈活性:通過容器化、環境變量控制動態插樁的方式,可以在不修改代碼的情況下,根據環境輕松切換不同的插樁策略。
- 標準化和可擴展性:使用容器化技術和標準化啟動腳本,可以使插樁過程可復制,方便在多個項目或環境中應用。
正向追溯、反向追溯:通過數據采集和存儲建立的映射關系以及覆蓋率報告,可以更好地理解業務需求與代碼實現之間的關系,評估測試的效果,并擴展建立需求、用例、代碼片段(塊/行)和版本基線的基礎映射關系,通過正向追溯和反向追溯的方式增強項目管理、變更管理和持續改進的能力。
數據存儲:精準測試過程中會產生大量數據,鏈路結構的特性使得數據存儲和管理變得復雜。為了應對這種情況,建議使用非關系型數據庫進行數據存儲。例如,可以使用類似ElasticSearch、Neo4j、ClickHouse等數據庫來支持精準測試數據。這些數據庫能夠處理百億級別的數據量,并實時維護覆蓋率數據的追溯關系。通過使用這些數據庫,我們可以提高數據存儲和查詢的性能,更好地管理精準測試數據。
- 高性能:ElasticSearch具有強大的全文搜索功能和數據分析能力,而Neo4j則擅長處理圖結構數據,ClickHouse具備高壓縮比,低存儲成本,都是為處理大規模數2據和復雜查詢而設計的。
- 可擴展性:具有水平擴展的能力,可以隨著數據量的增加自動進行分片和負載均衡,確保系統的可伸縮性。
- 實時性:可以實時更新和查詢數據,對于需要實時反饋的場景非常適用。
- 開放性:開源組件,可以自由使用和定制,同時也提供了豐富的API和工具,方便進行二次開發和維護。
價值變現:精準測試平臺的價值主要表現在針對企業不同實際業務,通過多元化業務場景功能來實現。例如覆蓋率視圖等基本價值能力在此不再贅述,本段重點介紹代碼染色和用例智能推薦。
代碼染色:代碼染色是一種通過分析代碼邏輯和結構,為代碼片段賦予顏色標記的技術。精準測試平臺利用代碼染色技術,通過Bug泄露情況,代碼變動頻率等多種維度的數據聚合,將代碼中的重要程度直觀地展示出來,幫助開發人員快速發現和定位問題。同時,代碼染色還可以提示開發人員某些代碼片段可能存在的潛在風險,從而提前預防和解決潛在問題。
- 故障率維度:根據數據積累,每個故障泄露對應的代碼文件,可以定義文件引起的故障率,一般來講,此類高危定義的權重最高。
- 外部依賴維度:核心程序被調用情況,可以在一定程度上定義代碼的重要程度,通用的就是扇入扇出。
- 修改頻率:每個文件的修改頻率,在一定范圍內會影響Bug的泄露,一般修改頻率越高,引起問題的幾率會增大。
- 自身代碼復雜程度:代碼的易維護程度,越難維護出問題幾率越大,比如圈復雜度,重復代碼度。
用例智能推薦和變更范圍分析:常見的技術是使用建模語言(UML)和工具來創建業務模型、用例模型和代碼模型,通過類圖和業務模型之間的關聯來建立業務和用例與代碼之間的映射。
- 根據需求、用例和代碼變動,從追溯映射數據庫中智能匹配現有場景用例,用例最小集+有效場景覆蓋,并反饋給開發和測試人員,讓測試更清晰和準確,有效提升測試效率。
- 依據代碼變動片段信息,分析出關聯影響,提供變更的函數、接口、功能、菜單以及對應的業務列表,精準地評估影響范圍,同用例智能推薦融合使用。
用戶體驗:用戶體驗是精準測試落地的關鍵點,我們可以從易用性和交互性著手,盡可能的降低測試/開發的額外工作量,降低額外的資源和環境,開箱即用,從而幫助用戶提高工作效率、增強用戶滿意度、降低錯誤率,我們可以在下面兩個方面考慮:
系統快照:將用戶的測試操作,通過插樁和流量監控,形成step by step的測試用例。
- 一鍵生成文本測試用例。通過瀏覽器插件事件監聽API,流量監聽API,以及本地Gotest流量監聽工具,自動記錄人工測試的操作過程。
- 采集代碼覆蓋率信息。將文本用例,手工測試,代碼覆蓋率三者整合,可以很大程度上提高測試效率,豐富用例代碼關系庫。
插件能力:提供瀏覽器插件、任務單一鍵錄制、接口插件等能力,用戶無需額外投入學習成本,解決易用性低的痛點。
最終形成DevOps的全場景價值平臺,解決價值鏈單一問題,實現從數據版本匹配覆蓋率到整合需求任務單管理、嵌入DevOps流程,形成質量門禁和多維度度量統計視圖的全方位改進,實現全鏈路效率提升。通過精準測試完整體系,可以更高效地管理和監控軟件開發過程,提高軟件質量,降低開發成本,同時增強團隊協作和溝通。
采集側:考慮無調用鏈應用的接入,適配更多的業務產品情況,進一步提升精準測試的覆蓋范圍
易用性:易用性能力的進一步提升,在任務單處理環節,用戶可以一鍵式的采集流量信息;根據流量信息自動生成測試用例和測試快照,進一步提升測試效率
AI分析:用例推薦更加AI化,同GPT融合,能夠分析出有效用例
缺陷分析能力:基于業務場景、任務單、測試用例數據,能夠分析出漏測點,提示并補充測試