秦振漢,郭雙紅
(航天科工慣性技術(shù)有限公司,北京 100074)
導(dǎo)航計算機測試軟件是一種部署在不同類型的測試設(shè)備上,實現(xiàn)對不同型號導(dǎo)航計算機產(chǎn)品的測試,以確定被測產(chǎn)品是否為滿足功能和性能指標的應(yīng)用軟件。在導(dǎo)航計算機測試軟件的開發(fā)中,面臨著以下問題:
1)導(dǎo)航計算機作為被測產(chǎn)品,雖然種類有限,但型號繁多。每一類導(dǎo)航計算機產(chǎn)品,雖然功能上相近,但在個體上都存在差異。反映在測試軟件上,在測試方法、測試流程、數(shù)據(jù)處理、測試激勵與響應(yīng)等方面有很多都是相同或相似的, 但是由于受到軟件開發(fā)方法、開發(fā)人員和開發(fā)運行環(huán)境的限制,這些軟件的重用性很低。每當有新的軟件需求時,都要對現(xiàn)有程序進行修改和完善,這不僅浪費了大量的時間和精力, 同時測試軟件的質(zhì)量也很難得到保證。
2)一種測試設(shè)備,通常解決一種或幾種產(chǎn)品的測試,無法兼容全部型號,由此逐漸衍生出針對不同類型產(chǎn)品的多型測試設(shè)備。這些測試設(shè)備受制于開發(fā)時間、成本和需求等因素,在硬件構(gòu)成上采用了很多的專用測試儀器,有些儀器或板卡是為滿足測試要求而定制開發(fā)的。當測試設(shè)備變更、升級或板卡替換時,測試程序都會受到影響,甚至重新開發(fā)。
出現(xiàn)這些問題的原因主要是,在測試軟件開發(fā)初期缺乏統(tǒng)一的設(shè)計,每個軟件只是針對單臺測試設(shè)備,滿足對某種型號產(chǎn)品的測試需要。這些軟件本質(zhì)上都是獨立開發(fā)和維護的,即使存在復(fù)用,也主要體現(xiàn)在代碼層面和模塊層面。隨著測試設(shè)備和被測產(chǎn)品的種類、型號的增加,測試軟件的數(shù)量越來越多,給后期的修改、完善和功能擴展帶來了巨大的困難。
對于導(dǎo)航計算機測試軟件的開發(fā)而言,一個清晰明確的軟件架構(gòu)是解決這些問題的關(guān)鍵,能夠為測試軟件的開發(fā)提供一個完整而統(tǒng)一的技術(shù)途徑。軟件架構(gòu)最近才作為軟件工程的一個獨立研究領(lǐng)域出現(xiàn),它對于軟件開發(fā)的重要性和指導(dǎo)意義已經(jīng)得到了廣泛的共識,但目前對于軟件架構(gòu)這一概念還沒有一個統(tǒng)一的定義。相關(guān)的研究人員、組織和機構(gòu)分別從不同的角度,給出了不同的概念說明,在參考文獻[1-3]中做了較為詳細的闡述。拋開這些概念本身的差異,從測試軟件開發(fā)的實用角度出發(fā),軟件架構(gòu)是對整個軟件系統(tǒng)的高層抽象,描述了該系統(tǒng)內(nèi)部的組件以及組件間的相互作用,反映了系統(tǒng)設(shè)計決策的基本原理。
本文提出了一種基于組件的測試軟件架構(gòu),其出發(fā)點不是某個單獨的軟件項目,而是針對導(dǎo)航計算機測試這一特定領(lǐng)域,以解決不同被測產(chǎn)品、在不同測試設(shè)備上的軟件開發(fā)問題。通過軟件復(fù)用方式,減少重復(fù)開發(fā),提高了軟件質(zhì)量;同時,該架構(gòu)提供了良好的可擴展性,能夠適應(yīng)后續(xù)不斷增加和變化的軟件需求,滿足了研發(fā)和生產(chǎn)過程中測試軟件快速開發(fā)的需要。
導(dǎo)航計算機測試軟件采用了組件化開發(fā)方法。組件技術(shù)從根本上改變了軟件的開發(fā)方式,可以通過對組件的組裝,形成新的軟件[4-5],從而縮短了軟件的開發(fā)周期,并提高了軟件的開發(fā)質(zhì)量。組件技術(shù)的核心是組件模型。目前比較常用的組件模型主要包括CORBA、JavaBean以及COM/ActiveX、 .Net等。導(dǎo)航計算機測試軟件一般運行于Win-dows操作系統(tǒng)中,綜合考慮軟硬件資源、開發(fā)習(xí)慣、后期維護等多方面因素,導(dǎo)航計算機測試軟件采用了.Net組件模型。
大量經(jīng)過驗證的、功能多樣的組件,是測試軟件開發(fā)的基礎(chǔ)。在導(dǎo)航計算機測試軟件開發(fā)中,這些組件按性質(zhì)可以大致劃分為兩類。
第一類為測試軟件開發(fā)和運行所必須的基礎(chǔ)組件,例如報表生成組件、接口定義組件、常用算法、界面控件、數(shù)據(jù)訪問組件、領(lǐng)域模型組件等。該類組件反映的是軟件開發(fā)中的共性內(nèi)容,帶有一般性,與具體的測試業(yè)務(wù)沒有直接相關(guān)性,在測試軟件中可以全局復(fù)用,也是軟件開發(fā)和運行的必備要素。
第二類是軟件開發(fā)中帶有特定性質(zhì)的個性組件。主要包括反映不同類型測試設(shè)備信息的系統(tǒng)交互組件;針對不同型號被測產(chǎn)品,實現(xiàn)不同功能需求的測試業(yè)務(wù)組件等。該類組件面向特定對象,具有特殊性。在軟件開發(fā)和調(diào)試時,主要是針對這些元素進行修改、完善和補充。
這些組件主要來自對已有的知識和經(jīng)驗的歸納和總結(jié)。通過將具有復(fù)用價值的內(nèi)容封裝為獨立的組件,建立了適用于導(dǎo)航計算機測試這一特定領(lǐng)域的組件庫。當針對特定的軟件需求進行應(yīng)用軟件開發(fā)時,可直接復(fù)用已有的基礎(chǔ),遵循公共的軟件架構(gòu),將需要的組件裝配在一起,以實現(xiàn)不同的軟件功能。在這種開發(fā)方式下,不同項目的測試軟件開發(fā)問題,可以轉(zhuǎn)換為依靠統(tǒng)一的軟件架構(gòu)、針對特定需求的組件開發(fā)與組件裝配問題。
在導(dǎo)航計算機測試軟件開發(fā)中,架構(gòu)設(shè)計處于核心位置。它規(guī)定了軟件的整體組織結(jié)構(gòu)、內(nèi)部組成元素及功能分工;提供了可納入組件庫的各種組件的接口規(guī)范;預(yù)先定義了測試軟件的開發(fā)流程,指導(dǎo)軟件開發(fā)活動。
軟件架構(gòu)是對系統(tǒng)的整體構(gòu)想,詳細描述了包含的架構(gòu)圖、組件、接口規(guī)范和交互機制等[6]。與獨立的測試軟件相比,導(dǎo)航計算機測試軟件的架構(gòu)設(shè)計不能只針對某個特定的軟件項目,而應(yīng)該覆蓋導(dǎo)航計算機測試領(lǐng)域內(nèi)的不同的軟件需求;同時,能夠提供靈活的擴展機制,適應(yīng)多樣化的需求變化。
導(dǎo)航計算機測試軟件架構(gòu)采用了常用的分層式架構(gòu)風格[7-9],將體系結(jié)構(gòu)劃分為顯示層、系統(tǒng)交互層、數(shù)據(jù)訪問層和業(yè)務(wù)邏輯層等4層,如圖1所示。
圖1 導(dǎo)航計算機測試軟件的邏輯架構(gòu)框圖Fig.1 The logic architecture of navigation computer test software
1)顯示層是應(yīng)用程序和用戶的交互界面。該層內(nèi)包含了與具體業(yè)務(wù)無關(guān)的界面組件,并通過組合模式加載在主程序中。主程序以可執(zhí)行程序形式存在,負責完成各組件的動態(tài)加載和組件間通信等,是所有組件賴以運行的基礎(chǔ)。
2)數(shù)據(jù)訪問層負責配置參數(shù)的訪問、修改,測試數(shù)據(jù)、結(jié)果的保存,測試履歷書的生成等。
3)系統(tǒng)交互層負責完成測試設(shè)備硬件(包括測試儀器、電氣連接關(guān)系等)的封裝,其主要功能是將軟件的測試業(yè)務(wù)與具體的硬件設(shè)計分離,提高儀器互換性。導(dǎo)航計算機測試設(shè)備使用了很多非標儀器和板卡,無法使用諸如可編程儀器的標準命令(Standard Commands for Programmable Instrum-ents,SCPI)、VXI總線即插即用(VXI Plug&Play,VPP)規(guī)范、可互換虛擬儀器 (Interchangeable Virtual Instruments,IVI)標準等儀器互換性技術(shù)和方法。僅以IVI驅(qū)動而言,目前只提供了13種儀器類驅(qū)動,且只適用于通用儀器[10-11]。但在導(dǎo)航計算機測試設(shè)備中,大多數(shù)儀器和板卡的驅(qū)動程序都不是按照這些標準開發(fā)的。為此,采用了基于功能分解的設(shè)計方法,忽略具體儀器或板卡的實現(xiàn)細節(jié)[12-14],通過對測試設(shè)備所需實現(xiàn)功能的抽象,形成針對該設(shè)備的接口模型。
在導(dǎo)航計算機測試中,所需的功能項可細分為基本的儀器操作、產(chǎn)品切換、產(chǎn)品供電等共用類;以及各種通信數(shù)據(jù)收發(fā)、各種脈沖信號的輸出控制、外部的恒流源控制、選通信號控制、振梁信號輸出、DI/DO操作、AD/DA操作等專用類。每種測試設(shè)備需要實現(xiàn)的功能都是若干個功能項的組合,區(qū)別集中在功能項的種類和數(shù)量。為此,將帶有共用性質(zhì)的功能項合并為基礎(chǔ)接口,在定義后基本不會修改;將帶有專用性質(zhì)的功能項合并為專用接口,在軟件設(shè)計時需要根據(jù)測試需求的不同進行修改和完善。例如,在圖1中,X類設(shè)備實現(xiàn)組件和Y類設(shè)備實現(xiàn)組件就是根據(jù)不同需求,單獨開發(fā)的個性化組件。
4)業(yè)務(wù)邏輯層負責完成各種導(dǎo)航計算機的特定測試功能,包括常用的性能測試功能、在線升級功能、VF標定功能和電源監(jiān)測功能等。業(yè)務(wù)邏輯層內(nèi)的組件只關(guān)注各自的業(yè)務(wù)流程與軟件需求,例如,在圖1中,業(yè)務(wù)邏輯層內(nèi)部包含了電源監(jiān)測組件,以及針對A、B兩種型號被測產(chǎn)品的性能測試組件。這些業(yè)務(wù)組件直接反映了某種特定的測試需求,往往需要根據(jù)不同的業(yè)務(wù)需求進行定制開發(fā)。在業(yè)務(wù)層定義的組件接口中,包含了測試設(shè)備硬件控制接口、數(shù)據(jù)訪問層控制接口、事件發(fā)送與接收接口等,開發(fā)人員只針對接口編程,不依賴具體實現(xiàn),有效降低了組件間的耦合性。
5)組件庫是各種類型組件的集合,其中既包括公共性組件,例如,定義接口規(guī)范、常用工具、算法的基礎(chǔ)組件;管理電子履歷模板、配置文件模板等的模板管理庫等;也包括反映特定測試設(shè)備的硬件驅(qū)動庫和反映特定業(yè)務(wù)領(lǐng)域的領(lǐng)域模型庫。
在該架構(gòu)設(shè)計中采用了兩種交互方式:1)顯式調(diào)用方式,即上層組件通過接口,調(diào)用臨近下層提供的服務(wù)。例如,業(yè)務(wù)層組件可以通過系統(tǒng)交互層的對外接口,實現(xiàn)對硬件設(shè)備的直接控制;2)采用事件機制的發(fā)布-訂閱方式[4,15]。例如,系統(tǒng)交互層組件將采集到的電源數(shù)據(jù)封裝為事件消息,通過事件發(fā)送接口,發(fā)布給業(yè)務(wù)邏輯層的事件訂閱組件;后者通過事件接收接口獲得信息,完成監(jiān)測數(shù)據(jù)的處理。針對處于同一層次的組件,采用基于事件的轉(zhuǎn)發(fā)方式,即先將交互信息發(fā)送到主程序,再由后者將信息轉(zhuǎn)發(fā)到目標組件中。
通過接口調(diào)用和事件機制,降低、簡化了各組件的對外依賴性,使軟件可以在不修改、少修改的前提下,快速應(yīng)對業(yè)務(wù)需求的變化。
根據(jù)組裝模式的不同,可以分為靜態(tài)組裝和動態(tài)組裝。對于測試軟件開發(fā)和運行所必須的共性組件,直接通過引用方式,由軟件集成開發(fā)工具完成組裝。但對于各種后續(xù)開發(fā)的、以獨立的插件形式發(fā)布的個性化組件,必須使用動態(tài)組裝方式。動態(tài)組裝的組件信息統(tǒng)一保存在一組配置文件中,該文件采用XML形式,內(nèi)部包括了各種組件的存在目錄、命名空間、類名和加載順序等基本信息。
動態(tài)組裝功能由主程序發(fā)起,但具體的執(zhí)行交由各層的類廠組件。類廠組件根據(jù)配置文件的內(nèi)容,使用反射機制動態(tài)創(chuàng)建類型的實例。通過這種動態(tài)組裝方式,使測試軟件具有良好的擴展性,當需要增加或修改軟件功能時,只需要在配置文件中修改或增加該組件的屬性信息。
組件庫提供了測試軟件開發(fā)的基礎(chǔ)材料,軟件架構(gòu)規(guī)定了測試軟件的整體結(jié)構(gòu),明確了組件的裝配方式和交互方式,但兩者本身并不實現(xiàn)具體的測試功能。在面向某型號導(dǎo)航計算機的測試需求時,需要從已有組件庫選擇必須的組件,并開發(fā)針對特定需求的個性化組件,然后按照預(yù)先定義的開發(fā)流程,將這些組件組裝在一起,形成針對該型號產(chǎn)品的應(yīng)用軟件。
在組件庫中,共性組件可以直接復(fù)用,不必重新開發(fā),因而組件開發(fā)的重點是按照軟件架構(gòu)的規(guī)定,開發(fā)針對特定需求的個性化組件。在該軟件架構(gòu)中,待開發(fā)的組件集中在業(yè)務(wù)邏輯層和系統(tǒng)交互層內(nèi)。業(yè)務(wù)邏輯層組件和系統(tǒng)交互層組件的組合方式如圖2所示。
圖2 組件關(guān)系示意圖Fig.2 The diagram of component relationship
在導(dǎo)航計算機測試中,核心的測試業(yè)務(wù)包括測試過程中的電源監(jiān)測、功能和性能指標測試、老化測試、產(chǎn)品標定測試、監(jiān)控上傳等。這些業(yè)務(wù)組件遵循架構(gòu)中定義的業(yè)務(wù)組件接口,通過事件接口實現(xiàn)組件間的隱式交互;通過數(shù)據(jù)訪問層對外接口獲取和保存測試數(shù)據(jù);通過系統(tǒng)交互層基礎(chǔ)接口,實現(xiàn)與測試設(shè)備硬件的交互。在業(yè)務(wù)層組件開發(fā)時,這些核心組件一般以大顆粒度的、帶有界面的控件形式存在,以確保每個組件能夠完整地實現(xiàn)一項相對獨立的業(yè)務(wù)需求。因為需求相對獨立,所以修改和新增組件時,不會對其他組件產(chǎn)生太大影響。
系統(tǒng)交互層組件必須實現(xiàn)該層定義的基礎(chǔ)接口和專用接口。在軟件架構(gòu)中,每個型號的測試設(shè)備,都對應(yīng)一個系統(tǒng)交互組件和若干個電氣連接文件。系統(tǒng)交互組件通過調(diào)用對應(yīng)硬件的驅(qū)動程序?qū)崿F(xiàn)了對各種測試儀器和板卡的控制功能。測試設(shè)備的電氣連接關(guān)系以表格或配置文件的形式單獨封裝。在配置文件內(nèi)部描述了測試設(shè)備的對外連接端口,以及各連接端口與硬件儀器間的映射關(guān)系。當交互層組件建立后,測試軟件根據(jù)這些配置文件,實現(xiàn)對各硬件儀器和板卡的控制。
以產(chǎn)品切換控制功能為例,在硬件層面,切換控制功能可以采用外設(shè)部件互連標準(Peripheral Component Interconnect,PCI)總線形式的專用板卡,也可以采用標準的繼電器儀器。在交互層組件開發(fā)時,對于前者,使用硬件廠商提供的應(yīng)用程序編程接口(Application Programming Interface,API)函數(shù);對于后者可直接調(diào)用IviSwtch類驅(qū)動[16-17]。在交互層組件開發(fā)和調(diào)試完畢后,除非硬件發(fā)生變化,否則該組件和配置文件基本不會修改。
在架構(gòu)設(shè)計時,預(yù)先定義了幾種典型場景下的軟件開發(fā)流程,為軟件開發(fā)人員提供指導(dǎo),便于后續(xù)的應(yīng)用軟件開發(fā)、修改和完善。
場景1:在全新的測試設(shè)備上,進行首個測試軟件的開發(fā)。開發(fā)人員的工作包括兩點,首先針對軟件架構(gòu)中的系統(tǒng)交互層,抽象出與該設(shè)備功能對應(yīng)的專用接口,開發(fā)系統(tǒng)交互層組件,該組件開發(fā)完畢后可直接復(fù)用;其次,根據(jù)測試產(chǎn)品的測試需求,分解具體的測試業(yè)務(wù),開發(fā)測試業(yè)務(wù)組件,形成的組件成果可作為后續(xù)其他型號開發(fā)的模板。
場景2:日常的完善性或更正性維護。從實際情況看,這些維護工作基本集中在業(yè)務(wù)邏輯層。在組件進行針對性修改后,可直接進行替換。
場景3:增加對新增產(chǎn)品的測試支持。一種測試設(shè)備經(jīng)過擴展后,可以實現(xiàn)對新增型號產(chǎn)品的測試。此時,采用增量化開發(fā)方法,針對新增的需求,開發(fā)特定的業(yè)務(wù)組件,并通過插件方式增加到已有的程序中。在開發(fā)過程中,可直接以現(xiàn)有的業(yè)務(wù)組件為模板,衍生出特定的業(yè)務(wù)組件。
場景4:測試軟件的移植。測試設(shè)備的硬件在升級和改造后,已有的測試軟件可以快速移植,避免了重復(fù)開發(fā)。在架構(gòu)設(shè)計時,與硬件相關(guān)的內(nèi)容已經(jīng)統(tǒng)一劃分在系統(tǒng)交互層中,同時業(yè)務(wù)層組件只和系統(tǒng)交互層對外接口關(guān)聯(lián),所以在移植前,只需要重新開發(fā)和修改交互層組件,即可直接進行替換。
本文以導(dǎo)航計算機測試這一特定領(lǐng)域為目標,設(shè)計了基于組件的分層式軟件架構(gòu),為測試軟件開發(fā)提供了統(tǒng)一的解決方案。該方案規(guī)范了軟件開發(fā)的整體流程,避免了測試軟件的分立開發(fā)問題;通過架構(gòu)復(fù)用和組件復(fù)用等方式,使得測試軟件可以在一套基礎(chǔ)平臺下開發(fā),減少了重復(fù)勞動,提高了軟件的開發(fā)質(zhì)量和開發(fā)效率。
目前,該軟件架構(gòu)已經(jīng)在多種導(dǎo)航計算機測試軟件項目中得到應(yīng)用。從使用情況看,在軟件開發(fā)的前期,因為需要搭建軟件的整體架構(gòu)、開發(fā)共性組件、建立配置文件、進行軟件的調(diào)試和驗證等,工作量較大,占用時間較長。但是這些基礎(chǔ)工作完畢后,其成果可以直接復(fù)用在后面的所有軟件項目中,并且隨著組件庫的不斷更新、擴展和完善,開發(fā)周期大幅縮減;同時,這些軟件遵循相同的體系結(jié)構(gòu),軟件間具有很強的延續(xù)性,有效降低了修改、維護和管理的難度,可以很方便地針對不同需求進行功能擴展,滿足不同被測產(chǎn)品、在不同測試設(shè)備上的測試軟件開發(fā)需要。