基於切片覆蓋過濾的測試代碼推薦系統


基於切片覆蓋過濾的測試代碼推薦系統

1. 項目意義

軟件測試是軟件生命週期中至關重要的一部分,而白盒測試是其中關鍵的一環。很多測試行業從業者均從白盒測試開始自己的職業生涯。對於白盒測試的學習,初學者往往通過書籍、網絡資料、在線課程等方式學習相關技術,並在本地開發環境中實踐。但整個學習週期過長、容易遇到學習壁壘的窘境讓很多初學者望而卻步,短暫的嘗試後選擇了放棄。因此如何降低白盒測試學習門檻、提高白盒測試學習效率、幫助初學者快速入門變得尤為重要。

現如今可以幫助初學者提高測試學習效率的工具都存在著些許不足。比如自動化測試用例生成工具生成的測試用例通常可讀性差,初學者理解生成的測試用例需要花費大量時間;覆蓋可視化工具提供的報告不夠清晰,初學者在學習過程中難免會無法理解為什麼測試用例未能覆蓋被測方法的某一行,而可視化工具僅可提示哪一行或者哪一個分支沒有覆蓋。與此同時,沒有配套網絡學習資源的本地開發環境,同樣會大大降低初學者的學習熱情和學習效率。為解決初學者測試學習窘境,一種快速高效的學習方式是提供一個在線的測試學習環境並採用推薦相關測試代碼片段的方式,幫助初學者理解被測代碼、引導初學者挖掘測試方向、指導初學者設計測試用例,進而提高初學者的白盒測試學習效率。

2. 項目內容

如何獲取高質量、可推薦的測試代碼片段是核心關鍵問題,為此我們藉助了慕測平臺。慕測平臺每年通過眾包和日常使用收集了大量可挖掘數據,其中白盒測試數據可幫助初學者從測試角度理解被測內容以及學習如何設計測試用例。提交數據的格式符合傳統Maven項目格式,項目中包括完整被測源碼文件和測試腳本文件。如圖1所示,我們通過將測試腳本分離切割即可得到一系列代碼簡潔、可讀性高的測試代碼片段,同時通過使用OpenClover覆蓋分析工具對每個測試代碼片段進行覆蓋分析即可得到相對應的測試覆蓋報告。最後提取出測試覆蓋向量並和代碼片段進行關聯,共同構成測試代碼片段推薦語料。用戶使用慕測WebIDE進行白盒測試編程練習時,通過實時運行項目,後臺實時計算得到測試覆蓋報告,通過將測試覆蓋報告轉化成測試覆蓋向量的形式,與語料庫中待推薦語料計算覆蓋向量相似度,系統即可實時推薦測試覆蓋互補的代碼片段,幫助初學者克服學習過程遇到的瓶頸,提高初學者測試學習效率。

基於切片覆蓋過濾的測試代碼推薦系統

圖 1. 慕測 TeSRS 總體架構

本文依託於慕測公司的WebIDE在線編程平臺,設計和實現了一個基於程序切片和測試覆蓋分析的測試代碼推薦系統TeSRS。將二者有機結合,為用戶提供便捷式、沉浸式的白盒測試學習環境。TeSRS的整體架構如圖2所示,共分為兩個流程、四個模塊。虛線以下為離線數據處理流程,用於構建測試代碼片段和測試覆蓋關聯關係的語料庫,為推薦流程提供數據支撐。虛線以上為實時推薦流程,包含實時代碼推薦模塊。在用戶進行白盒測試時,系統會推薦可讀性好、測試覆蓋信息豐富的代碼片段。各模塊詳細介紹如下:

(1)測試腳本切片模塊:該模塊使用了程序切片技術,對學生提交數據中的測試腳本進行分析和切片,得到一系列覆蓋信息豐富、有助於程序理解的優質測試代碼片段。該模塊具體處理流程為:首先,編譯項目產生測試腳本的字節碼文件;之後,使用Java Parser進行源碼分析得到切片入口點(Assert語句)所在代碼行和切片結束點(方法簽名)所在代碼行;接著使用Wala工具分析測試腳本的字節碼文件,產生系統調用圖SDG;最後,定位切片入口點和結束點在SDG上的位置,並進行圖遍歷和剪枝得到最終的程序切片。

