曹曉勇 王德偉 劉 希
摘 要:針對(duì)艦炮火控軟件單元測(cè)試工作量大、效率低的問(wèn)題及現(xiàn)狀,基于軟件單元測(cè)試的理論,分析研究了單元測(cè)試所關(guān)注的測(cè)試內(nèi)容、測(cè)試方法、測(cè)試環(huán)境搭建以及測(cè)試用例設(shè)計(jì)等要點(diǎn),同時(shí)結(jié)合某型號(hào)產(chǎn)品艦炮火控軟件單元測(cè)試的實(shí)踐,總結(jié)了艦炮火控軟件單元測(cè)試的經(jīng)驗(yàn),并在此基礎(chǔ)上提出了有效提高單元測(cè)試效率,從而提高艦炮火控軟件質(zhì)量的方法和途徑。
關(guān)鍵詞:艦炮火控軟件;單元測(cè)試;靜態(tài)分析;白盒測(cè)試;黑盒測(cè)試
中圖分類號(hào):TP311.5 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1004-373X(2009)21-013-03
Research on Unit Testing for the Software of Shipborne Gunnery Fire Control System
CAO Xiaoyong,WANG Dewei,LIU Xi
(Jiangsu Automation Research Institute,China Shipbuilding Industry Corporation,Lianyungang,222006,China)
Abstract:Aimed at the problem and actuality of mass workload and low efficiency in unit testing for the software of shipborne gunnery fire control system.Based on the fundamental theory of software testing,the essential points of unit testing,such as testing content,testing methods,testing environment building and testing cases designing are researched,the 〆xperience of unit testing for the software of shipborne gunnery fire control system is summarized.Some means and approaches to improve the efficiency of unit testing and the quality of software are proposed.
Keywords:shipborne gunnery fire control system Software;unit testing;static analysis;white box testing;black box testing
隨著艦炮火控技術(shù)的不斷發(fā)展,艦炮火控軟件的精確度和復(fù)雜度越來(lái)越高,繼而對(duì)火控軟件的質(zhì)量和可靠性要求也就相應(yīng)提高。而軟件測(cè)試不僅是保證軟件可靠性的必要和有效手段,更是軟件質(zhì)量保證的關(guān)鍵步驟。從軟件生命周期全過(guò)程來(lái)看,測(cè)試可分為單元測(cè)試、集成測(cè)試、確認(rèn)測(cè)試、系統(tǒng)測(cè)試等階段[1]。其中,單元測(cè)試是整個(gè)測(cè)試過(guò)程中最基礎(chǔ)、最核心的一個(gè)環(huán)節(jié),單元測(cè)試不僅要針對(duì)每一個(gè)模塊進(jìn)行,而且每個(gè)模塊的每條語(yǔ)句至少要遍歷一次,其工作量之大也是可想而知的[2]。那么,艦炮火控軟件單元測(cè)試到底該如何進(jìn)行,才能有效地提高測(cè)試效率,逐漸成為大家日益關(guān)注的問(wèn)題。
1 單元測(cè)試概述
單元測(cè)試是針對(duì)軟件設(shè)計(jì)的最小單位——模塊進(jìn)行的,其測(cè)試依據(jù)是軟件的詳細(xì)設(shè)計(jì)說(shuō)明[3]。測(cè)試者根據(jù)詳細(xì)設(shè)計(jì)說(shuō)明和源程序,了解模塊的輸入、輸出條件和邏輯結(jié)構(gòu),并通過(guò)測(cè)試來(lái)發(fā)現(xiàn)編碼是否有誤、程序邏輯結(jié)構(gòu)是否合理、模塊的功能實(shí)現(xiàn)是否正確、與詳細(xì)設(shè)計(jì)文檔要求是否一致等。單元測(cè)試主要包括功能測(cè)試和結(jié)構(gòu)覆蓋測(cè)試,針對(duì)有性能(運(yùn)行時(shí)間或占用空間)要求的模塊和單元,還有必要做性能測(cè)試。單元測(cè)試通常采用白盒測(cè)試為主,黑盒測(cè)試為輔的策略[4]。

