(上海電氣集團智能交通科技有限公司,上海 200233)
基于數字化磁標簽的列車運行管理系統,是數字軌道捷運系統的關鍵子系統。系統綜合運用高精度定位和循跡導向技術、電子地圖技術、車路協同技術、智能感知與控制技術,與虛擬軌道膠輪電車智能控制相結合,保證數字軌道膠輪電車循數字化磁釘軌道(含電子道岔)運行,實現數字軌道列車的運行控制以及安全防護、輔助與駕駛和列車運行監控等功能[1]。
iDRT車載控制軟件作為基于數字化磁標簽的列車運行管理系統的新型軌道系統中重要的車載控制設備軟件,需依據EN50128標準進行軟件測試,開展重要軟件的測試工作。標準要求所有含有軟件的具有安全含義的系統都應分配一個軟件完整性級別(SIL),范圍從0~4。標準以一些“規范”和“信息”的方式詳細描述了為適合于每個SIL而必須開展的軟件開發活動以及必須生成的活動完成證據[2]。
其中代碼覆蓋率在鐵路控制和防護系統的軟件代碼測試中愈來愈受重視,這不僅是由于功能安全規范(如國際標準EN50128)的高度推介,更是來自于研發組織內部對提升軟件代碼質量的迫切需求。
EN50128標準描述了軟件安全完整性等級,并規定了對于人員及其職責、生命周期、文件材料方面的要求。內容還對目標、輸入文件、輸出文件進行了詳細描述,并對軟件需求規范、體系結構、設計和執行、驗證和測試,以及軟件/硬件集成、軟件確認、質量保證和維護提出了要求見表1。

表1 EN 50128代碼測試覆蓋需求
其中覆蓋需求包括:
(1)Other test coverage criteria can be used,given that this can be justified.These criteria depend on the software architecture(see Table A.3) and the programming language (see Table A.15 and Table A.16).
(2)Any code which it is not practicable to test shall be demonstrated to be correct using a suitable technique,e.g.static analysis from Table A.19.
iDRT車載控制軟件作為安全苛刻設備,其安全完整性等級不低于SIL2,其中對于軟件覆蓋率提出了要求,使用VectorCAST結合Tornado開發環境的vxSim進行單元測試、集成測試[3]。
首先需要了解什么是軟件單元,在CMMI管理體系中定了軟件中的最小可測試單元為軟件單元(一般是指單個的軟件函數),而單元測試即對最小可測試單元進行檢查和驗證,即對函數或一個類的方法進行測試等。
單元測試的基本原則:宏觀上,單元測試要符合 AIR原則:A: Automatic(自動化)、I: Independent(獨立性)、R: Repeatable(可重復);微觀上,單元測試代碼層面要符合 BCDE 原則:B: Border,邊界性測試,包括循環邊界、特殊取值、特殊時間點、數據順序等;C: Correct,正確的輸入,并且得到預期的結果;D: Design,與設計文檔相符合,來編寫單元測試用例;E: Error,單元測試的目的是為了證明程序有錯,而不是證明程序無錯。
為了發現代碼中潛藏的錯誤,我們需要在編寫測試用例時有一些強制的錯誤輸入(如非法數據、異常流程、非業務允許輸入等)來得到預期的錯誤結果。
一般的單元測試策略有三種:孤立的單元測試策略(Isolation Unit Testing);自頂向下的單元測試策略(Top-Down Unit Testing);自底向上的單元測試策略(Bottom Up Unit Testing)。
集成測試:也叫組裝測試或聯合測試。在單元測試的基礎上,將所有模塊按照設計要求(如根據結構圖)組裝成為子系統或系統,進行集成測試。
系統測試 System Testing:是對整個系統的測試,將硬件、軟件、操作人員看作一個整體,檢驗它是否有不符合系統說明書的地方。這種測試可以發現系統分析和設計中的錯誤。
在單元測試環節,使用VectorCAST/C++(VectorCAST用于單元/集成動態測試的工具)實現了函數級別的代碼覆蓋和功能驗證,編輯自動對被測項目軟件實現函數級的插樁處理(Instrumentation on the Function level),采用圖形用戶界面執行測試[4]。
設置編譯器Compiler為 Wind River -> VxWorks ->VxWorks 5.x -> VxSim;輸入環境名稱“Tornado_demo”,設置測試方法,選擇“Traditional Method”,選擇White-Box;測試文件目錄,比如這里我將被測試文件放在“C:VCASTExamplesTimer”目錄下,則這里選擇添加該目錄。
依據上面的步驟就已經將VectorCast與Tornado的Vxsim連接好,在運行測試用例時,自動會在VxSim跑用例,下面簡單介紹如何在VectorCast上進行單元測試的步驟:
選擇某一個函數右鍵菜單,選擇“Insert Basis Path Test Cases”添加用例,則生成的用例是根據函數的判斷分支生成測試用例。當然也可以根據項目要求選擇MC/DC等其他方式生成用例。此時生成測試用例如圖1所示。

