01.23 利用軟件重用經驗進行自動化測試推薦

利用軟件重用經驗進行自動化測試推薦

1 引用

Werner Janjic and Colin Atkinson . Utilizing software reuse experience for automated test recommendation. In Proceedings of the 8th International Workshop on Automation of Software Test, 2013, 100-106.

2 摘要

缺陷測試開發仍然是一個勞動非常密集的過程,其要求軟件工程師具備高級別的領域知識、專注度和問題意識。因此,任何可以在這一過程中減少人工勞動的技術都有潛力幫助顯著地減少軟件開發成本和時間消耗。實現這一目標的一個設想是重用已有測試用例中綁定的知識,以直接或間接幫助開發新軟件組件和系統的測試。雖然在過去的研究裡,軟件重用技術在學術界和工業界都獲得了很多關注,以前的研究集中在現有軟件的重用來寫新的產品代碼,而沒有聚焦測試推薦。在本文中,我們關注後者並提出一種新穎的自動化測試推薦方法,該方法從傳統軟件重用中吸取經驗教訓並在工程師開發測試時主動給出測試用例建議。相比之下,大多數現有的測試輔助工具以覆蓋評估和測試質量評估的形式提供測試開發者事後的幫助。我們的目標是為高效的軟件測試開發創建一個自動化的、非侵入式的推薦系統。在本文中,我們給出了基本實現方法,並呈現了我們的測試推薦系統在 Eclipse 上的原型實現。

3 技術介紹

在過去的十年中,由於大型開源軟件存儲庫的出現,尤其是針對代碼方面的軟件搜索引擎的生存能力得到了極大的提升。這為新一代推薦工具(尤其是代碼推薦系統)奠定了基礎,旨在通過消除對“重複造輪子”的持續需求來加速軟件開發過程。

我們的目的是構建一個用於軟件測試事前推薦的搜索工具,搜索工具所用資源庫包含了大約 200,000 個 Junit 測試文件。我們認為這些測試文件中存儲的知識是非常有價值的,可以用來幫助軟件開發人員更有效地創建測試。

3.1 單元測試搜索引擎

如清單 1 中所示的測試用例,該用例用於測試將十六進制數轉換為十進制數的 HexUtil 類。我們的系統首先對代碼進行編譯,之後對其抽象語法樹進行初始分析。然後識別出被測類(CuT)的接口。我們通過上述操作後提取如清單 2 所示的方法簽名,最後將結果進行收集並建立索引,創建索引後,將使用測試驅動的搜索技術來構建語義相關的測試用例的集群。

利用軟件重用經驗進行自動化測試推薦

要搜索測試,可以使用正則表達式或接口描述語言類似的語言。例如,如果開發人員想通過將 String 作為輸入參數並返回整數來測試將十六進制轉換為十進制數字的方法,則以下查詢就足夠了:hexToDecimal(String):int;

為了避免用戶必須學習複雜的查詢語言的情況,如算法 1 所示,我們實施了一種簡單的模糊搜索算法,該算法僅需要用戶從上方輸入即可。如果查詢結果大於用戶自定義需返回的結果數,則該查詢將不再進行模糊搜索。如果結果數不足,系統將進行模糊搜索。該算法在遞歸調用中定義了四種規則:1)搜索查詢語句的完全匹配 2)在方法名稱中添加通配符進行匹配 3)刪除方法,僅進行類名匹配 4)將通配符添加到類名進行匹配。

利用軟件重用經驗進行自動化測試推薦

搜索引擎返回所有匹配的測試用例,並附帶一個表,該表描述了被測方法以及輸入參數和返回值之間的映射關係。如圖 1 所示,第一列包含測試調用方法的名稱,第二列顯示返回值,第三列為調用的參數值。

利用軟件重用經驗進行自動化測試推薦

圖 1. SENTRE 截屏-單元測試搜索引擎

3.2 自動化生成測試推薦結果

為了能夠自動化的生成測試推薦結果,我們用到了上一節中提到的已分析測試用例的索引。我們的存儲庫中有大約 200,000 個從開源網站上收集的 JUnit 測試用例。其中進行測試推薦的基本流程如圖 2 所示。(1)開發人員編寫了一個類然後寫單元測試。(2)隨後,推薦系統對搜索與提供的被測類接口具有相似接口的測試用例。(3)並通過針對與搜索所獲取的測試相關聯的被測類執行開發人員的測試來判斷其適用性。通過此步驟的測試用例成為待推薦測試建議,(4)對這些建議進行排序並交付給用戶的 IDE。(5)由於測試是否適合還取決於用戶的測試行為。用戶檢查推薦的測試集,並決定應在其項目中重用哪些推薦結果。通過重用推薦結果並放棄其他建議,開發人員可以向系統提供反饋。系統會對該反饋進行自動分析,並用於提高推薦引擎的未來精度。