2 單元測(cè)試關(guān)注要點(diǎn)
2.1 單元測(cè)試內(nèi)容
在單元測(cè)試中,需要對(duì)以下五個(gè)方面的內(nèi)容進(jìn)行測(cè)試[5]:
(1) 模塊接口測(cè)試。測(cè)試模塊的數(shù)據(jù)流,主要指模塊的形式參數(shù)與實(shí)際參數(shù)在個(gè)數(shù)、屬性、順序上是否匹配;全局變量的定義在各模塊中是否一致等。
(2) 局部數(shù)據(jù)結(jié)構(gòu)測(cè)試。模塊的局部數(shù)據(jù)結(jié)構(gòu)是常見的錯(cuò)誤來(lái)源,這些錯(cuò)誤主要體現(xiàn)在數(shù)據(jù)類型說(shuō)明不正確或不一致;局部變量未初始化就被使用;初始值或默認(rèn)值錯(cuò)誤等。
(3) 路徑測(cè)試。對(duì)執(zhí)行路徑和循環(huán)進(jìn)行測(cè)試,通常采用白盒測(cè)試方法來(lái)設(shè)計(jì)測(cè)試用例,用以查找由于錯(cuò)誤的計(jì)算、不正確的比較或不正常的控制流而導(dǎo)致的錯(cuò)誤。
(4) 錯(cuò)誤處理測(cè)試。對(duì)模塊的容錯(cuò)能力進(jìn)行測(cè)試,比較完善的設(shè)計(jì)要求模塊能夠預(yù)見出錯(cuò)的條件,并設(shè)置適當(dāng)?shù)某鲥e(cuò)處理對(duì)策,以便在程序出錯(cuò)時(shí),能對(duì)出錯(cuò)程序進(jìn)行安排,保證其邏輯上的正確性。
(5) 邊界測(cè)試。重在檢測(cè)以下問(wèn)題:如在n次循環(huán)的第0次、1次、n次是否有錯(cuò);運(yùn)算或判斷中取最大最小值時(shí)是否有錯(cuò);數(shù)據(jù)流、控制流中剛好等于、大于、┬∮諶范ǖ謀冉現(xiàn)凳筆欠裼寫淼取
2.2 單元測(cè)試的方法
單元測(cè)試的方法一般有三種:靜態(tài)分析、黑盒測(cè)試、白盒測(cè)試。其中靜態(tài)分析又稱為靜態(tài)測(cè)試,黑盒測(cè)試和白盒測(cè)試被稱為動(dòng)態(tài)測(cè)試

