(中國西南電子技術研究所,成都 610036)
隨著信息技術的飛速發展和用戶要求的不斷提高,嵌入式軟件向綜合模塊化發展[1],規模日益擴大、復雜程度越來越高,軟件的質量對整個產品的質量起到了決定性的作用。軟件測試是保障軟件質量的重要手段。目前嵌入式軟件的配置項測試和系統測試以手工測試為主,手工測試具有創造性,能舉一反三地對系統邏輯、功能進行驗證,但對于復雜嵌入式軟件,系統交聯復雜、接口數據眾多,采用手工測試存在以下問題:一是影響測試的準確性,二是測試效率低[2]。同時,對于一些特殊的性能測試、壓力測試和強度測試等,采用手工測試,則很難或根本無法實施。隨著軟件開發周期的日益縮短以及軟件系統的日趨復雜,引入自動化測試,可以縮短軟件開發周期,降低成本,同時高質量地完成測試任務,提高軟件質量。
目前嵌入式軟件自動化測試的研究主要有基于GUI的自動化測試[3-4],測試模式分為錄制回放、數據驅動和關鍵字驅動[5];基于模型驅動的自動化測試[6];針對特定業務的自動化框架設計[2,7],以及基于分布式仿真測試環境的嵌入式軟件自動化測試[8]等。本文在此基礎上提出一種面向復雜嵌入式軟件的自動化測試方法,融入軟件工程化管理過程,將自動化測試與測試管理過程相結合,打造一個無縫連接的系統,提高測試效率和質量。
自動化測試就是將繁瑣的、重復的手工操作利用策略、工具等實現自動化的測試活動[9]。自動化測試不是完美無缺的,它需要和手工測試互相配合、優勢互補,才能發揮出各自的優勢。手工測試是整個測試的核心和基礎,自動化測試無法完全替代手工測試,但能夠間接輔助手工測試提高測試效率,保證測試質量。
針對復雜嵌入式系統,被測軟件有著復雜的交聯環境,存在多個配測對象,配測對象可能是模擬器,也可能是真實的設備,且包含不同類型的交聯接口等。為適應這樣的現狀,面向復雜嵌入式軟件的自動化測試及管理系統的基本設計思想可以歸納為如下幾條。
1)資源共享:開發與測試人員共享接口數據:開發人員設計、修改ICD后,測試人員能第一時間獲得最新信息;開發和測試人員在同一個平臺進行軟件缺陷生命周期管理:測試人員提交軟件缺陷后,開發人員能馬上得到缺陷信息,缺陷修復后,缺陷的狀態變化和修改方法也能第一時間告知測試人員;
2)手工測試與自動化測試互相配合:測試策劃和測試設計以手工設計為主,自動生成測試數據為輔,充分發揮人的主觀能動性和創造性;
3)測試設計與測試執行不分離:測試設計的數據,通過測試腳本驅動,發送給被測軟件,作為測試執行的輸入激勵,測試設計與執行不再分離,測試結果自動記錄,提高測試的效率和結果的可信性;
4)支持分布式測試:系統支持分布式的測試驅動和數據監控;
5)測試文檔自動生成:測試策劃、測試設計的用例/數據,以及系統自動記錄的測試結果,通過導入不同的模板,自動生成符合要求的測試文檔;
6)建立知識庫:積累可復用的測試用例和典型缺陷等知識,提升組織的測試水平。
本文運用軟件工程化的思想將接口設計、測試策劃、測試設計、測試執行、測試結果、缺陷管理和回歸測試集成到一個系統進行管理[10],自動化測試及管理流程如圖1所示。

