萬東燕, 羅睿梅, 李俊山, 陳 鋮
(上海無線電設備研究所,上海201109)
軟件測試[1]是軟件研發(fā)過程中的一個重要環(huán)節(jié),通過軟件測試可以及時發(fā)現軟件缺陷,保障軟件的安全性和可靠性。單元測試是軟件開發(fā)過程中最基礎的測試項,是軟件的獨立單元在與程序的其他部分相隔離的情況下進行的測試。其中代碼覆蓋率能夠體現代碼的執(zhí)行情況。測試人員可以通過覆蓋率指標,分析代碼執(zhí)行范圍,完善測試用例,有效提高軟件測試質量。
在軟件測試的過程中,執(zhí)行單次的測試用例時,某些函數的輸入變量激勵會在代碼執(zhí)行過程中發(fā)生動態(tài)變化。若測試用例中的輸入變量激勵不能對應進行動態(tài)更新,則需激勵更新才能進入的相關語句無法完成測試,代碼覆蓋率測試也無法完成。為了解決這一問題,測試人員需要在設計的測試用例中模擬輸入變量激勵的變化條件,來完成測試。本文結合專業(yè)的測試工具,研究了變量激勵可動態(tài)更新的樁函數賦值法,并設計靈活的測試用例,以保障測試質量、提高測試效率。
單元測試的主要目的是驗證軟件單元是否滿足詳細設計規(guī)格說明,發(fā)現需求和設計中的錯誤。測試用例是影響單元測試效率和效果的重要因素[2]。本文采取黑盒與白盒結合的方法對軟件進行測試。利用黑盒測試方法中的等價劃分法和邊界值分析法來設計測試用例。等價劃分法[3]基于輸入條件的等價類評估,在每個等價類中選取有代表性的測試用例,從而達到等價類覆蓋的要求。由于程序錯誤常在定義域和等價類的邊緣被發(fā)現,所以需要對每個測試變量進行邊界值分析。邊界值分析[4]是等價類劃分的精煉,即選擇每個類的邊界或終點進行測試。
覆蓋率是軟件開發(fā)過程中重要的度量指標,具體包括語句覆蓋、分支覆蓋、條件覆蓋等。覆蓋率測試[5]作為一種白盒測試,其主要作用包括:a)評估測試質量,根據軟件代碼的覆蓋率報告,發(fā)現漏測場景,為測試人員及時補充新的測試用例提供指導;b)幫助識別冗余代碼,對程序代碼進行優(yōu)化與重構。
Testbed是一款專業(yè)的軟件測試工具,可用于生成和維護測試腳本,編譯并運行測試可執(zhí)行程序,查看測試結果和覆蓋率數據。其中,Testbed/TBrun模塊可執(zhí)行軟件的單元測試[6]。該模塊可以在運行測試用例對軟件功能進行測試的同時,分析得出軟件單元相應代碼的測試覆蓋情況,評估測試狀態(tài),從而為設計新的測試用例提供指導。
(1)單元測試環(huán)境
為了方便對嵌入式軟件進行單元測試,在測試前首先要去除代碼中的硬件相關部分,將其移植到Testbed相應的測試環(huán)境中。移植的過程不會影響軟件的功能,測試環(huán)境與現實環(huán)境差異不大,能夠確保測試的有效性和可靠性。
單元測試的對象是不可獨立運行的函數單元。測試時需要建立兩種輔助測試模塊:驅動模塊(driver)和樁模塊(stub)。驅動模塊用于模擬被測函數的上層模塊,樁模塊用于模擬被測函數在執(zhí)行過程中所調用的其他函數,以保證被測單元能完整閉合地運行。在單元測試中,被測函數可能調用多個其他函數,故可能存在多個樁函數。
(2)樁函數
樁函數是根據測試需要編寫的,用于替代被測函數調用的函數。樁函數有兩種情況:一是該樁函數在被測函數中不需要返回特定值,不需要作其他處理;二是該樁函數在被測函數中需要返回特定值,不同返回值會影響代碼運行與輸出結果,需要根據測試需求,在Testbed/TBrun模塊中進行相應的返回值設置。
在樁函數中設置返回值時,通常只支持輸入變量激勵的一次性靜態(tài)賦值,在代碼的運行過程中不能進行修改。由于這一局限,導致無法直接對在單次執(zhí)行過程中需多次變更輸入變量激勵的函數進行測試。同時這一問題會在覆蓋率測試中反映,由于對應的分支和語句無法被執(zhí)行,所以覆蓋率測試也無法完全完成。為了解決這一問題,需要分析進入不同分支的變量激勵的更新要求,并設計可動態(tài)更新的樁函數返回值,來模擬進入相應分支的條件,完成測試。
以某數字信號處理軟件為例,測試其誤差處理函數DJDMBJC時,需要調用函數Find Max-Point來獲取并返回最大值變量max_data。在測試軟件運行過程中,函數Find Max Point中變量max_data的值會在執(zhí)行過程中動態(tài)更新,軟件通過判斷變量值所在范圍,進入相應程序分支,相關程序流程如圖1所示。
圖1 誤差處理函數測試程序流程圖
由圖1可知,該段代碼調用了兩次函數Find-MaxPoint,并讀取max_data的值,判斷該值并進入對應的執(zhí)行語句。對函數DJDMBJC進行測試時,若要到達第二個判斷框,則需在第一個判斷處進入“否”分支,即滿足max_data≤12。在該前提下,若max_data的值無法更新,則只能進入第二個判斷框的“否”分支,而無法進入與“執(zhí)行語句2”對應的“是”分支,無法對該段代碼完成測試覆蓋。因此,在測試中,需要研究樁函數返回值的設置方法,實現輸入變量激勵的動態(tài)更新。
為了解決2.1節(jié)中由于被測單元函數所調用樁函數的輸入變量激勵值無法更新,導致覆蓋率測試不能完成的問題,提出一種樁函數返回值動態(tài)賦值方法。根據Testbed/TBrun模塊中樁函數的代碼運行方式,在樁函數的后臺代碼段中構造并聲明一個整型變量count,用來記錄不同賦值點的位置。位置i對應的返回值ai即為該時刻的變量值,當函數運行到count值所對應的位置i時,將返回值ai賦值給變量max_data,從而實現被調用的樁函數輸入變量激勵的動態(tài)更新。具體實現過程如圖2所示,其中n代表變量激勵動態(tài)更新的次數。
將上述方法應用于2.1節(jié)函數DJDMBJC的測試用例設計。執(zhí)行改進后的測試用例,將兩次調用樁函數后的變量max_data激勵值從11更新為13,即可先進入圖1中的第一個“否”語句,再進入第二個“是”語句,實現不同分支的全部執(zhí)行。
圖2 樁函數返回值動態(tài)賦值程序流程圖
本文被測軟件中,變量max_data的取值范圍為0~25。由判定條件max_data>12可知,12為判斷邊界值,即該變量的邊界值為0,12和25。對變量進行等價類與邊界值分析,結果如表1所示。
表1 等價類與邊界值分析
由圖1可知,當max_data≤12時,程序會進入第一個“否”分支,然后對已更新的變量max_data值進行第二次判斷。因此,在進行邊界值測試時,要考慮兩次函數調用時變量的判斷邊界。結合變量max_data的判斷邊界,對測試用例進行覆蓋有效等價類和邊界值測試與覆蓋無效等價類和邊界值測試分類,實現程序邊界的完整分析與覆蓋,測試用例設計如表2所示。其中max_data_1和max_data_2分別代表第一和第二個判斷框對應的max_data的值。通過對兩處的max_data進行分類賦值,即可達到函數功能以及語句與分支的全部覆蓋。
執(zhí)行改進的測試用例前后,函數DJDMBJC的測試覆蓋率如表3所示。在函數DJDMBJC的測試過程中,執(zhí)行改進的測試用例,語句與分支判定的覆蓋率分別由90%、93%提高到100%,解決了函數測試分支無法到達的問題,實現了該函數的覆蓋率測試,提升了測試質量。
表2 測試用例表
表3 函數DJDMBJC測試覆蓋率 %
本文以Testbed軟件為測試工具,提出了變量激勵可動態(tài)更新的樁函數返回值設計方法,解決了單元測試中語句和分支覆蓋率測試不全的問題。結合等價類劃分與邊界值測試,設計全面且高效的測試用例,有效地精簡了測試用例個數,提高了測試用例設計的準確性和測試效率,對提升測試質量具有重要的積極意義。