2.2.1 靜態(tài)分析
靜態(tài)分析是指不執(zhí)行被測(cè)代碼,人工或借助專用工具審查軟件設(shè)計(jì)文檔和程序源代碼,對(duì)軟件單元或模塊的控制流、數(shù)據(jù)流、接口特性及表達(dá)式等進(jìn)行分析,從而保證代碼正確性、清晰性、規(guī)范性、一致性、算法高效性,并盡可能地發(fā)現(xiàn)程序中隱含的錯(cuò)誤的過(guò)程[6]。通常,程序源代碼的靜態(tài)分析,包括從命名規(guī)則檢查、寄存器使用、編碼格式、出/入口連結(jié)、編程語(yǔ)言使用、存儲(chǔ)器使用、測(cè)試和轉(zhuǎn)移、可維護(hù)性、邏輯和程序多余物等十個(gè)方面對(duì)代碼進(jìn)行審查。按軟件質(zhì)量模型規(guī)定的相關(guān)度量指標(biāo)對(duì)源代碼的文本、注釋、扇入/扇出數(shù)、圈復(fù)雜度等指標(biāo)進(jìn)行度量。
2.2.2 黑盒測(cè)試
黑盒測(cè)試也稱功能測(cè)試或數(shù)據(jù)驅(qū)動(dòng)測(cè)試。它是在已知軟件單元所具有的功能的前提下,不考慮程序內(nèi)部結(jié)構(gòu)和內(nèi)部特性,把程序看作一個(gè)不能打開的黑盒子,檢查程序功能是否按照軟件詳細(xì)設(shè)計(jì)的規(guī)定正確實(shí)現(xiàn)、程序是否能正確地接收輸入數(shù)據(jù)從而產(chǎn)生正確的輸出信息,并且保持外部信息(如數(shù)據(jù)庫(kù)或文件)的完整性[7]。
黑盒測(cè)試從原則上講應(yīng)是窮舉輸入測(cè)試,只有把所有可能的輸入都作為測(cè)試情況使用,才能以這種方法查出程序中的所有錯(cuò)誤。實(shí)際測(cè)試情況有無(wú)窮多個(gè),而且測(cè)試人員不僅要測(cè)試所有合法的輸入,還要對(duì)那些不合法但是可能的輸入進(jìn)行測(cè)試。顯然,把輸入數(shù)據(jù)的所有可能取值都進(jìn)行測(cè)試,是不可能也是無(wú)意義的。設(shè)計(jì)黑盒測(cè)試的測(cè)試用例有很多種方法,例如等價(jià)類劃分法、邊界值分析法、錯(cuò)誤推測(cè)法等。最常用的方法是等價(jià)類劃分法。這種方法將測(cè)試空間的輸入數(shù)據(jù)分為三類,即正常輸入、邊界輸入和非法輸入,每種輸入還可進(jìn)行更詳細(xì)的劃分,在設(shè)計(jì)測(cè)試用例時(shí)取每類的若干個(gè)數(shù)據(jù)作為輸入數(shù)據(jù),如果測(cè)試通過(guò),可以肯定同類的其他輸入也是可以通過(guò)的。這種方法不僅有助于提高測(cè)試用例的有效性,而且有助于提高黑盒測(cè)試的效率。
2.2.3 白盒測(cè)試
除黑盒測(cè)試以外,單元測(cè)試還需要從另一個(gè)角度即程序的邏輯結(jié)構(gòu)來(lái)設(shè)計(jì)測(cè)試用例,并用邏輯覆蓋率來(lái)衡量測(cè)試的完整性,即所謂的白盒測(cè)試[8]。對(duì)于白盒測(cè)試的邏輯覆蓋率,一般有專門的覆蓋率測(cè)試工具來(lái)完成。
白盒測(cè)試用例的設(shè)計(jì)方法是畫出程序的邏輯結(jié)構(gòu)圖(如程序流程圖或控制流圖),并根據(jù)邏輯結(jié)構(gòu)圖設(shè)計(jì)測(cè)試用例。白盒測(cè)試的邏輯單位主要有語(yǔ)句、分支、條件、條件值、條件值組合、路徑等。
一般來(lái)講,與條件直接有關(guān)的錯(cuò)誤主要是邏輯操作符錯(cuò)誤,例如:將“||”寫成“&&”,或在“!=”中漏了寫“!”等,所以在具體的白盒測(cè)試中,只要采用分支覆蓋與條件覆蓋的組合,基本上可以發(fā)現(xiàn)這些錯(cuò)誤,另一方面,要全部完成語(yǔ)句覆蓋、條件覆蓋、分支覆蓋、路徑覆蓋的成本和代價(jià)是很高的,其工作量更是難以估計(jì),僅條件值覆蓋與條件值組合覆蓋往往就需要設(shè)計(jì)和執(zhí)行大量的測(cè)試用例。因此,從測(cè)試的投入和產(chǎn)出角度來(lái)說(shuō),進(jìn)行白盒測(cè)試時(shí),并不是覆蓋的邏輯單位越多越好,不同關(guān)鍵等級(jí)的模塊應(yīng)采用不同的邏輯覆蓋單位,這樣才能最好地體現(xiàn)測(cè)試的有效性。
2.3 單元測(cè)試的環(huán)境搭建和用例設(shè)計(jì)
單元測(cè)試是針對(duì)程序最小單元的測(cè)試,單元本身通常不能單獨(dú)運(yùn)行,因此在單元測(cè)試時(shí)需要為被測(cè)單元設(shè)計(jì)樁模塊和驅(qū)動(dòng)模塊。
(1) 驅(qū)動(dòng)模塊:相當(dāng)于所測(cè)模塊的主程序。它接收測(cè)試數(shù)據(jù),將這些數(shù)據(jù)傳送給被測(cè)模塊,最后再輸出實(shí)際測(cè)試結(jié)果。
(2) 樁模塊:用于代替被測(cè)模塊所調(diào)用的下層模塊,其作用是返回被測(cè)模塊所需要的數(shù)據(jù)和信息。
驅(qū)動(dòng)模塊、被測(cè)模塊、樁模塊三者共同構(gòu)成了單元測(cè)試“測(cè)試環(huán)境”,如圖1所示。
測(cè)試用例設(shè)計(jì)的目的是驗(yàn)證程序的功能、性能和結(jié)構(gòu),找出程序中隱含的錯(cuò)誤和缺陷。測(cè)試用例設(shè)計(jì)的基本原則是[9]:
(1) 一個(gè)好的測(cè)試用例在于它能發(fā)現(xiàn)至今未能發(fā)現(xiàn)的錯(cuò)誤或缺陷;
(2) 測(cè)試用例至少由測(cè)試輸入和測(cè)試輸出兩部分組成;
(3) 設(shè)計(jì)測(cè)試用例時(shí),應(yīng)考慮到合理的和不合理的輸入條件;
(4) 窮舉測(cè)試是不可能的,但可以通過(guò)設(shè)計(jì)測(cè)試用例,覆蓋所有的條件;
(5) 對(duì)發(fā)現(xiàn)錯(cuò)誤和缺陷較多的程序段,應(yīng)著重進(jìn)行更深入的測(cè)試。
3 基于實(shí)踐的測(cè)試經(jīng)驗(yàn)和建議
艦炮火控軟件是實(shí)時(shí)性要求較高的嵌入式軟件,其軟件與硬件具有極高的耦合度,在通用PC機(jī)平臺(tái)上常常無(wú)法運(yùn)行,需要特定的專用計(jì)算機(jī)硬件平臺(tái)及專用外部設(shè)備。另外,雖然艦炮火控軟件大多數(shù)采用的是結(jié)構(gòu)化設(shè)計(jì),但近年來(lái)隨著艦炮火控軟件技術(shù)的不斷發(fā)展,面向?qū)ο蟮脑O(shè)計(jì)越來(lái)越多地被接納和采用。
針對(duì)艦炮火控軟件的這些特點(diǎn),選擇了LDRA公司的TestBed/Tbrun系列測(cè)試工具作為某型號(hào)軟件產(chǎn)品單元測(cè)試的基本工具,并進(jìn)行了靜態(tài)分析、黑盒測(cè)試和白盒測(cè)試。
根據(jù)要完成的測(cè)試任務(wù),采用了如圖2所示的基于目標(biāo)機(jī)的交叉測(cè)試環(huán)境。宿主機(jī)是通用Windows平臺(tái),安裝Tornado 2.0開發(fā)環(huán)境以及測(cè)試工具LDRA Testbed,完成被測(cè)模塊的插裝及編譯鏈接,產(chǎn)生可執(zhí)行的目標(biāo)代碼。宿主機(jī)與目標(biāo)機(jī)之間通過(guò)網(wǎng)絡(luò)完成代碼下載、測(cè)試數(shù)據(jù)獲取以及覆蓋率分析。
通過(guò)本次測(cè)試實(shí)踐,獲得如下經(jīng)驗(yàn)和建議:
(1) 在結(jié)構(gòu)化程序中,所謂的單元是指函數(shù),而在面向?qū)ο蟮某绦蛑?單元的概念發(fā)生了變化,而是指類。從對(duì)某型號(hào)軟件產(chǎn)品單元測(cè)試的實(shí)踐來(lái)看,以類作為測(cè)試單位,復(fù)雜度高,可操作性較差,因此仍然主張以函數(shù)作為單元測(cè)試的基本單位,但可以用一個(gè)測(cè)試類來(lái)組織某個(gè)類的所有測(cè)試函數(shù)。需要說(shuō)明的是,單元測(cè)試不應(yīng)過(guò)分強(qiáng)調(diào)面向?qū)ο?因?yàn)榫植看a依然是結(jié)構(gòu)化的。單元測(cè)試的工作量較大,簡(jiǎn)單實(shí)用高效才是硬道理。
(2) 靜態(tài)分析能夠有效地發(fā)現(xiàn)30%~70%的語(yǔ)法錯(cuò)誤和編碼錯(cuò)誤,但很難挖掘出程序代碼中的隱性錯(cuò)誤和缺陷,尤其是需要軟件動(dòng)態(tài)運(yùn)行才能暴露出來(lái)的錯(cuò)誤。黑盒測(cè)試能夠動(dòng)態(tài)檢查并較好地發(fā)現(xiàn)軟件單元的功能性錯(cuò)誤,但其測(cè)試的完整性卻難于測(cè)量。而白盒測(cè)試不僅能夠動(dòng)態(tài)運(yùn)行檢查軟件單元的邏輯錯(cuò)誤,而且其
覆蓋率測(cè)試恰恰具有易于衡量測(cè)試完整性的優(yōu)點(diǎn)。所以對(duì)于單元測(cè)試來(lái)講,三者之間具有極好的互補(bǔ)性,通常推薦的單元測(cè)試步驟和過(guò)程是,先進(jìn)行靜態(tài)分析,然后進(jìn)行黑盒的功能測(cè)試,黑盒測(cè)試后統(tǒng)計(jì)覆蓋率,如果覆蓋未達(dá)到測(cè)試計(jì)劃中所規(guī)定的標(biāo)準(zhǔn),那么針對(duì)未被覆蓋的語(yǔ)句部分代碼進(jìn)行邏輯分析,并結(jié)合白盒測(cè)試的測(cè)試用例再次對(duì)軟件單元進(jìn)行測(cè)試,直到滿足覆蓋要求。同時(shí),對(duì)無(wú)法覆蓋的語(yǔ)句或分支也要給出說(shuō)明和理由。
(3) 對(duì)于白盒測(cè)試的幾種邏輯單位的測(cè)試,通常推薦的步驟和方法是“先簡(jiǎn)單后復(fù)雜”。例如,進(jìn)行黑盒測(cè)試后統(tǒng)計(jì)覆蓋率,先檢查是否有語(yǔ)句未覆蓋,若有則設(shè)計(jì)測(cè)試用例覆蓋它,然后用同樣方法完成條件覆蓋、分支覆蓋和路徑覆蓋,這樣既檢驗(yàn)了黑盒測(cè)試的完整性,又避免了重復(fù)的工作,用較少的時(shí)間成本獲得了較高的測(cè)試效率。
4 結(jié) 語(yǔ)
隨著火控技術(shù)不斷發(fā)展,艦炮火控軟件的工程化水平也在不斷改進(jìn),對(duì)軟件測(cè)試的要求也在進(jìn)一步提高,在這種情況下如何更好地開展軟件測(cè)試工作,如何將軟件測(cè)試的理論和方法更好地運(yùn)用到軟件產(chǎn)品的測(cè)試實(shí)踐中去,是很有意義和價(jià)值的問(wèn)題。本文論述了軟件單元測(cè)試的理論和方法,介紹了單元測(cè)試在實(shí)際工作中的實(shí)踐和經(jīng)驗(yàn),希望對(duì)艦炮火控軟件的測(cè)試工作能夠有進(jìn)一步的推動(dòng)和提高。
參考文獻(xiàn)
[1] 朱少民.軟件測(cè)試方法和技術(shù)[M].北京:清華大學(xué)出版社,2005.
[2]John D Musa.軟件可靠性工程[M].北京:機(jī)械工業(yè)出版社,2003.
[3]何永軍.聲納嵌入式軟件的單元測(cè)試及結(jié)構(gòu)覆蓋率測(cè)試方法[J].聲學(xué)與電子工程,2004(4):45-47.
[4]Roger S Pressman.軟件工程——實(shí)踐者的研究方法[M].梅宏,譯.北京:機(jī)械工業(yè)出版社,2004.
[5]張猛,毛亮.航天嵌入式軟件的單元測(cè)試方法探討[J].航天器工程,2006,15(2):32-35.
[6]Dirk Huberty.軟件質(zhì)量與軟件測(cè)試[M].馬博,趙云龍,譯.北京:清華大學(xué)出版社,2003.
[7]Shari Lawrence Pfleeger.軟件工程——理論與實(shí)踐[M].北京:高等教育出版社,2001.
[8]宮云戰(zhàn).軟件測(cè)試[M].北京:國(guó)防工業(yè)出版社,2006.
[9]Ron Patton.軟件測(cè)試[M].北京:機(jī)械工業(yè)出版社,2000.
作者簡(jiǎn)介 曹曉勇 女,1978年出生,河南漯河人,工程師,學(xué)士。研究方向?yàn)榛鹂啬P团c軟件,嵌入式軟件測(cè)試。
王德偉 男,1982年出生,山西原平人,助理工程師,學(xué)士。研究方向?yàn)榛鹂啬P团c軟件。
劉 希 男,1986年出生,湖北襄樊人,助理工程師,學(xué)士。研究方向?yàn)榍度胧杰浖y(cè)試。