(2)項目模板構建模塊:該模塊用於構建一個可結合代碼片段後可運行的項目模板。該模塊具體處理流程為:首先,整理切片用到的用戶測試腳本Maven項目包,使用Dom4j在pom.xml文件中添加OpenClover Maven插件;之後,通過AST分析測試腳本文件,刪除原測試腳本中所有@Test註解標註的測試方法得到測試模板;最後,從各個切片文件中讀取測試代碼片段,將讀到的測試代碼片段融入到測試模板中並進行保存備用。

(3)測試覆蓋分析模塊:該模塊對每一個測試模板項目使用OpenClover工具進行覆蓋分析。每個測試模板項目均產生一份測試覆蓋報告,該報告為Xml格式;之後,通過對Xml覆蓋報告中的覆蓋信息分析,得到該測試代碼片段包含的分支、語句測試覆蓋向量;最後,將得到的測試覆蓋向量和測試代碼片段進行關聯,通過事先準備好的ElasticSearch進行存儲,保證語料庫可以被更好的管理同時滿足實時推薦過程的高效查詢。

(4)實時代碼推薦模塊:該模塊會實時提取用戶產生的測試覆蓋報告,計算當前提交內容所覆蓋到的各個方法的覆蓋率,以百分制分數的形式存儲於數據庫中,通過判斷各個方法是否處於推薦閾值進行過濾;之後,使用方法簽名檢索ElasticSearch語料庫中的代碼片段;最後,使用學生提交數據的分支覆蓋向量、語句覆蓋向量和語料庫中測試代碼片段的測試覆蓋向量計算Jaccard相似度,選擇覆蓋向量互補的Top-K代碼片段返回給用戶,完成一次推薦過程。

3. 項目效益

用戶在進行白盒測試學習時,可通過瀏覽器直接訪問本系統,通過在線編程平臺慕測WebIDE進行白盒測試學習。慕測WebIDE提供的被測源碼覆蓋著色、測試代碼智能提示和語法錯誤檢測等功能可幫助高效提升用戶學習體驗。慕測TeSRS通過實時分析用戶每一次提交結果,提取測試覆蓋報告,並通過Jaccard算法計算測試覆蓋向量的相似度,檢索測試代碼片段語料庫,過濾得到對當前用戶有價值、有意義的測試代碼片段,最後推薦給用戶。TeSRS推薦的測試代碼片段可幫助用戶逐步提高測試覆蓋,並且有助於用戶理解源碼、開拓測試思路。

基於切片覆蓋過濾的測試代碼推薦系統

圖 2 實驗結果統計

為了驗證TeSRS是否可對初學者白盒測試提供有效幫助,我們通過邀請20位實驗人員在有無測試代碼推薦的場景下試用系統,並回答一系列問題,結論如圖3所示。首先,我們驗證了論文中方法得到的代碼片段和文本處理方式得到的代碼片段相比是否可讀性更好。實驗分別讓用戶比較3組複雜程度不同的代碼片段並給出1-5的可讀性評分,結果表明“程序切片”組代碼片段為253分,“文本處理”組代碼片段為180分,程序切片產生的測試代碼片段更被初學者所接受。接著用戶在有無推薦系統輔助的環境下進行對比實驗,驗證TeSRS是否可幫助用戶打開測試思路以及是否可幫助用戶提高測試學習效率,結果分別表明90%用戶表示本系統存在一定的實用價值,有助於白盒測試學習。

目前TeSRS已上線使用,並通過對慕測多年積累的測試代碼進行切片,構建了一個可供測試學習的代碼片段語料庫。本文通過實驗調研的方式,證明了TeSRS可提高初學者的白盒測試學習效率。在未來,我們計劃通過擴充測試代碼片段語料庫以及完善推薦策略兩個方面迭代系統,為初學者提供更好的測試學習體驗。

致謝

本文由南京大學軟件學院智能軟件工程實驗室 2018 級碩士生門鐸撰寫。

感謝國家自然科學基金項目:智能軟件系統的數據驅動測試方法與技術(61932012)支持!


分享到:


相關文章: