周平平,張 俊,羅海鷹,李 翔
(航空工業洪都,江西 南昌,330024)
軍用軟件具有高可靠性、高安全性、規模大、結構復雜和實時性強等特點,因此軟件開發時的質量問題顯然至關重要。質量不高、可靠性不強的軍用軟件在使用過程中會帶來各種各樣的問題,甚至造成災難性的后果,無法承擔國家安全和軍事斗爭的重任。其中,嵌入式軟件因與硬件結合緊密,其可靠性指標具有很大的隨機性,如外界環境變化、系統輸入出錯、使用不當以及軟硬件設計的固有缺陷等原因都會導致軟件可靠性指標降低,但是不能因為這些因素,使得嵌入式軟件可靠性的保證成為空談。特別是在武器系統中起著至關重要作用的嵌入式軟件,必須保證武器裝備的精確性和可靠性。
軟件可靠性是可以通過軟件工程化的實踐來提高,在系統開發過程中進行全面的質量控制,包括系統分析、系統設計、軟件實現、軟件測試和評估、開發人員培訓和用戶培訓等的質量控制。
本文簡要介紹了軟件測試的基本概念和分類,從單元測試、部件測試、配置項測試和系統測試的角度介紹了不同測試級別的測試內容和測試方法,并據此從軟件工程化視角分析了軍用軟件的測試現狀、存在的問題和原因,然后分別從軟件管理層面和軟件技術層面對軍用嵌入式軟件的測試提出了一些應對措施,為整體推進軟件測試工作提供了可行的解決方案。
所謂軟件測試,是通過對源程序及其實際執行所產生的結果進行檢查分析,以找出程序中可能隱藏的錯誤的過程,即為了發現程序錯誤而執行程序的過程[1]。它是軟件開發過程中一個非常關鍵的環節,在軟件的生存周期中占有重要的位置,通過測試可以確認軟件產品是否達到了指標和可靠性要求,并了解軟件的實際水平。
根據統計,軟件故障在不同階段發生的比例及在不同階段發生時修復的費用比例如圖1所示[2]。

圖1 軟件故障在不同階段發生及修復費用的比例示意圖
通過統計數據可看出,軟件故障多出現在軟件開發過程的早期,同時軟件故障越早發現,故障修復付出的費用越少。因此,軟件測試在軟件開發過程中是一個非常關鍵的環節,且軟件測試工作越早介入越好。
如圖2所示,軟件測試根據測試對象的不同可分為4個測試級別,分別是單元測試、部件測試、配置項測試和系統測試。

圖2 軟件測試級別與測試對象
其中,單元測試是針對《軟件詳細設計說明》對應的獨立軟件單元或相關單元組的測試,確保軟件模塊的代碼覆蓋率達到100%;部件測試是針對《軟件概要設計說明》對應的獨立軟件部件或相關部件組的測試;配置項測試是針對《需求規格說明》對單個軟件的測試,部件測試和配置項測試都是對應的軟件功能性能測試,確保軟件功能、性能、外部和內部接口等符合要求;系統測試是在完整的、集成的系統上的測試行為,針對《軟件研制任務書》對應的軟件需求測試,確保軟硬件各項指標符合用戶的驗收要求。如圖3所示。

圖3 軟件開發V模型
在每個測試階段中,根據具體的測試方法又可分為靜態測試和動態測試,其中動態測試方法根據測試用例設計方法的不同,又分為黑盒測試和白盒測試兩類。通常,白盒測試多用于單元測試階段,黑盒測試多用于系統測試階段。
軟件測試流程和軟件開發流程是可以并行執行的,如圖4所示,圖中左邊第1列為軟件開發流程,第2列到第5列為各級測試流程。所有級別的軟件測試工作都無需等到代碼全部實現后再開展。