圖1 單元測試執行的代碼分支
執行測試用例并觀察測試用例所執行的判斷分支,第一個用例需要執行的分支是“if(initiated == TRUE)”。通過正確設置全局變量initiated為1和返回值,使得第一個用例執行“if(initiated == TRUE)”。同時可以通過勾選用例查看語句覆蓋情況,查看代碼已經覆蓋了對應的分支如圖2所示。

圖2 測試用例執行后的語句覆蓋情況
iDRT車載控制軟件主要實現車輛循跡導航控制功能,需要進行單元測試、集成測試的代碼量比較大,為了能更有效得使用VectorCast進行完成單元測試,提出了一些測試要求及測試步驟,包括:(1)首先針對于每一個被測的.c文件建立一個測試環境,在集成測試中將兩個關聯緊密的.c文件建立一個測試環境,環境名稱一般命名為“配置項名稱-文件名稱-001”。(2)為了保證測試的充分性,一般要求單元測試的各種覆蓋率都達到100%;語句覆蓋要求所有語句至少執行一次;分支覆蓋要求程序中每個判定的“真”值和“假”值都至少執行1次,即程序的每1個分支都至少遍歷1次。(3)代碼的分支中如果存在多條件組合情況,為了實現各種條件組合的遍歷,測試用例的數量將呈指數級增長,測試效率降低。為避免這種情況,采用MC/DC覆蓋取代條件組合覆蓋,用很少的測試用例即可實現多條件中的每個布爾操作數都獨立影響判定結果。(4)通過MC/DC覆蓋自動生成測試用例,查看每個用例的路徑,對應路徑設置對應的輸入、輸出及全局變量,如果是輸出變量的,需要設置預期值。(5)對函數所調用的函數,可以先不打樁,通過調用查看兩者之間的接口是否正常,如果出錯,可以結合代碼審查查看被調用函數的問題后,再打樁,完成覆蓋。樁函數信息填寫必須完整。(6)對于系統函數需要打樁,先不執行,在測試環境中添加系統函數后,重新更新環境[5]。
利用VBA編寫抽取VectorCAST測試數據文件的宏代碼依據執行過程寫入CMMI管理體系制定的單元測試記錄和集成測試記錄文件中,最終快速自動生成相關單元測試記錄和集成測試記錄的Word文檔,規范化完成項目資料歸檔[6]。
(1)準備單元測試記錄模板,見表2所示。

表2 單元測試記錄模板
(2)依據軟件設計文件整理好被測單元信息,見表3所示。

表3 軟件設計文件被測單元信息
(3)在Office Word中執行已經編寫好VBA源碼實例,VBA源碼實例詳解以下內容:



(4)生成相關函數的單元測試記錄見表4所示,通過VBA自動完成文件合并,生成針對每一個.c文件的單元測試記錄。

表4 函數的單元測試記錄
軟件集成測試是根據軟件結構設計,是將單元測試的各個軟件模塊按照功能、接口等方式逐步整合,測試軟件單元之間、軟件單元與已集成軟件之間的接口關系是否正確,并且符合軟件設計要求。VectorCAST測試工具也提供了軟件集成測試方法。集成測試一般采用黑盒測試為主,白盒測試為輔,通常采用增量集成的方式逐級進行,有自上而下和自下而上2種方式。對于軟件單元之間的所有調用關系,集成測試需要達到100%的覆蓋率。
通過VectorCAST測試工具在新型軌道項目中車載嵌入式軟件單元測試中提出了切實可行的改進軟件設計的質量管理方法和措施。在對iDRT車載控制軟件進行單元測試的過程中,實現了多人協同進行嵌入式軟件測試流程的可能。同時,iDRT車載控制軟件對標安全性指標需小于10-6次/小時的失效概率。需要達到快速完成研發和產品化,同時又能夠滿足相應的安全性標準,就必須采用先進的測試流程和工具進行質量管理。工具的使用以及自行的文檔生成開發,能夠大大減少了復雜的重復勞動,起到了事半功倍的作用。