圖1 自動化測試及管理流程
開發人員使用接口設計模塊進行ICD設計,基于模塊化和復用方面的考慮,接口設計的元素分為數據元、數據塊、數據組、邏輯塊和接口消息模塊幾部分,數據元為最小的數據單元,數據塊由多個數據元組成,代表一個有意義的字段,數據組由多個數據塊或數據元組成,代表一個更大的含義。一條接口消息模塊就是一條完整的ICD,由多個數據組、數據塊或數據元組成;邏輯塊用來進行特殊邏輯設計,限定不同元素之間的特殊關系,如變長設計、有效性設計等;根據項目不同,數據元和數據塊之間的級數可以配置,以方便開發人員根據項目情況進行擴展設計。每條ICD都要包括數據的源ID和目的ID,以及適用的接口類型。設計好的ICD存儲在數據庫里,后臺生成標準的XML格式文件,以供測試數據自動生成、測試數據解析和接口文檔自動生成使用。
測試人員根據開發設計的ICD、軟件研制任務書、軟件需求規格說明書、用戶手冊等相關資料,進行測試策劃。測試策劃包括建立測試交聯環境圖,制定測試類型,設計測試項或測試子項,測試用例名稱以及測試用例描述。
在自動化測試系統中,測試人員的主要工作集中在測試策劃和測試設計上。在測試策劃中,首先建立測試交聯環境圖,設置被測軟件模塊之間的接口類型,并為每一個軟件模塊設置一個與ICD對應的ID號。建立環境圖后,測試人員根據需求規格說明等被測軟件的依據文檔,進行功能分解和測試分析,提取測試需求,設計測試項和測試子項。測試類型包括功能測試、性能測試、接口測試、強度測試等,測試類型下面是測試項,測試項下面是測試子項,一個測試子項包含多個測試用例,測試項和測試子項之間的級數是可配置的。測試用例在測試策劃時要填寫測試用例名稱和測試意圖,即測試用例描述。測試子項的測試描述就是其下多個測試用例的描述合在一起,每個測試用例描述的就是一個測試點。自動化測試系統支持根據不同格式的模板生成測試計劃中測試需求分析的內容。
測試人員對測試用例開展具體的測試輸入輸出設計。對于嵌入式軟件,大部分的測試輸入和輸出都是一系列的數據。因此測試設計的主要內容就是給每個用例設計不同的輸入輸出數據。在用例設計之前,需設置用例的屬性,用例屬性包括獨立用例和關聯用例。新建的測試用例默認為獨立用例,如果設計的測試用例是進行場景或業務流測試,則需將其屬性設置為關聯用例。
測試設計分為三步,第一步為測試數據自動生成,自動化測試系統根據ICD中的數據元素,如枚舉值、范圍值、分段枚舉等,結合特殊的邏輯關系自動生成測試數據,測試數據生成策略包括等價類劃分法、邊界值分析法、正交法等,生成的測試數據包括枚舉值的所有值,范圍值的上下邊界值、中間值和邊界外的異常值,以及所有的特殊關系,對于沒有特殊關系的多個數據元素使用正交法生成測試數據。
第二步為獨立測試用例設計,測試人員將本用例涉及到的ICD拖入到測試設計界面,界面根據ICD的源和目的ID,建立本用例的交聯運行圖,雙擊圖上的連線即可設計測試數據,也可以選取自動化測試系統自動生成的測試數據,同時可以設置每條測試數據的屬性和延時,數據屬性包括事件觸發、周期觸發、消息觸發、數據監聽等,數據屬性可以添加和配置。自動生成的測試數據主要針對枚舉值、邊界范圍值等,其他經驗值或故障注入的數據需要測試人員單獨進行設計。
第三步為關聯測試用例設計,測試人員可以使用場景分析法,基于場景或業務流,將不同的測試用例通過流程圖的方式聯系在一起,設計場景或業務流測試用例,也可以對不同的狀態轉換進行測試。獨立測試用例主要針對單個功能點進行測試,關聯測試用例將不同功能點的用例連在一起,可以模仿用戶在實際使用過程中的場景,進行場景或業務流的測試。在關聯測試用例設計界面上,可以看到所有的獨立測試用例,測試人員設計好流程框圖后,將需要的獨立測試用例拖入到對應的框圖中即可。測試用例設計示意圖如圖2所示。

圖2 測試用例設計示意圖
在界面設計好測試數據及屬性后,自動化測試系統自動生成測試腳本和測試步驟,步驟的描述圍繞數據的發送、接收展開,以數據為中心,格式統一。自動化測試系統支持根據不同格式的模板生成測試說明文檔,其中測試用例的描述在測試策劃時由測試人員設計,測試步驟由自動化測試系統自動生成。
測試執行平臺由測試交聯環境圖、測試用例、總線路由共同組成。測試執行分為三步,第一步為數據分發,測試人員設置執行某個測試用例后,由總線路由的總控端根據設計的交聯環境圖和測試用例,得到涉及的模塊和接口總線類型,初始化相關的代理端,同時將輸入的激勵/測試數據分發給對應的代理端;第二步為代理端驅動接口通信模塊,代理端根據交聯環境圖,將從總控端收到的輸入測試數據發給數據接口驅動模塊,由接口驅動模塊將輸入測試數據發送給被測軟件;第三步為代理端監控被測軟件的響應,并將響應的報文,即輸出的測試數據回傳給總控端。一個總控端可以控制多個代理端,代理端的個數與交聯環境圖中交互的模塊數有關,一個代理端監控一個點對點的數據傳輸。測試執行示意圖如圖3所示。