圖4 軟件測試過程與開發過程并行關系
一般來說,單元測試和部件測試是屬于軟件開發組的工作,配置項測試和系統測試則屬于軟件測試組的工作,且軟件測試組獨立于軟件開發組。因此,各級別的軟件測試均可并行開展。
1)軟件開發過程不規范
現階段,軍用軟件的開發大多集中于軍隊直屬單位或國家科研院所,這些單位中有相當一部分未建立起相對完善的軟件質量保證體系。質量體系的不完善導致軟件開發過程缺乏行之有效的管理和監督,軟件的質量保證工作基本上是由軟件開發者自身完成的。實踐證明,采用這種方式開發軟件是無法保證軟件測試的相對獨立性和測試質量的。
此外,軟件測試是一個貫穿于整個軟件開發過程的系統工程,測試工作的進入點應前置到需求分析和系統設計階段開始,而我軍的軟件測試工作,一般是在編碼完成之后和軟件產品交付運行之前進行,如果需求理解不充分或設計中有錯誤,測試的質量就難以保證而且返回修改的代價相當巨大。
2)軟件測試組織不健全
當前,我國多數的軍用軟件承制方沒有按照軟件工程的要求建立獨立的軟件測試部門,軟件測試僅僅是走過場,測試作用的可信度大大降低,“重開發、輕測試”的思想和現象較嚴重。同時對測試人員本身缺乏專業的測試思想和測試技術的培訓,這些因素影響了軟件測試的效果。
3)軟件設計文檔不完備
軟件測試工作與軟件設計文檔密不可分,測試人員正是依據這些文檔形成測試中需要的軟件測試計劃、軟件測試說明、軟件測試報告等測試文檔。但是,在軟件研制過程中,相關人員往往不重視軟件設計文檔的編制和管理,這些不完備或不符合要求的軟件文檔給測試工作造成重重障礙,嚴重影響測試工作的展開。
4)軟件測試技術不先進
由于我軍軟件測試工作起步較晚且投入有限,許多測試機構的測試方法和手段都還比較落后,甚至沿用人工測試的方式。一些測試機構雖然購買了測試工具,但是由于軍用軟件應用的特殊性,許多工具沒有被充分利用。此外,測試用例和缺陷是測試管理的核心,但是一些承制方在開展軟件測試時,沒有建立起完善的管理庫,對設計的測試用例和測試過程中發現的缺陷缺少數據庫管理手段,不能對測試問題進行有效跟蹤、分析和處理。
1)嵌入式軟件測試環境問題
在任務繁忙的時候,軟件測試往往是用真實環境進行,但是受到嵌入式軟件運行環境難以修改的約束限制,對于一些安全性的測試難以正常注入,測試的充分性得不到保障。并且,不同的測試級別對測試環境的要求也不盡相同。所以,嵌入式軟件測試必須根據測試級別、軟件項目需求建立合適的測試環境。
2)嵌入式軟件內存分配問題
在嵌入式軟件運行過程中,內存泄露、數組越界、內存空間不足等問題都會使系統受到影響,甚至會導致系統的崩潰。針對用于系統內存分配和使用的源代碼的檢查,一直是人工方式進行檢查,但是工作量太大,且不能動態監視內存分配,測試不充分。
3)嵌入式軟件數學模型驗證問題
在軟件測試的驗證過程中一直都存在數學模型驗證的難題,數學模型中含有大量的復雜數學公式和數值的計算,還有定義了大量的全局和局部的變量。為了保證這些運算的正確,必須要做好計算機軟件數學模型的驗證。
4)嵌入式軟件靜態測試問題
軟件靜態測試是對源代碼的規則和度量元進行檢測,在靜態測試中,測試工具會在分析過程中存在一些誤差,需要利用人工對軟件靜態測試結果進行深入的分析和確認。人工分析和確認工作與測試人員的認知和經驗直接相關,因此如何提高嵌入式軟件測試人員判斷的準確性是靜態測試過程不可忽略的問題。
5)嵌入式軟件測試覆蓋率問題
為了保證嵌入式軟件的高可靠性和高安全性,要求測試要有很好的覆蓋率,在測試過程中要盡量保證所有的代碼都會被執行,最大限度的發現軟件中潛藏的BUG。覆蓋率的實現過程是通過對源代碼的插裝來完成的,如果用人工方式進行插裝,不僅工作量巨大且易存在疏漏,由此得到的覆蓋率分析工作也有巨大困難。所以,選擇合適的覆蓋率測試工具是解決問題的關鍵。
軍用軟件測試是一項跨部門、覆蓋多學科、涉及多技術領域的復雜系統工程,要有效解決目前存在的困難和問題,促進其正規、有序發展,就必須樹立體系建設思想,遵循積極、穩妥的原則,運用系統工程方法,著力尋求要素全面、協調配套的綜合解決方案,分步實施、整體推進。目前,我們可以采取如下基礎措施。
1)規范開發及測試過程
按照國家軍用標準的相關要求,明確及規范開發及測試過程。規范的制定應由高層領導支持,在整個單位內實施。測試工作應隨著項目啟動盡早計劃與開展,并貫穿整個項目過程,避免因時間節點等原因導致項目測試工作不夠充分,甚至測試工作無法及時介入項目的情況。
2)提升軟件測試人員的素質
成立由專人負責并由專職人員組成的軟件測試隊伍,負責從軟件需求分析到交付用戶的全壽命周期軟件測試組織與管理工作。由于軟件測試在軟件的開發過程中占有重要地位,因此對軟件測試人員提出了很高的要求,一般來說軟件測試人員的水平不能比設計人員的水平低。軟件測試人員需通過不斷實踐總結測試的經驗與不足,加強對軟件工程與測試方法的學習,同時提高與開發人員的溝通能力,切實做好單位內部的測試工作。
3)提升軟件開發人員的素質
通過軟件工程化及軟件測試過程培訓等手段,加強開發人員對軟件測試工作的認識,使軟件開發人員能夠積極配合軟件測試相關工作,切實有效地保證軟件質量。
4)加大軟件設計文檔審查力度
目前,GJB5000A在軍工企業逐步應用推廣,軟件產品研制過程的工程化要求越來越規范和嚴謹,對軟件產品研制已經定義了流程化或模板式的操作方法,但大部分項目軟件人員仍然會犯“先做事,后補文檔”的錯誤。針對這種“重代碼、輕文檔”的現象,應該結合測試管理規定中的評審機制,進一步加強對文檔的審查力度,力求文檔能夠及時更新,與軟件實時保持一致。
1)嵌入式軟件測試環境
嵌入式軟件是軟硬件耦合系統,把軟硬件分離開來,建立嵌入式軟件獨立的運行環境是建立嵌入式軟件仿真測試環境的關鍵。一個完整的嵌入式系統包括處理器、I/O接口以及各種外部設備。在建立嵌入式軟件仿真測試環境時,需要考慮軟硬件的分離原則,即哪些采用真實硬件設備,哪些需要用軟件仿真實現,哪些需要用硬件仿真實現。如圖5所示,不同的嵌入式系統以及軟件測試階段,需要建立的仿真測試環境也不相同。