利用軟件重用經驗進行自動化測試推薦

圖 2. 測試推薦和重用流程圖

當前,我們設想開發人員可以重用測試用例的兩種可能情況:針對有狀態對象的重用測試用例,以及針對無狀態算法和功能的重用測試用例。

在面向對象的開發中,程序員創建的對象通常是有狀態的,因此通常無法通過簡單的單行斷言進行充分測試。測試有狀態對象取決於在其上下文中設置對象,將其屬性設置為某些值來進行初始化,並在最後定義一個或多個斷言以證明對象按預期執行。由於這是一個相當複雜的場景,所以最好在 IDE 內的單獨視圖中提供完整測試建議,而不是直接在代碼編輯器中執行單行或方法測試用例建議。

系統會根據各種標準對推薦結果進行評估、排名和展示。在我們的初步工作中,我們建議使用以下標準:

(1)執行順序一致性:有狀態的對象的幾個方法調用通常是不可交換的,並且在開發人員提供的測試與找到的測試之間的語句執行順序中存在高度重疊,因此結果的排名更高。

(2)接口相似度:在搜索過程中找到的測試所需接口與開發人員所測試的類的接口(理想情況下相同)越接近,推薦系統對其的排名就越高。

(3)測試執行成功率:可能發生圖 2 步驟 3 中的測試執行僅部分成功的情況,即所提供測試的一部分失敗。測試失敗的部分越多,推薦系統對其的排名就越低。

對於不考慮對象狀態的特定算法(即方法,過程等)的測試,有可能通過在純輸入輸出映射的級別上提供具體的測試建議來幫助開發人員。我們建議使用以下標準:

(1)覆蓋率–根據候選人對開發人員測試代碼覆蓋率的提高程度進行排名。

(2)測試相似性–如果開發人員測試中包含的模式(即斷言的順序和內容)與搜索引擎發現的測試相似,則在推薦列表中找到的測試排名較高。

3.3 測試推薦工具 Eclipse 插件

在本節中,我們將介紹我們開發的一個針對 Eclipse 的測試推薦插件–Test Tenderer。我們的目標是向開發人員推薦有用的測試用例,並幫助他們為正在開發的軟件編寫更好的測試代碼。因此,與傳統的代碼推薦系統一樣,不應該通過要求開發人員編寫任何其他規範或學習新的查詢語言來避免產生更多的開銷。Test Tenderer 無縫集成到 Eclipse 開發環境中,基本推薦過程的概述如算法 2 所示。

利用軟件重用經驗進行自動化測試推薦

後臺模塊分析正在進行測試項目的上下文並使用不同的啟發式策略來確定正在測試的類的細節。在包含 65,003 個測試文件的初始數據集上進行的初步實驗顯示,成功匹配了 56,930 個測試用例,有 87.5%成功匹配。對於剩下無法成功匹配的情況,系統會消除所有 JDK 標準導入,並嘗試在其餘的對象中識別出被測類。在測試的開發過程中,後臺模塊不斷監視用戶輸入的代碼,提取被測類上的所有方法調用,並保存方法的參數列表

利用軟件重用經驗進行自動化測試推薦

以及返回值

利用軟件重用經驗進行自動化測試推薦

後臺模塊之後進行可重用測試用例的搜索和測試推薦分析,最後進行測試用例推薦。

4 本文主要貢獻

本文主要貢獻是提出了一種自動化測試用例推薦方法,重用已有測試用例中綁定的知識,以直接或間接幫助開發新軟件組件和系統的測試。作者創建了一個軟件測試領域的自動化的、非侵入式的推薦系統並開發了基於 Eclipse 的使用插件。該系統建立了被測類接口與測試用例的關聯關係,存儲到索引庫中。之後系統會挖掘用戶在測試過程中的上下文信息,分析代碼的抽象語法樹並提取被測類中的方法接口信息。系統會根據提煉的方法接口信息在索引庫中檢索關聯的測試用例,最後通過設定好的策略排序和過濾後推薦給用戶。

致謝

感謝國家重點研發計劃課題:基於協同編程現場的智能實時質量提升方法與技術(2018YFB1003901)和國家自然科學基金項目:基於可理解信息融合的人機協同移動應用測試研究(61802171)支持!

本文由南京大學軟件工程系 2018 碩士生門鐸翻譯轉述。


分享到:


相關文章: