陳小雁 李雨江



摘要:為提高軟件測試效率,分析了代碼覆蓋率種類,探討了Java代碼覆蓋率工具ElcEmma的工作原理,并將其應用到Ja-va游戲實例中。應用情況表明,ElcEmma能有效地從不同層面定位代碼的覆蓋及未覆蓋情況,幫助開發人員設計出高質量的測試用例,有助于保障軟件測試工作的充分性。
關鍵詞:軟件質量;軟件測試;代碼覆蓋率;白盒測試;測試用例
中圖分類號:TP393文獻標識碼:A
文章編號:1009-3044(2020)05-0065-02
開放科學(資源服務)標識碼(OSID):
隨著現代信息技術的飛速發展,軟件普遍深入到人類日常生活的各個領域,發揮著重要的作用。與此同時,人們對軟件質量也越來越重視。軟件質量是軟件產品的生命線[1]。然而隨著軟件規模的不斷增長,程序復雜度不斷提高,由于不合理的設計和軟件開發人員的疏忽而致使軟件中隱藏的缺陷也越來越多,由此引發的軟件故障給國家、給企業帶來了不可估量的損失[2]。
在軟件開發領域中,軟件測試作為保證軟件質量的重要手段[3],貫穿于整個軟件的生命周期,發揮著越來越重要的作用。統計表明,在典型的軟件開發項目中,軟件測試的工作量往往占據軟件開發總工作量的40%以上,而在軟件開發總成本中,用在測試上的開銷高達30%_40%[4]。為了保證軟件質量,通常使用手工測試或自動化測試來運行并驗證某個應用系統的過程是否滿足規定的需求,并了解預期結果和實際結果之間的差異。
由于軟件測試工作在軟件生產過程中的重要地位,軟件測試得到了軟件工程研究人員和從業人員的廣泛關注,很多軟件自動化測試工具應運而生。根據測試應用的角度的不同,一般可分為白盒測試工具(動態測試,靜態測試)、黑盒測試工具(功能測試,性能測試)、測試管理(測試流程管理、缺陷跟蹤管理、測試用例管理)等幾大類[5]。這些軟件自動化測試工具能提高軟件測試的速度和效率,節省軟件測試成本,縮短產品發布周期,同時可以減少人工干預,避免人為原因給測試工作帶來的誤差,因而在軟件開發領域得到了廣泛應用[6-7]。本文探討了基于白盒測試技術的軟件自動化測試工具ElcEmma的原理和實際應用。
1 代碼覆蓋率分析
在軟件測試工作中,代碼覆蓋測試是測試的底線,能明顯提高軟件的可靠性,從而保證軟件的質量[8]。代碼覆蓋測試是軟件白盒測試的主要方法,利用它可在代碼層面定位測試過程中所找出的缺陷,發現被測程序的邏輯結構異常等缺陷信息,檢驗軟件測試充分性,是保證測試質量的有效方法之一[9]。該覆蓋測試技術采用代碼覆蓋率代表被測代碼的覆蓋程度,用于檢驗測試的完整性和充分性。代碼覆蓋率由測試過程中已被執行過的源代碼的數目來衡量,其值等于至少被執行一次的項目數/軟件中的項目總數。
代碼覆蓋程度的度量方式有很多種,如語句覆蓋、判定覆蓋、條件覆蓋和路徑覆蓋等。其中,語句覆蓋用于判斷軟件中的每條可執行代碼是否都被執行,不考慮分支和條件表達式的各種組合。判定覆蓋用于判斷軟件中的每一條判定分支是否被執行,它把所測試的判定分支作為一個整體,僅判斷該整體的真假值是否被測試到。條件覆蓋則用于判斷每一條判定分支中的每個子表達式(如果存在)的真假值是否被執行,但不考慮每個子表達式的真假值所構成的排列和組合。路徑覆蓋用于判斷函數的每一個分支是否都被執行,當函數有多個分支嵌套時,需要對多個分支進行排列組合。顯然,路徑覆蓋能將所有可能的分支都執行一遍,是這四種覆蓋中粒度最細的覆蓋。
2 ElcEmma工作原理
目前,主流程序開發語言C、C++、Ja-va、PHP等都有相應的代碼覆蓋率工具。其中,ElcEmma是一款基于Emma的Java代碼覆蓋率搜集及報告生成工具。它以Eclipse插件的形式在工作平臺中啟動,提供了很多與Eclipse緊密結合的功能。它既支持各種不同級別的代碼覆蓋,也支持與其他技術集成,因此廣泛應用于大型企業級別的項目中。
Emma提供了兩種方式來對被執行的代碼進行修改,即預插入模式和即時插入模式。EcIEmma僅使用了Emma的預插入模式來工作,即通過Emma定制的Class-loader類載入器對代碼進行修改,而不必提前修改軟件代碼和執行任何安裝。El-cEmma能夠直接分析代碼的覆蓋情況并在Java源代碼編輯器中高亮顯示,且能生成詳盡的覆蓋測試報告,使得開發人員能夠直觀、簡潔地掌握具體測試結果。
EcIEmma的具體工作過程為:首先把統計代碼插入已經編譯好的“.class”文件,生成“coverage.em”文件,自動搜集軟件中已測試代碼和未測試代碼的具體情況,從而計算出代碼覆蓋率的各項相關數據。接著在這些代碼覆蓋率數據的基礎上生成“coverage. ec”文件。最后根據coverage. em”文件和“coverage. ec”文件,生成HTML、XML、Text和Emma Session這些不同格式的代碼覆蓋率報告,以滿足測試人員的多種需要。
3 實例應用
本文應用EcIEmma工具對一個由JAVA語言開發的“貪吃蛇”游戲來進行代碼覆蓋測試。該游戲包含類和相關函數共計395行。首先設置測試用例1:一直使用右方向鍵,使蛇往右移動直到撞墻導致游戲結束。對應的EcIEmma代碼覆蓋率報告如圖1所示。
由圖1可以清楚、準確地看出整個類和各個函數的代碼覆蓋率、已覆蓋代碼行數和未覆蓋代碼行數等信息。其中,整個SnakxxGame類的覆蓋率為79.2%,而keyPressed函數的覆蓋率僅為41.5%,該函數尚有24行代碼未被覆蓋。雙擊圖1中的keyPressed函數,可以深入查看該函數的具體覆蓋情況,結果如圖2所示。
EcIEmma軟件將不同的覆蓋情況分別用不同的顏色高亮顯示。圖2中的綠色高亮顯示的代碼已經被完全被執行,黃色高亮顯示的代碼僅是部分被執行,紅色高亮顯示的代碼尚未被執行。從圖2可以直觀看出keyPressed函數未被測試用例1完全覆蓋到的相關代碼。
針對該情況,設置測試用例2:反復循環使用上下左右四個方向鍵,直到蛇撞墻導致游戲結束。用例2對應的EcIEmma代碼覆蓋率報告如圖3所示。
由圖3可知,keyPressed函數達到1000-/0的覆蓋率,而此時整個SnakeGame類的覆蓋率明顯增高,達到了95.4%。
4 結束語
本文研究了針對Java語言的代碼覆蓋率工具ElcEmma的工作原理,并以普及化的“貪吃蛇”游戲為例,根據EclEmma提供的代碼覆蓋率報告和代碼運行結果,有針對性地設置測試用例,顯著提高了游戲的代碼覆蓋率。實例應用結果表明,El-cEmma工具能有效地從不同層面定位代碼的覆蓋及未覆蓋情況,幫助開發人員準確地定位到那些特殊的、只有在特定情況下才被觸發的代碼,有助于開發人員設計出高質量的測試用例,切實提高軟件代碼覆蓋率,從而為軟件測試的完整性和充分性提供保障。
參考文獻:
[1]李舟軍,張俊賢,廖湘科,等.軟件安全漏洞檢測技術[J].計算機學報,2015,38(4):717-732.
[2]李麗媛,江國華.一種面向軟件缺陷預測的特征聚類選擇方法[J].計算技術與自動化,2018,37(2):126-131.
[3]史嬌嬌,姜淑娟,韓寒,等.自適應粒子群優化算法及其在測試 數據生成中的應用研究[J].電子學報,2013,8(8):1555-1559.
[4]劉琪,趙東東.高負荷條件下MBMS-GW功能測試的研究[J].電子測量技術,2014,37(7):27-31.
[5]鄧青華.軟件自動化測試工具研究[Jl.同濟大學軟件院,2011,10(1):57-59.
[6]朱少民,軟件測試方法和技術[M].北京:清華大學出版社,2014:1-90.
[7]牛璐.手機軟件自動化測試方法研究與應用[D].鄭州:信息工程大學,2012.
[8]浦云明,張杰敏,林穎賢.代碼覆蓋測試技術在MODE-S應答機中的應用[J].計算機應用與軟件,2008,25(7):131-133,148.
[9]馬云云,張弛,王金波,等.嵌入式航天軟件匯編代碼覆蓋測試方案[Jl.航天控制,2017,5(35):68-73.
【通聯編輯:梁書】
作者簡介:陳小雁(1996-),女,廣東汕頭人,嶺南師范學院數學與統計學院本科生,主要研究方向為軟件工程;李雨江,通訊作者。