曾賢福,謝 翔,許 進,夏 濤
(湖南中車時代通信信號有限公司,湖南 長沙 410005)
Ada語言誕生于1979年,1980年被指定為美國軍用標準語言,1983年被正式確立為一種ISO標準語言并投入使用。Ada語言被廣泛應用于有高可靠性、長生存期要求的大型軟件的研發(fā)[1],在軍事、商業(yè)、公共交通及金融等領域的核心軟件開發(fā)中發(fā)揮著重要作用。Ada語言不僅具有普通高級語言的高可靠性和高安全性,還具有抽象數據、多任務、異常處理以及類屬設施等特性[2],因此其軟件的動態(tài)測試技術比較復雜,目前市場上支持Ada語言的測試工具很少,VectorCAST軟件便是其中之一。VectorCAST 軟件是美國Vector Software公司推出的軟件測試解決方案,它能為用戶提供一整套自動化測試體系,特別適用于安全性與可靠性要求較高的嵌入式軟件。
VectorCAST支持Ada及C/C++等嵌入式源代碼,自動生成測試代碼來為嵌入式環(huán)境構造可執(zhí)行的測試架構。VectorCAST 工具可以創(chuàng)建測試環(huán)境,生成測試用例,實現自動化測試,進行靜態(tài)分析和覆蓋分析(包括語句覆蓋、判定覆蓋、修正的條件/判定覆蓋等)[3],其最大的特點就在于能夠實現最大限度的自動化測試且更適用于嵌入式環(huán)境。本文以CTCS2-200C型列車控制車載設備主機軟件(Ada語言編碼)測試為例,提出了一種利用VectorCAST測試工具在Adamulti編譯環(huán)境下來實現Ada語言軟件單元動態(tài)測試活動以及回歸測試功能的方法。
本文測試環(huán)境需要安裝VectorCAST測試工具(2018 SP1)和Green Hills Adamulti (v4.0.7) 編譯軟件。其中,VectorCAST用于測試用例編寫及執(zhí)行,Adamulti用于用例的編譯和調試。
安裝VectorCAST測試工具軟件前,需先安裝Green Hills Adamulti編譯工具軟件。按照默認方式安裝VectorCAST測試軟件,完成后若提示沒有證書,則點擊“確定”后在彈出的“Licence Setup” 窗口選擇“Skip this Step”即可,之后再處理證書的問題。在安裝好的VectorCAST文件夾下找到“LMTools”圖標并打開,即可開始設置證書,其界面如圖1所示,具體操作為
(1)點擊“Config Services”選項卡,設置如下參數:
勾選界面下方兩個復選框,即可實現證書服務的開機自啟。
(2)設置完成后,點擊“Save Service”;
(3)此時切換至“Start/Stop/Reread”選項卡,會看見剛才保存的服務名稱,點擊“Start”;
(4)通過“Server Status”選項卡,可查看當前服務狀態(tài)。
圖1 證書設置Fig. 1 Certificate setting
設置環(huán)境變量名稱為“VECTOR_LICENSE_FILE”,值為<證書文件路徑>,建立Green Hills項目:
(1)打開命令行窗口,輸入指令“Set PATH =%VECTORCAST_DIR%; %VECTORCAST_DIR%MinGWin;<Cygwin安裝目錄>in; %PATH%”以設置環(huán)境變量,如圖2所示。
圖2 設置環(huán)境變量Fig. 2 Setting environment variables
(2)拉取Green Hills工程
首先用cd指令切換至create_ghs_project.py文件所在位置,然后,執(zhí)行“vpython create_ghs_project.py --destination <要建立工程的目錄>”。
(3)配置仿真環(huán)境
首先將strip_address.py文件拷貝至工程目錄下的src文件夾中并用cd指令切換至該位置,然后執(zhí)行“vpython strip_address.py --gpj project.gpj”。工程目錄的lcap1, lcap2, lcap3和lcpl文件夾下都有src文件夾,由于前三者代碼是一樣的,只需在lcap1和lcpl下的src文件中執(zhí)行上述操作即可。配置仿真環(huán)境如圖3所示。
圖3 配置仿真環(huán)境Fig. 3 Configuration simulation environment
在創(chuàng)建測試環(huán)境時,VectorCAST根據被測代碼和開發(fā)環(huán)境自動創(chuàng)建測試套件,測試人員可以根據測試需要創(chuàng)建測試用例,實現不同的測試需求。單元測試是對被測單元設計測試用例,執(zhí)行待測程序時通過自動打樁,分析實際運行程序的輸出結果與預期結果,最終確定語句覆蓋率(Statements)、分支覆蓋率(Branches)和修正條件/判定覆蓋率(MC/DC)的是否達到設計要求。
在VectorCAST界面下,按File → New → Ada Target Environment → Coldfire Green Hills Simulatro/Target順序依次彈出測試環(huán)境窗口,開始創(chuàng)建VectorCAST測試工程,操作如下:
(1)選擇編譯環(huán)境及鏈接信息。
(2)為該測試環(huán)境命名。
(3)選擇測試覆蓋率類型,結合被測軟件其自身特點,應選擇語句覆蓋率(Statements)和修正判定/條件覆蓋率(MC/DC)來進行測試覆蓋率統(tǒng)計。
(4)添加被測軟件工程路徑。
(5)選擇被測單元和樁,此時軟件界面如圖4所示。從左側的組件列表中選出需要的組件分別放入右側的分類中, UUT(unit under test)表示被測單元,被測組件需要添加至該項;STUB表示樁,默認情況下軟件會自動對所有用到的非被測組件打樁,因而可不填寫;DONT_STUB和IGNORE表示非樁,歸入此分類的組件不會被打樁,在測試執(zhí)行時直接運行原函數,但測試用例無法直接對該組件的變量進行設置,因而當被測組件調用了類屬組件(以generic關鍵字聲明)時,應將該類屬組件添加至該分類。
(6)測試人員可以選擇增加測試所需的用戶代碼。
(7)保存選擇環(huán)境后構建測試工程。
圖4 測試工程環(huán)境構建Fig. 4 Environment constitution of testing project
測試人員應根據軟件詳細設計說明書中的函數功能、輸入輸出和流程圖設計模塊測試用例,采用等價類及邊界值測試技術來實現軟件單元測試。VectorCAST支持多種形式的輸入輸出參數(包括最大值、最小值、中間值、輸入參數范圍、輸入值列表、外部數據源等)自動生成測試用例,不需要測試人員編寫測試代碼,測試工具自動產生軟件測試的驅動、樁模塊,從而節(jié)省時間,使測試人員可將重點放在測試用例設計上,全面覆蓋測試項點,提高軟件測試效率。VectorCAST中,可以通過以下4種方式構建測試用例:
(1)Insert Test Case,插入一個空的測試用例;
(2)Insert Min Mid Max,按照最小值、中間值、最大值自動生成測試用例;
(3)Insert Basis Path Test Cases,按照基礎路徑自動生成測試用例;
(4)Insert Partitioned Test Case,按照等價類劃分自動生成測試用例。
以Trigger_Back_Slide 函數為例(存在兩個判斷條件)設計測試用例。選取“Insert Basis Path Test Cases”測試方式生成測試用例(圖5),按照路徑的方式生成3個測試用例。
第一個測試用例設計描述:(1)if not Back_Slide_Triggered ==>FALSE。
第二個測試用例設計描述:(1)if not Back_Slide_Triggered ==>TRUE;(2)if (Speed_Warning_Sound_Play_Status = FALSE) ==>FALSE。
第三個測試用例設計描述:(1)if not Back_Slide_Triggered ==>TRUE;(2)if (Speed_Warning_Sound_Play_Status = FALSE) ==> TRUE。
這些測試用例會遍歷代碼中的所有不同路徑,然后保存實際的測試用例結果,幫助設計者識別可能影響代碼可靠性和安全性的潛在異常狀況,以便盡早發(fā)現軟件設計缺陷。
圖5 測試用例創(chuàng)建Fig. 5 Create of test case
一般情況下,測試用例僅調用一次被測函數;但在某些情況下,為了滿足用例的條件需要依序執(zhí)行多個函數,此時應先為每個需要被執(zhí)行的函數編寫一個子測試用例,然后再編寫一個復合測試用例來調用子測試用例。復合測試用例本身不包含輸入和期望,僅通過調用子測試用例來完成測試。
測試用例創(chuàng)建后,可看到測試用例的參數表格。被測組件被設置為UUT類型,打樁的組件被設置為ST,組件的子項中<GLOBAL>表示該組件靜態(tài)/全局變量(測試人員可以根據測試需求設置變量),變量只在當前測試用例有效,用例之間相互不影響。測試人員可以根據測試需要設置樁函數的輸入與輸出,與此同時,也可以勾選“Units Under Test”中特有的<SBF>項目里的被測函數對其強制打樁。強制打樁后,被調函數完全被樁函數替代(圖6)。VectorCAST可以為樁函數設置多個不同的輸入與輸出,也可以支持復雜的結構或對象變量。樁函數的設置只需在測試用例界面操作即可實現,該界面提供被測單元所有調用的樁函數,測試人員可以靈活設置樁函數的輸出或者返回值,且每個用例設置的樁函數具有獨立性,可消除各用例之間的互擾,大幅提高測試效率。
圖6 樁函數設置Fig. 6 Setting of stub function
測試用例設置完成后,開始自動執(zhí)行測試用例。執(zhí)行過程中,測試工具根據之前的設置自動計算覆蓋率的統(tǒng)計,當遇到條件判斷復雜的函數模塊時,VectorCAST可以自動分析被測函數中MC/DC條件組合并產生MC/DC的測試組合條件,幫助測試人員設計測試數據。
以cvc_lcap_app_ctl_back_slide(防溜功能邏輯控制單元)所屬函數Is_Back_Slide_Active(判斷是否觸發(fā)防溜功能)中如下表達式為例:
MC/DC覆蓋分析如圖7所示。上述表達式中有Ca,Cb, Cc, Cd和Ce共5個條件。借助VectorCAST進行分析,全部條件組合有32種,滿足Pa,Pb,Pc,Pd及Pe 5種條件組合配對,即16/32組合配對可滿足Pa;同樣8/16組合配對可滿足Pb;12/16組合配對可滿足Pc;14/16組合配對可滿足Pd;15/16組合配對可滿足Pe。綜合分析,選取8,12,14,16和32共計5種條件組合,Pa,Pb,Pc,Pd及Pe可以同時滿足,即最少設計5個測試用例就可實現MC/DC覆蓋。
圖7 MC/DC等價類分析矩陣Fig. 7 MC/DC equivalence analysis matrix
通過分析MC/DC覆蓋率執(zhí)行情況,可以設計最少的測試用例來滿足覆蓋率要求,從而提高測試效率。分支語句前會出現( “ * ” 為“ T ” 或“ F ” ) , 表示該條件的TRUE 或FALSE在選定的測試用例中已被覆蓋[4]。VectorCAST測試完成后,自動生成測試報告,通過查看測試報告可以確認被測函數的語句覆蓋率、分支覆蓋率、MC/DC組合覆蓋率是否均達到100%(圖8),大大提高了單元測試報告編寫的時間效率。如果覆蓋率達不到測試規(guī)范要求,需要分析是軟件設計問題還是測試用例設計不全面導致的問題:如果是測試用例設計有遺漏,則需要補充完整的測試用例來達到覆蓋率要求;如果是軟件存在問題而導致覆蓋率不足,則記錄相關的問題并報告,后期由設計人員修改且關閉問題。
圖8 測試報告覆蓋率統(tǒng)計Fig. 8 Coverage statistics of testing report
在進行回歸測試時,首先需要使用AdaMulti編譯變更后的代碼,然后在VectorCAST軟件中選擇“Environment→Incremental Rebuild”,VectorCAST即會對環(huán)境進行重建,完成后即可修改或新增測試用例以滿足覆蓋率要求。為方便在不同目錄乃至不同計算機上進行自動化的回歸測試,VectorCAST還提供了回歸腳本的方式,選擇“Environment→Create Regression Scripts”后,測試工具會自動生成.bat,.tst和.env這3個文件;只要將3個文件放在同一目錄下,運行.bat文件,即可自動完成從建立測試項目、導入測試用例.tst文件、執(zhí)行測試到生成測試報告的完整的回歸測試過程。為了保證在軟件修改后測試庫中測試用例的有效性,必須對測試用例庫進行維護。通過查看測試報告,以確定是否需要修改原有的測試用例或者需要添加新的測試用例,新的測試用例用于測試軟件的新特征或者覆蓋現有測試用例無法覆蓋的軟件功能。以CVC_LCAP_APP_GST_DEGRADE組件為例,將CVC_LCAP_APP_GST_DEGRADE組件后綴為. bat,.tst和.env的3個文件放在同一個文件夾內運行回歸測試批處理UT_regression_all.bat文件,運行完后自動生成測試工程,同時會生成測試報告(圖9),通過查看測試報告以發(fā)現軟件設計缺陷與問題。
圖9 回歸測試Fig. 9 Testing regression
基于VectorCAST測試工具,自動創(chuàng)建測試用例和生成測試報告,完成軟件單元測試技術分析。本文從各項測試工作分配比例和千行代碼測試工作耗時兩方面,將以往測試工具與VectorCAST測試工具單元測試方法進行了橫向比較,結果如圖10和圖11所示??梢钥闯?,基于VectorCAST測試工具單元的測試方法已將測試重心轉移到用例設計和用例執(zhí)行上,使測試用例的設計更充分和完善,使手動測試報告生成工作量至少減少一半。從測試效率方面分析,使得千行代碼的測試時間節(jié)省了23 h,測試效率提高了約22%。
圖10 單元測試工作分配比例對比Fig. 10 Comparison of unit test work allocation ratios
圖11 千行代碼單元測試耗時對比Fig. 11 Comparison of unit test time
本文對VectorCAST自動化測試工具在Ada語言軟件測試中的應用進行研究,基于Green Hills AdaMulti編譯環(huán)境,重點介紹軟件單元測試的實現方法,通過VectorCAST自動化測試工具實現Ada語言軟件的單元測試,極大程度地降低了測試人員的工作量,同時提高了軟件測試效率,也為其他安全類軟件測試提供有效的參考。鑒于目前有關VectorCAST測試工具的資料比較少且Ada語言具有特殊性,采用VectorCAST測試工具對Ada語言軟件進行集成測試將作為下一步的研究方向。