圖5 不同軟件測試階段需要的測試環境
嵌入式軟件的單元測試主要采用白盒測試方法,一般在宿主機上,利用集成開發環境或測試工具的全數字仿真模擬器來進行,找出單元編碼時產生的錯誤以及與軟件設計的偏差。在極特殊情況下,也可以在目標機上進行,利用單元測試中的驅動模塊和樁模塊進行。
嵌入式軟件的部件測試可在宿主機環境上利用測試工具來完成,也可在目標機上搭建仿真測試環境來完成,具體依賴于軟硬件耦合程度和部件的集成級別。
嵌入式軟件的配置項測試主要是軟件形成獨立的配置項后,加載到相應的硬件平臺上測試其運行情況,以確定軟硬件能夠正確協調工作,實現軟件需求規定的功能、性能等要求。配置項測試必須在目標機環境下進行,交聯設備可以采用仿真模型替代,也可以利用半實物仿真測試工具搭建測試環境來進行確認測試。
嵌入式軟件的系統測試是將被測軟件和硬件資源都綜合起來構成完整的應用系統進行測試,確保整個系統達到研制任務書的要求。嵌入式軟件的系統測試對測試環境有嚴格的要求,必須在真實目標機環境下進行,包括運行平臺、交聯設備都要是真實的,目的是要確保嵌入式軟件能夠在最終的真實硬件環境下正確運行。
2)嵌入式軟件測試工具
軟件測試是一項有難度的專業技術工作,除了人工代碼走查、系統測試之外,大部分工作需要專業的軟件測試工具完成。軟件測試的很多技術問題,如內存分配問題、測試覆蓋率問題等都可以借助合適的測試工具來解決。常見的軟件單元測試工具見表1。

表1 軟件單元測試工具
根據測試的具體需要選擇合適的測試工具既可以提高測試人員的測試效率,又可以極大提高測試的有效性。其中,TestBed能夠實現匯編語言、C/C++、Fortran、Ada等語言的靜態和動態測試,可用于代碼評審、質量評審、設計評審、測試驗證和測試管理,是目前針對嵌入式軟件測試最有效的工具,被較多用于軍用嵌入式軟件測試。
軍用嵌入式軟件在開發方法、實現語言特點、運行環境和承擔功能等方面所具有的特殊性,決定了其測試方法、平臺和工具的選型需要周密考慮。同時,要注重系統化的嵌入式軟件測試體系的建立、軟件測試環境的搭建、測試隊伍的建設,以及測試管理體系的標準化等軟件測試配套工程的建設,從而保證軍用嵌入式軟件測試的順利實施。