周平平,張 俊,羅海鷹,李 翔
(航空工業(yè)洪都,江西 南昌,330024)
軍用軟件具有高可靠性、高安全性、規(guī)模大、結(jié)構(gòu)復(fù)雜和實(shí)時性強(qiáng)等特點(diǎn),因此軟件開發(fā)時的質(zhì)量問題顯然至關(guān)重要。質(zhì)量不高、可靠性不強(qiáng)的軍用軟件在使用過程中會帶來各種各樣的問題,甚至造成災(zāi)難性的后果,無法承擔(dān)國家安全和軍事斗爭的重任。其中,嵌入式軟件因與硬件結(jié)合緊密,其可靠性指標(biāo)具有很大的隨機(jī)性,如外界環(huán)境變化、系統(tǒng)輸入出錯、使用不當(dāng)以及軟硬件設(shè)計的固有缺陷等原因都會導(dǎo)致軟件可靠性指標(biāo)降低,但是不能因?yàn)檫@些因素,使得嵌入式軟件可靠性的保證成為空談。特別是在武器系統(tǒng)中起著至關(guān)重要作用的嵌入式軟件,必須保證武器裝備的精確性和可靠性。
軟件可靠性是可以通過軟件工程化的實(shí)踐來提高,在系統(tǒng)開發(fā)過程中進(jìn)行全面的質(zhì)量控制,包括系統(tǒng)分析、系統(tǒng)設(shè)計、軟件實(shí)現(xiàn)、軟件測試和評估、開發(fā)人員培訓(xùn)和用戶培訓(xùn)等的質(zhì)量控制。
本文簡要介紹了軟件測試的基本概念和分類,從單元測試、部件測試、配置項(xiàng)測試和系統(tǒng)測試的角度介紹了不同測試級別的測試內(nèi)容和測試方法,并據(jù)此從軟件工程化視角分析了軍用軟件的測試現(xiàn)狀、存在的問題和原因,然后分別從軟件管理層面和軟件技術(shù)層面對軍用嵌入式軟件的測試提出了一些應(yīng)對措施,為整體推進(jìn)軟件測試工作提供了可行的解決方案。
所謂軟件測試,是通過對源程序及其實(shí)際執(zhí)行所產(chǎn)生的結(jié)果進(jìn)行檢查分析,以找出程序中可能隱藏的錯誤的過程,即為了發(fā)現(xiàn)程序錯誤而執(zhí)行程序的過程[1]。它是軟件開發(fā)過程中一個非常關(guān)鍵的環(huán)節(jié),在軟件的生存周期中占有重要的位置,通過測試可以確認(rèn)軟件產(chǎn)品是否達(dá)到了指標(biāo)和可靠性要求,并了解軟件的實(shí)際水平。
根據(jù)統(tǒng)計,軟件故障在不同階段發(fā)生的比例及在不同階段發(fā)生時修復(fù)的費(fèi)用比例如圖1所示[2]。
圖1 軟件故障在不同階段發(fā)生及修復(fù)費(fèi)用的比例示意圖
通過統(tǒng)計數(shù)據(jù)可看出,軟件故障多出現(xiàn)在軟件開發(fā)過程的早期,同時軟件故障越早發(fā)現(xiàn),故障修復(fù)付出的費(fèi)用越少。因此,軟件測試在軟件開發(fā)過程中是一個非常關(guān)鍵的環(huán)節(jié),且軟件測試工作越早介入越好。
如圖2所示,軟件測試根據(jù)測試對象的不同可分為4個測試級別,分別是單元測試、部件測試、配置項(xiàng)測試和系統(tǒng)測試。
圖2 軟件測試級別與測試對象
其中,單元測試是針對《軟件詳細(xì)設(shè)計說明》對應(yīng)的獨(dú)立軟件單元或相關(guān)單元組的測試,確保軟件模塊的代碼覆蓋率達(dá)到100%;部件測試是針對《軟件概要設(shè)計說明》對應(yīng)的獨(dú)立軟件部件或相關(guān)部件組的測試;配置項(xiàng)測試是針對《需求規(guī)格說明》對單個軟件的測試,部件測試和配置項(xiàng)測試都是對應(yīng)的軟件功能性能測試,確保軟件功能、性能、外部和內(nèi)部接口等符合要求;系統(tǒng)測試是在完整的、集成的系統(tǒng)上的測試行為,針對《軟件研制任務(wù)書》對應(yīng)的軟件需求測試,確保軟硬件各項(xiàng)指標(biāo)符合用戶的驗(yàn)收要求。如圖3所示。
圖3 軟件開發(fā)V模型
在每個測試階段中,根據(jù)具體的測試方法又可分為靜態(tài)測試和動態(tài)測試,其中動態(tài)測試方法根據(jù)測試用例設(shè)計方法的不同,又分為黑盒測試和白盒測試兩類。通常,白盒測試多用于單元測試階段,黑盒測試多用于系統(tǒng)測試階段。
軟件測試流程和軟件開發(fā)流程是可以并行執(zhí)行的,如圖4所示,圖中左邊第1列為軟件開發(fā)流程,第2列到第5列為各級測試流程。所有級別的軟件測試工作都無需等到代碼全部實(shí)現(xiàn)后再開展。
圖4 軟件測試過程與開發(fā)過程并行關(guān)系
一般來說,單元測試和部件測試是屬于軟件開發(fā)組的工作,配置項(xiàng)測試和系統(tǒng)測試則屬于軟件測試組的工作,且軟件測試組獨(dú)立于軟件開發(fā)組。因此,各級別的軟件測試均可并行開展。
1)軟件開發(fā)過程不規(guī)范
現(xiàn)階段,軍用軟件的開發(fā)大多集中于軍隊直屬單位或國家科研院所,這些單位中有相當(dāng)一部分未建立起相對完善的軟件質(zhì)量保證體系。質(zhì)量體系的不完善導(dǎo)致軟件開發(fā)過程缺乏行之有效的管理和監(jiān)督,軟件的質(zhì)量保證工作基本上是由軟件開發(fā)者自身完成的。實(shí)踐證明,采用這種方式開發(fā)軟件是無法保證軟件測試的相對獨(dú)立性和測試質(zhì)量的。
此外,軟件測試是一個貫穿于整個軟件開發(fā)過程的系統(tǒng)工程,測試工作的進(jìn)入點(diǎn)應(yīng)前置到需求分析和系統(tǒng)設(shè)計階段開始,而我軍的軟件測試工作,一般是在編碼完成之后和軟件產(chǎn)品交付運(yùn)行之前進(jìn)行,如果需求理解不充分或設(shè)計中有錯誤,測試的質(zhì)量就難以保證而且返回修改的代價相當(dāng)巨大。
2)軟件測試組織不健全
當(dāng)前,我國多數(shù)的軍用軟件承制方?jīng)]有按照軟件工程的要求建立獨(dú)立的軟件測試部門,軟件測試僅僅是走過場,測試作用的可信度大大降低,“重開發(fā)、輕測試”的思想和現(xiàn)象較嚴(yán)重。同時對測試人員本身缺乏專業(yè)的測試思想和測試技術(shù)的培訓(xùn),這些因素影響了軟件測試的效果。
3)軟件設(shè)計文檔不完備
軟件測試工作與軟件設(shè)計文檔密不可分,測試人員正是依據(jù)這些文檔形成測試中需要的軟件測試計劃、軟件測試說明、軟件測試報告等測試文檔。但是,在軟件研制過程中,相關(guān)人員往往不重視軟件設(shè)計文檔的編制和管理,這些不完備或不符合要求的軟件文檔給測試工作造成重重障礙,嚴(yán)重影響測試工作的展開。
4)軟件測試技術(shù)不先進(jìn)
由于我軍軟件測試工作起步較晚且投入有限,許多測試機(jī)構(gòu)的測試方法和手段都還比較落后,甚至沿用人工測試的方式。一些測試機(jī)構(gòu)雖然購買了測試工具,但是由于軍用軟件應(yīng)用的特殊性,許多工具沒有被充分利用。此外,測試用例和缺陷是測試管理的核心,但是一些承制方在開展軟件測試時,沒有建立起完善的管理庫,對設(shè)計的測試用例和測試過程中發(fā)現(xiàn)的缺陷缺少數(shù)據(jù)庫管理手段,不能對測試問題進(jìn)行有效跟蹤、分析和處理。
1)嵌入式軟件測試環(huán)境問題
在任務(wù)繁忙的時候,軟件測試往往是用真實(shí)環(huán)境進(jìn)行,但是受到嵌入式軟件運(yùn)行環(huán)境難以修改的約束限制,對于一些安全性的測試難以正常注入,測試的充分性得不到保障。并且,不同的測試級別對測試環(huán)境的要求也不盡相同。所以,嵌入式軟件測試必須根據(jù)測試級別、軟件項(xiàng)目需求建立合適的測試環(huán)境。
2)嵌入式軟件內(nèi)存分配問題
在嵌入式軟件運(yùn)行過程中,內(nèi)存泄露、數(shù)組越界、內(nèi)存空間不足等問題都會使系統(tǒng)受到影響,甚至?xí)?dǎo)致系統(tǒng)的崩潰。針對用于系統(tǒng)內(nèi)存分配和使用的源代碼的檢查,一直是人工方式進(jìn)行檢查,但是工作量太大,且不能動態(tài)監(jiān)視內(nèi)存分配,測試不充分。
3)嵌入式軟件數(shù)學(xué)模型驗(yàn)證問題
在軟件測試的驗(yàn)證過程中一直都存在數(shù)學(xué)模型驗(yàn)證的難題,數(shù)學(xué)模型中含有大量的復(fù)雜數(shù)學(xué)公式和數(shù)值的計算,還有定義了大量的全局和局部的變量。為了保證這些運(yùn)算的正確,必須要做好計算機(jī)軟件數(shù)學(xué)模型的驗(yàn)證。
4)嵌入式軟件靜態(tài)測試問題
軟件靜態(tài)測試是對源代碼的規(guī)則和度量元進(jìn)行檢測,在靜態(tài)測試中,測試工具會在分析過程中存在一些誤差,需要利用人工對軟件靜態(tài)測試結(jié)果進(jìn)行深入的分析和確認(rèn)。人工分析和確認(rèn)工作與測試人員的認(rèn)知和經(jīng)驗(yàn)直接相關(guān),因此如何提高嵌入式軟件測試人員判斷的準(zhǔn)確性是靜態(tài)測試過程不可忽略的問題。
5)嵌入式軟件測試覆蓋率問題
為了保證嵌入式軟件的高可靠性和高安全性,要求測試要有很好的覆蓋率,在測試過程中要盡量保證所有的代碼都會被執(zhí)行,最大限度的發(fā)現(xiàn)軟件中潛藏的BUG。覆蓋率的實(shí)現(xiàn)過程是通過對源代碼的插裝來完成的,如果用人工方式進(jìn)行插裝,不僅工作量巨大且易存在疏漏,由此得到的覆蓋率分析工作也有巨大困難。所以,選擇合適的覆蓋率測試工具是解決問題的關(guān)鍵。
軍用軟件測試是一項(xiàng)跨部門、覆蓋多學(xué)科、涉及多技術(shù)領(lǐng)域的復(fù)雜系統(tǒng)工程,要有效解決目前存在的困難和問題,促進(jìn)其正規(guī)、有序發(fā)展,就必須樹立體系建設(shè)思想,遵循積極、穩(wěn)妥的原則,運(yùn)用系統(tǒng)工程方法,著力尋求要素全面、協(xié)調(diào)配套的綜合解決方案,分步實(shí)施、整體推進(jìn)。目前,我們可以采取如下基礎(chǔ)措施。
1)規(guī)范開發(fā)及測試過程
按照國家軍用標(biāo)準(zhǔn)的相關(guān)要求,明確及規(guī)范開發(fā)及測試過程。規(guī)范的制定應(yīng)由高層領(lǐng)導(dǎo)支持,在整個單位內(nèi)實(shí)施。測試工作應(yīng)隨著項(xiàng)目啟動盡早計劃與開展,并貫穿整個項(xiàng)目過程,避免因時間節(jié)點(diǎn)等原因?qū)е马?xiàng)目測試工作不夠充分,甚至測試工作無法及時介入項(xiàng)目的情況。
2)提升軟件測試人員的素質(zhì)
成立由專人負(fù)責(zé)并由專職人員組成的軟件測試隊伍,負(fù)責(zé)從軟件需求分析到交付用戶的全壽命周期軟件測試組織與管理工作。由于軟件測試在軟件的開發(fā)過程中占有重要地位,因此對軟件測試人員提出了很高的要求,一般來說軟件測試人員的水平不能比設(shè)計人員的水平低。軟件測試人員需通過不斷實(shí)踐總結(jié)測試的經(jīng)驗(yàn)與不足,加強(qiáng)對軟件工程與測試方法的學(xué)習(xí),同時提高與開發(fā)人員的溝通能力,切實(shí)做好單位內(nèi)部的測試工作。
3)提升軟件開發(fā)人員的素質(zhì)
通過軟件工程化及軟件測試過程培訓(xùn)等手段,加強(qiáng)開發(fā)人員對軟件測試工作的認(rèn)識,使軟件開發(fā)人員能夠積極配合軟件測試相關(guān)工作,切實(shí)有效地保證軟件質(zhì)量。
4)加大軟件設(shè)計文檔審查力度
目前,GJB5000A在軍工企業(yè)逐步應(yīng)用推廣,軟件產(chǎn)品研制過程的工程化要求越來越規(guī)范和嚴(yán)謹(jǐn),對軟件產(chǎn)品研制已經(jīng)定義了流程化或模板式的操作方法,但大部分項(xiàng)目軟件人員仍然會犯“先做事,后補(bǔ)文檔”的錯誤。針對這種“重代碼、輕文檔”的現(xiàn)象,應(yīng)該結(jié)合測試管理規(guī)定中的評審機(jī)制,進(jìn)一步加強(qiáng)對文檔的審查力度,力求文檔能夠及時更新,與軟件實(shí)時保持一致。
1)嵌入式軟件測試環(huán)境
嵌入式軟件是軟硬件耦合系統(tǒng),把軟硬件分離開來,建立嵌入式軟件獨(dú)立的運(yùn)行環(huán)境是建立嵌入式軟件仿真測試環(huán)境的關(guān)鍵。一個完整的嵌入式系統(tǒng)包括處理器、I/O接口以及各種外部設(shè)備。在建立嵌入式軟件仿真測試環(huán)境時,需要考慮軟硬件的分離原則,即哪些采用真實(shí)硬件設(shè)備,哪些需要用軟件仿真實(shí)現(xiàn),哪些需要用硬件仿真實(shí)現(xiàn)。如圖5所示,不同的嵌入式系統(tǒng)以及軟件測試階段,需要建立的仿真測試環(huán)境也不相同。
圖5 不同軟件測試階段需要的測試環(huán)境
嵌入式軟件的單元測試主要采用白盒測試方法,一般在宿主機(jī)上,利用集成開發(fā)環(huán)境或測試工具的全數(shù)字仿真模擬器來進(jìn)行,找出單元編碼時產(chǎn)生的錯誤以及與軟件設(shè)計的偏差。在極特殊情況下,也可以在目標(biāo)機(jī)上進(jìn)行,利用單元測試中的驅(qū)動模塊和樁模塊進(jìn)行。
嵌入式軟件的部件測試可在宿主機(jī)環(huán)境上利用測試工具來完成,也可在目標(biāo)機(jī)上搭建仿真測試環(huán)境來完成,具體依賴于軟硬件耦合程度和部件的集成級別。
嵌入式軟件的配置項(xiàng)測試主要是軟件形成獨(dú)立的配置項(xiàng)后,加載到相應(yīng)的硬件平臺上測試其運(yùn)行情況,以確定軟硬件能夠正確協(xié)調(diào)工作,實(shí)現(xiàn)軟件需求規(guī)定的功能、性能等要求。配置項(xiàng)測試必須在目標(biāo)機(jī)環(huán)境下進(jìn)行,交聯(lián)設(shè)備可以采用仿真模型替代,也可以利用半實(shí)物仿真測試工具搭建測試環(huán)境來進(jìn)行確認(rèn)測試。
嵌入式軟件的系統(tǒng)測試是將被測軟件和硬件資源都綜合起來構(gòu)成完整的應(yīng)用系統(tǒng)進(jìn)行測試,確保整個系統(tǒng)達(dá)到研制任務(wù)書的要求。嵌入式軟件的系統(tǒng)測試對測試環(huán)境有嚴(yán)格的要求,必須在真實(shí)目標(biāo)機(jī)環(huán)境下進(jìn)行,包括運(yùn)行平臺、交聯(lián)設(shè)備都要是真實(shí)的,目的是要確保嵌入式軟件能夠在最終的真實(shí)硬件環(huán)境下正確運(yùn)行。
2)嵌入式軟件測試工具
軟件測試是一項(xiàng)有難度的專業(yè)技術(shù)工作,除了人工代碼走查、系統(tǒng)測試之外,大部分工作需要專業(yè)的軟件測試工具完成。軟件測試的很多技術(shù)問題,如內(nèi)存分配問題、測試覆蓋率問題等都可以借助合適的測試工具來解決。常見的軟件單元測試工具見表1。
表1 軟件單元測試工具
根據(jù)測試的具體需要選擇合適的測試工具既可以提高測試人員的測試效率,又可以極大提高測試的有效性。其中,TestBed能夠?qū)崿F(xiàn)匯編語言、C/C++、Fortran、Ada等語言的靜態(tài)和動態(tài)測試,可用于代碼評審、質(zhì)量評審、設(shè)計評審、測試驗(yàn)證和測試管理,是目前針對嵌入式軟件測試最有效的工具,被較多用于軍用嵌入式軟件測試。
軍用嵌入式軟件在開發(fā)方法、實(shí)現(xiàn)語言特點(diǎn)、運(yùn)行環(huán)境和承擔(dān)功能等方面所具有的特殊性,決定了其測試方法、平臺和工具的選型需要周密考慮。同時,要注重系統(tǒng)化的嵌入式軟件測試體系的建立、軟件測試環(huán)境的搭建、測試隊伍的建設(shè),以及測試管理體系的標(biāo)準(zhǔn)化等軟件測試配套工程的建設(shè),從而保證軍用嵌入式軟件測試的順利實(shí)施。