圖3 測試執行示意圖
測試用例的執行支持單個測試用例的執行和多個測試用例的順序執行。測試人員勾選要執行的測試用例或測試用例集,啟動測試執行,系統調用腳本自動完成測試執行。
總控端收到代理端傳回的數據后,進行顯示,并根據ICD進行自動解析,界面顯示所有的交互數據,雙擊選中的數據后,可以看到數據的解析,直觀地讓測試人員了解測試的執行情況,同時支持對顯示的數據進行過濾,以便于觀察。
系統收到代理端傳回的數據后,與測試用例中預期的測試結果報文進行比較,如果相同則顯示用例步驟通過Pass,如果不相同則顯示該步驟失敗Fail。任意步驟Fail則判該用例Fail。所有的測試結果自動記錄到數據庫里,系統支持根據不同格式的模板生成測試記錄。
測試人員要對測試結果進行確認,特別是批量執行的測試用例,需對每個Fail的測試用例的每個Fail的步驟進行確認,以便排除非被測軟件的故障。確認是被測軟件缺陷的,在對應的測試用例后提交缺陷記錄單。提交缺陷記錄單后,軟件項目經理查看到缺陷信息,對缺陷進行確認和分配,對應的開發人員可以參考缺陷追蹤的測試用例進行問題復現,并修改缺陷,修改后的缺陷狀態標識為已修復,測試人員對已修復的缺陷進行回歸驗證。
在回歸測試中,如果ICD沒有變更,回歸時可以復用前期設計的測試用例,并自動進行回歸測試執行;如果ICD的數據元素發生了變化,自動化測試系統自動標識出受影響的測試用例,提示測試人員對用例進行修改后再執行回歸測試。測試用例在不同測試階段所做的修改,自動化測試系統會將其標識為不同的版本存入數據庫,以追溯數據修改過程和版本管理。回歸測試通過后關閉已修復的缺陷。對于回歸中仍未修改到位的缺陷,rebound給開發,開發再次進行修改,之后測試人員再次進行回歸。整個項目回歸完成后,缺陷的狀態有三類:已修復、撤回和遺留。自動化測試系統支持根據不同格式的模板導出缺陷記錄單。
測試結束后對測試過程進行總結,對測試用例數、測試通過率、缺陷率等數據進行統計、輸出規定格式的報表;同時將設計精巧的、可復用的測試用例納入典型測試用例庫,將發現的有價值的缺陷納入典型缺陷庫,形成知識庫,如此沉淀、積累測試經驗,以便于后期在做類似項目的測試時,進行借鑒,以持續提高。
面向復雜嵌入式軟件的自動化測試及管理系統是一個面向信息和數據驅動的測試系統,測試系統采用分層架構,包括測試管理層、消息服務層、總線路由層和驅動層,具體如圖4所示。

圖4 自動化測試系統架構圖
測試管理層包括軟件接口管理模塊、總線參數配置模塊、測試環境管理模塊、測試管理模塊、腳本管理模塊、數據工廠模塊;消息服務層包括腳本執行模塊、日志模塊、消息隊列服務模塊;總線路由層包括一個總控端和多個代理端;驅動層包括測試涉及到的不同類型的接口驅動。
軟件接口管理模塊對接口設計進行管理;總線參數配置模塊對涉及到的不同類型的總線配置參數進行管理;測試管理模塊對測試策劃、測試用例設計、測試執行、測試結果顯示、缺陷管理流程進行管理;測試環境管理模塊對測試環境、測試執行策略、測試輪次等進行管理;腳本管理模塊對測試用例腳本、測試調度腳本、測試驅動腳本和公共函數進行管理;數據工廠模塊對數據庫進行管理,存儲的數據包括:測試用例/測試數據、測試執行結果、測試缺陷、測試分析的數據、知識庫等。
測試管理層為BS結構,包括服務器和客戶端,客戶端分布在不同的電腦上,與服務器通過以太網連接,支持多人同時開展接口設計、測試用例設計等。
系統界面和框架采用QT語言實現,自動化測試腳本使用Python語言。部分模塊采用開源系統,如缺陷管理模塊集成BugFree等。
設計的自動化測試及管理系統在某型機載綜合處理設備控制軟件測試中進行應用,圖5為接口設計、交聯環境、測試策劃、測試設計和測試執行的綜合圖例。

圖5 某型機載綜合處理設備控制軟件測試圖例
使用自動化測試及管理系統開展軟件測試,開發人員設計好接口后,測試人員設計交聯環境圖,搭建測試環境,部分測試模擬器不需要再額外開發;開展測試設計時,可以在系統中直接調用部分自動生成的測試數據,也可以在此基礎上手動修改成需要的測試數據,測試人員的主要精力集中在測試策劃和測試設計上,設計好測試用例的測試數據及屬性后,系統自動生成測試腳本和測試步驟;測試執行時支持批量測試用例的執行,可以實現人休息而設備不休息,白天進行測試設計晚上自動執行測試等;測試結果由系統自動記錄,高效、準確,并且可以自動進行測試結果數據統計等。
實踐證明,使用自動化測試及管理系統開展嵌入式軟件測試可以有效提高測試效率,具體如表1所示。測試執行和回歸測試效率提高了80%,整體項目測試效率提高了65%。

表1 自動化測試前后效率對比(單位:人日)
本文運用軟件工程化的思想,將接口設計、測試策劃、測試設計、測試執行、測試結果、缺陷管理和回歸測試集成到一個系統進行管理,測試人員的主要工作集中在測試策劃和測試設計上,測試用例設計好后,系統自動生成測試腳本,支持批量測試用例的自動執行,自動收集、監控測試過程數據,自動記錄測試結果,并根據模板自動生成相應的測試文檔,實現了一個具備過程管理、信息發布、缺陷跟蹤、知識積累等功能的高效一體化測試,測試過程設計更加簡便快捷,提高了軟件測試的效率和質量。