基于模塊化設計的嵌入式軟件測試方法
關(guān)鍵詞:模塊化設計 嵌入式軟件 軟件測試 測試方法 測試模型 數控系統
嵌入式設計已經(jīng)成為工業(yè)現代化、智能化的必經(jīng)之路,嵌入式產(chǎn)品已經(jīng)深入到各行各業(yè)。嵌入式系統的專(zhuān)用程度較高,系統的整體繼承性相對較小,為了保證系統的穩定性,軟件的測試成為嵌入式開(kāi)發(fā)的一個(gè)重要環(huán)節。由于嵌入式軟件自身的特點(diǎn),傳統的軟件測試理論不能直接用于嵌入式軟件的測試,因此,研究嵌入式軟件的測試有重要意義。
1 基本概念簡(jiǎn)述
1.1 模塊化設計
軟件的設計是以一定的方法為基礎的。面對越來(lái)越復雜的軟件開(kāi)發(fā)任務(wù),人們提出了各種軟件設計的模型。從用戶(hù)需求和系統要實(shí)現的任務(wù)功能出發(fā),把大型的軟件劃分為相對較小的模塊。為了減少模塊與模塊之間的關(guān)聯(lián)性,模塊之間的邏輯結構相對獨立,無(wú)函數的交叉調用,數據傳遞由全局變量完成,這就是模塊化設計的基本思想。模塊化設計的核心是模塊的獨立性,主要包括功能獨立性和結構獨立性,這使得軟件開(kāi)發(fā)的分工易于實(shí)現。軟件測試是軟件開(kāi)發(fā)中的關(guān)鍵環(huán)節,基于模塊化設計的軟件測試模型簡(jiǎn)單,查錯和糾錯都易于實(shí)現。下面以單鏈路數據傳遞的軟件模型說(shuō)明模塊化軟件設計的軟件測試的基本原則。
在圖1中,函數F(X-Y)定義為軟件模塊X到軟件模塊Y的接口函數,用來(lái)通過(guò)終端顯示由模塊X進(jìn)入模塊Y的數據。如果模塊C執行后發(fā)生錯誤,則由模塊B和模塊C的數據接口函數F(B-C)判斷是否是模塊B出來(lái)的數據就是錯誤的。如果F(B-C)不錯,則證明模塊C存在錯誤;如果F(B-C)傳遞數據錯誤,再察看F(A-B)傳出的數據是否錯誤,如果不錯則證明模塊B存在錯誤。用此依次前推孤立錯誤的方法,即可以很容易地定位錯誤所在的模塊。這就是模塊化設計時(shí)軟件測試的基本原則。
1.2 嵌入式系統
嵌入式系統開(kāi)發(fā)有其自身的特點(diǎn)。一般先進(jìn)行硬件部分的開(kāi)發(fā),主要包括形成裸機平臺,根據需要移植實(shí)時(shí)操作系統,開(kāi)發(fā)底層的硬件驅動(dòng)程序等。硬件平臺測試通過(guò)后,應該軟件的開(kāi)發(fā)調試是基于該硬件平臺進(jìn)行的,這同時(shí)也是對硬件平臺的一個(gè)測試。整個(gè)嵌入式系統開(kāi)發(fā)流程如圖2所示。因此可以說(shuō),嵌入式系統的開(kāi)發(fā)過(guò)程是一個(gè)軟硬件互相協(xié)調,互相反饋和互相測試的過(guò)程。一般來(lái)說(shuō),在嵌入式系統軟件中,底層驅動(dòng)程序、操作系統和應用程序的界線(xiàn)是不清晰的,根據需要甚至混編在一起。這主要是由于嵌入式系統中軟件對硬件的依賴(lài)性造成的。嵌入式軟件對硬件的依賴(lài)性要求,軟件測試時(shí)必須最大限度地模擬被測軟件的實(shí)際運行環(huán)境,以保證測試的可靠性。底層程序和應用程序界限的不清晰增加了測試時(shí)的難度,測試時(shí)只有確認嵌入式系統平臺及底層程序正確的情況下才能進(jìn)行應用程序的測試,而且在系統測試時(shí),錯誤的定位較為困難。軟件的專(zhuān)用性也是嵌入式軟件的一個(gè)重要特點(diǎn)。由于嵌入式軟件設計是以一定的目標硬件平臺為基礎的、面向固定的任務(wù)進(jìn)行的,因此,一旦被加載到目標系統上,功能必須完全確定。這個(gè)特點(diǎn)決定了嵌入式應用軟件的繼承性較差,延長(cháng)的系統的測試時(shí)間,增加了測試費用。嵌入式軟件的另外一個(gè)重要特點(diǎn)就是實(shí)時(shí)性。這是從軟件的執行角度出發(fā)說(shuō)明的,也就是說(shuō)嵌入式軟件的執行要滿(mǎn)足一定的時(shí)間約束。嵌入式系統中,應用軟件自身算法的復雜度和操作系統任務(wù)調度,決定了系統資源的分配和消耗,因此,對系統實(shí)時(shí)性進(jìn)行測試時(shí),要借助一定的測試工具對應用程序算法復雜度和操作系統任務(wù)調度進(jìn)行分析測試??梢?jiàn)嵌入式軟件與傳統的面向對象和面向過(guò)程的軟件相比有其自身的特點(diǎn)。針對這些特點(diǎn)對嵌入式軟件的測試進(jìn)行研究是必要的,有意義的。
1.3 嵌入式軟件測試
軟件測試是從經(jīng)濟、效率的角度出發(fā),對軟件代碼進(jìn)行質(zhì)量、正確性保證的一個(gè)過(guò)程。軟件測試是軟件開(kāi)發(fā)中的一個(gè)重要環(huán)節,也是軟件從開(kāi)發(fā)過(guò)程到應用過(guò)程的關(guān)鍵一環(huán)。嵌入式軟件也不例外,圖3給出了嵌入式軟件測試的統一測試模型。軟件測試逐漸成為一門(mén)成熟的學(xué)科,前人針對面向對象和面向過(guò)程的非實(shí)時(shí)軟件的測試作了大量的研究,其中大部分方法可以用到嵌入式軟件的測試。
根據不同的指標,軟件測試方法有不同的劃分方法。從軟件開(kāi)發(fā)過(guò)程中測試所處的不同階段可分為模塊測試、集成測試和系統測試。根據是否需要運行目標代碼分為動(dòng)態(tài)測試和靜態(tài)測試;根據目標代碼的可見(jiàn)性可分為白盒測試(結構測試)和黑盒測試(功能測試)。在軟件的測試中,每種測試方法都不是孤立的。為了最經(jīng)濟最有效地達到測試的目的,各種測試方法往往是互相嵌套的。例如,在軟件的單元測試階段,可以用黑盒測試和白盒測試的方法分別進(jìn)行動(dòng)態(tài)測試。
值得一提的是,近年來(lái)軟件測試中,測試代碼的覆蓋率逐漸成為軟件測試的統一標準,因此不管采用何種測試方法,盡可能地提高軟件測試中的代碼覆蓋率是必需的。軟件測試代碼覆蓋率是基于白盒測試方法的,因此,為了提高軟件測試的代碼覆蓋率,測試人員必須清楚源代碼的結構,擁有程序設計文檔,以便設計測試用例使測試盡可能地覆蓋程序內部結構的每條語(yǔ)句,提高代碼的覆蓋率。
2 基于模塊化設計的嵌入式軟件四級測試流程
根據嵌入式系統的開(kāi)發(fā)流程,為了最經(jīng)濟地實(shí)現系統的功能,采用自頂向下、層層推進(jìn)的方法對嵌入式系統進(jìn)行測試,提出了如圖4所示的基于模塊化設計的嵌入式軟件四級測試流程。在四級測試中,本測試階段以前的測試完成后,當發(fā)現錯誤時(shí),可排隊此測試階段以前的錯誤,在本測試階段內查找錯誤。這并不是一個(gè)絕對準確的方法,但最大限度地節了錯誤定位的時(shí)間。
2.1 系統平臺測試
這部分包括硬件電路測試、操作系統及底層驅動(dòng)程序的測試等。硬件電路的測試需要用專(zhuān)門(mén)的測試工具進(jìn)行測試。這里不再多述。操作系統和底層驅動(dòng)程序的測試主要包括測試操作系統的任務(wù)調度、實(shí)時(shí)性能、通信端口的數據傳輸率。該階段測試完成后,系統應為一個(gè)完整的嵌入式系統平臺,用戶(hù)只需添加應用程序即可完成特定的任務(wù)。
2.2 模塊測試
把大型的嵌入式軟件系統劃分為若干個(gè)相對較小的任務(wù)模塊,由不同的程序員分別同時(shí)對其進(jìn)行編碼。編碼完成后,把各個(gè)模塊集成起來(lái)前,必須對單個(gè)模塊進(jìn)行測試。由于沒(méi)有其它數據模塊進(jìn)行數據傳遞的支持,該階段測試一段是在宿主機上進(jìn)行的(宿主機有豐富的資源和方便的調試環(huán)境)。此階段主要是進(jìn)行白盒測試,盡可能地測試每一個(gè)函數、每一個(gè)條件分支、每一個(gè)程序語(yǔ)句,提高代碼測試的覆蓋率。由于只有單個(gè)模塊正確才有整體集成的必要性,因此,單個(gè)模塊測試時(shí)測試一定要充分、完整。模塊測試階段,測試用例的構造不但要測試系統正常的運行情況,還要進(jìn)行邊界測試。邊界測試就是進(jìn)行某一數據變量的最大值和最小值的測試,同時(shí)進(jìn)行越界測試,即輸入不該輸入的數據變量測試系統的運行情況。理想的嵌入式系統是不應該由用戶(hù)的信息交互導致死機的,這也是嵌入式設計的一個(gè)基本要求。因此,不論進(jìn)行何種測試,系統死機都該被作為測試錯誤處理。在模塊測試階段,由模塊化編程的基本思想,根據模塊內部的緊湊程序,也可以把大的模塊劃分成小的模塊。在程序內部,小模塊之間數據傳遞的入口設計接口函數,用于快速地定位錯誤。用此模塊嵌套的思想進(jìn)行軟件測試,需要模塊內部結構清晰,數據鏈路簡(jiǎn)單。
2.3 集成測試
單個(gè)軟件模塊測試正確之后,將所有模塊集成起來(lái)進(jìn)行測試。本階段主要是找出各模塊之間數據傳遞和系統組成后的邏輯結構的錯誤。在宿主機上采用黑盒與白盒相結合的方法進(jìn)行測試,要最大限度地模擬實(shí)際運行環(huán)境,可以屏蔽掉一些不影響系統執行的和數據傳遞的難以模擬的函數。集成測試是模塊化設計軟件的測試優(yōu)點(diǎn)充分體現的階段。集成測試前,應該由程序員根據模塊之間的數據的輸入輸出編寫(xiě)模塊接口函數,這需要負責不同軟件模塊的程序員共同協(xié)調完成,然后將模塊接口函數集成到接收數據模塊的入口處。由前面的分析可知,單鏈路數據傳遞的軟件模塊集成測試時(shí)容易定位錯誤所在的軟件模塊。一個(gè)軟件模塊的數據不一定只有另外一個(gè)模塊提供,即軟件模塊的數據鏈路不一定只是單鏈路的,測試時(shí)可以把復雜鏈路結構的數據傳遞劃分為單鏈路結構數據傳送進(jìn)行錯誤定位。修改輸出數據的軟件模塊時(shí),可能導致輸入數據的軟件模塊引入新的錯誤,因此在這里引入關(guān)聯(lián)矩陣確定修改某一模塊后需要重要測試的模塊。
假定模塊化設計的嵌入式系統軟件由軟件模塊Ai(i=1,2,…,m,n)組成,m表示矩陣的行號,n表示矩陣的列號。圖5所示的矩陣即為其關(guān)聯(lián)矩陣。
在關(guān)聯(lián)矩陣中,Aij=1表示Aj接受了Ai輸出的數據,故修改了Ai重新測試Ai的同時(shí)也需重新測試Aj。
集成測試是在擁有程序設計文檔、程序結構和數據結構時(shí),對軟件模塊在集成中出現的錯誤進(jìn)行測試。集成測試時(shí),根據模塊接口函數定位錯誤修改代碼,根據關(guān)聯(lián)矩陣確定重新測試的軟件模塊。圖6給出了模塊化設計的嵌入式軟件集成測試模型。
2.4 系統測試
集成測試完成后,退出宿主機測試環(huán)境,把系統移植到目標機上來(lái),完成應用到現場(chǎng)環(huán)境中,從用戶(hù)的角度對系統進(jìn)行黑盒測試,驗證每一項具體的功能。由于測試者對程序內容程序執行情況一無(wú)所知,因此本測試階段的錯誤定位比較困難。系統測試階段應該進(jìn)行意外測試和破壞性測試,即測試系統正常執行情況下不該發(fā)生的激發(fā)活動(dòng)和人為的破壞性的測試,進(jìn)一步驗證系統性能。系統測試階段不應該確定錯誤后立即修改代碼,應根據一定的錯誤發(fā)生頻率,確定測試周期,在每個(gè)測試周期結束時(shí)修改代碼,進(jìn)行反復測試;否則,不但增加了完全測試的任務(wù)量,而且降低了測試的可信度。
2.5 測試結果分析
測試結果的分析可以定位錯誤,指導程序員修改代碼,同時(shí)指出測試進(jìn)行的程序并進(jìn)一步指明測試方向。測試結果的分析是一個(gè)由測試結果和測試預得結果進(jìn)行分析、比較和定位錯誤的過(guò)程。測試結果的分析是一次測試的最后環(huán)節,分析時(shí)應該考慮軟件的運行環(huán)境和實(shí)際運行環(huán)境的差異以及各種外界因素的影響等。
2.6 測試用例的構造與管理
測試用例是為了測試目標程序設計的包括輸入項和預得結果的一種文件,根據測試環(huán)境和測試目標程序的不同,可分為某種格式的文檔或某種輸入行為(如一次按鍵)等。測試用例的構造要盡可能覆蓋所有可能的取值范圍,使測試盡可能地覆蓋所有程序代碼,提高代碼的測試覆蓋率,同時(shí)又不作多余、重復和無(wú)意義的測試。在嵌入式軟件測試的不同階段,要構造不同的測試用例;在系統平臺測試階段,要構造針對系統任務(wù)調度、實(shí)時(shí)性能和底層驅動(dòng)程序的測試用例;在模塊測試階段,應構造針對某一模塊進(jìn)行測試的測試用例;在集成測試階段,針對系統集成時(shí)數據傳遞、結構斜接的問(wèn)題構造相應的測試用例;在系統測試階段,要構造針對某項功能的或多項功能結合在一起的測試用例,或使用已經(jīng)在同類(lèi)產(chǎn)品上已經(jīng)驗證正確的測試用例。測試用例是可復用的。此外大型的軟件開(kāi)發(fā)過(guò)程中,測試用例的種類(lèi)繁多,應該按一定的方法進(jìn)行管理。用數據庫的來(lái)管理測試用例是一個(gè)很好的選擇。根據測試階段將測試用例進(jìn)行劃分,然后用關(guān)鍵字唯一確定。這樣在使用、修改和保存測試用例時(shí)都很方便,直接用查詢(xún)的方式就可以調出測試用例。
3 數控系統軟件測試
本數控系統采用ARM7處理器,操作系統采用μC/OS實(shí)時(shí)操作系統,是一個(gè)典型的嵌入式系統。由于數控系統較為復雜,開(kāi)發(fā)過(guò)程中將任務(wù)進(jìn)行了詳細的劃分,軟件的開(kāi)發(fā)采用模塊化開(kāi)發(fā)。模塊的劃分及數據流向如圖7所示。
開(kāi)發(fā)過(guò)程中,幾個(gè)模塊由不同的程序員分別進(jìn)行編碼,分別由程序員進(jìn)行模塊測試,并按白盒測試的方法進(jìn)行覆蓋測試。最后集成測試前,根據關(guān)聯(lián)矩陣,程序員協(xié)作編寫(xiě)了模塊接口函數F(A1-A2)、F(A1-A4)、F(A1-A5)、F(A1-A6)、F(F2-A3)、F(A3-A4)、F(A4-A5)、F(F5-A6)、F(A6-A2),然后根據圖6所示的測試模型和圖8所示的關(guān)聯(lián)矩陣對系統進(jìn)行了集成測試。分析可知,一些關(guān)鍵模塊,如譯碼模塊和刀補模塊的測試代碼覆蓋率達到90%之上。圖9所示的整個(gè)系統經(jīng)過(guò)系統測試之后性能穩定,圖10為其加工的零件,目前該系統已經(jīng)小批量生產(chǎn)。
4 結論
文章對嵌入式軟件的特點(diǎn)和傳統的測試方法作了分析之后,提出了四級測試流程和集成測試的模型。此測試方法用于工程機械控制器和數控系統開(kāi)發(fā)的測試。測試的效率和可靠性滿(mǎn)足要求。文中的單鏈路數據傳遞的錯誤定位、模塊接口函數、關(guān)聯(lián)矩陣等方法也可以用于面向對象的和面向對象的軟件系統。
評論