摘要: 針對嵌入式軟件動態測試時的覆蓋率分析問題,提出了一種嵌入式軟件動態測試系統框架。該框架基于嵌入式軟件測試的特點及路徑覆蓋的相關理論,包括被測試程序的靜態分析、插樁技術和數據處理分析等部分。以靜態分析指導插樁庫的建立,通過插樁技術在程序分支或重要位置點植入探針,執行已插樁程序,獲得動態測試跟蹤數據,最后對數據進行處理分析并制作初步測試報告。結合該框架,模擬測試實驗室現行項目208型海區終端的航標數據采集模塊,得出路徑覆蓋率,證明該系統框架的可行性。
關鍵詞: 嵌入式軟件; 軟件測試; 路徑覆蓋; 基本路徑測試; 覆蓋率分析
中圖分類號: TN919?34; TP311.5 文獻標識碼: A 文章編號: 1004?373X(2013)06?0063?03
0 引 言
目前,嵌入式軟件已廣泛的應用在各個領域:如工業控制、通信設備、信息家電以及航空航天等領域,應用越來越廣泛,復雜性也日益增加。但由于嵌入式軟件實時性強、I/O 通道少、內存資源受限、與硬件及硬件驅動緊密關聯、CPU 種類繁多等特點[1],決定了嵌入式軟件的開發和測試必須在交叉編譯環境下進行,即開發及測試工具運行在宿主機上,而被測程序運行在軟硬件資源緊張的目標機上。僅僅在開發環境下進行嵌入式軟件測試,難以保障其測試結果的有效性;而僅在目標機上進行測試,由于軟件運行的不可視性,又使得測試者難以知曉程序當前運行狀態,以及代碼的覆蓋情況[2]。因此對嵌入式軟件覆蓋測試技術的要求也更高。
軟件測試是一種有效地保證軟件質量的重要手段。常用的軟件測試方法有黑盒測試、白盒測試和灰盒測試。白盒測試中最成熟、最常用的方法是覆蓋測試,它是一種動態軟件測試方法[3]。覆蓋測試是驗證軟件功能結構正確性以及查找問題的一種重要方法和手段。為了獲取覆蓋率信息,必須在獲得被測程序結構 信息、靜態數據流信息、控制流信息等基礎上,加入一些探針,通過探針收集的信息來獲得程序的執行路徑、狀態等控制流[4]。
路徑覆蓋測試是覆蓋測試中的關鍵測試技術之一,目前已應用于程序覆蓋率分析、測試用例設計、程序調試、性能優化等多個方面,是覆蓋程度最高的測試。其基本原理是用最少的測試用例,覆蓋程序中的所有路徑,發現程序中最多的錯誤,安排測試計劃、分配測試資源,并對實際測試所達到的覆蓋率做出評估[5]。本文給出了路徑覆蓋相關理論,并在理論研究的基礎上設計出了一種嵌入式軟件動態測試系統框架,完成對被測程序的路徑覆蓋率分析,進而判斷測試的充分性及弱點,從而進一步改進測試過程。
1 路徑覆蓋相關理論
路徑覆蓋使程序中每一條可能的路徑至少執行一次。但在實際工作中,即使一個不太復雜的程序,路徑數量往往也是較多的。要在測試中覆蓋所有的路徑是不現實的,而基本路徑測試就是一種簡化路徑數的測試方法。
基本路徑測試是在控制流圖的基礎上,通過分析控制結構的環形復雜度,導出執行路徑的基本集,再從該基本集設計測試用例。為了清晰描述基本路徑測試方法,需要對本文中用到的幾個基本概念進行說明。
(2)Z路徑優化:是指限制循環的次數,無論循環的形式和循環體實際執行的次數,簡化后的循環測試只考慮執行循環體一次和零次(不執行)兩種情況。
(3)環形復雜度:提供程序基本路徑集的獨立路徑數量以及確保所有語句至少執行一次的測試數量的上界。可以通過下列兩種方法來計算:對流圖G,環形復雜度V(G)=E-N+2;或V(G)=P+1,其中P為包含在流圖G中的判定節點數[6]。
(4)基本路徑集BP:指軟件可達路徑的最小集合,等于環形復雜度V(G)。
(5)路徑覆蓋率計算:由基本路徑集BP設計測試用例集T,使T理論上按BP執行。然后分析動態跟蹤數據,構造實測路徑集Pn。計算測試覆蓋率PCP=×100%其中Pn=P(T1)P(T2)…P(Tn)。
2 嵌入式軟件動態測試框架
嵌入式軟件動態測試框架如圖1所示。它包含宿主機程序插樁及數據處理分析和目標機數據處理兩部分。
在嵌入式軟件測試中,靜態測試是基礎,對被測軟件進行代碼規則檢查、靜態結構分析和代碼質量評估;動態測試是必要補充,在目標機真實環境下或仿真環境下運行被測程序,采集動態跟蹤數據,分析其動態行為[7]。
嵌入式軟件路徑覆蓋測試的特點就是必須在交叉編譯環境下, 通過物理通道傳輸完整的動態測試跟蹤數據[8],分析數據后得到路徑覆蓋率。動態執行前先要檢查目標機與宿主機的連接狀況,確保測試正常進行。
2.1 被測試程序靜態分析
靜態分析并不真正執行被測程序,也不需要對代碼進行編譯鏈接,生成可執行文件。首先,對源碼進行詞法語法分析和變量分析, 找出不符合編碼規范的地方,根據某種質量模型評價代碼的質量,生成模塊調用關系圖、模塊的程序流程圖等。其次,從程序中提取必要的數據并保存,提供給后續的動態分析和測試報告使用。最后,根據模塊的程序流程圖繪制程序控制流圖G,得到程序控制流圖的邊數E和節點數N,指導插樁庫的建立,并根據Z路徑優化法構造程序的基本路徑集BP,構建動態路徑覆蓋測試的比較基礎。
2.2 插樁技術
一般來說,對程序進行動態測試的時候,基本上要使用程序插樁來進行覆蓋測試。程序插樁技術是保持被測軟件邏輯完整性的基礎上,在源代碼中插入探針函數,它是一個子過程調用,調用的子過程能在運行到插樁點時記錄下有關的運行情況,采集執行程序在真實環境中運行的控制流、數據流等測試數據[9]。插樁時需確保探針函數對源程序執行影響最小。
基本路徑測試依賴探針插樁技術完成分支位置點標志位的采集。插樁位置最好選擇在應用程序層,重點采集輸入輸出模塊中的上層函數運行信息,底層模塊加強單元測試,而在嵌入式軟件模塊集成時,默認這些模塊是正確無誤的。根據程序按塊劃分的原則,可以在子函數出入點、程序塊控制流圖G的分支節點、功能測試的重點變量處植入探針。
基本路徑測試的插樁過程是靜態的,數據收集過程是動態的,結束時需恢復現場。動態測試前,被測程序與插樁庫連接,完成插樁操作,獲取執行程序。執行程序交叉編譯后運行于目標實際環境或者仿真環境下,通過探針函數返回動態測試跟蹤數據[10]。
2.3 數據處理及分析
目標機在真實環境中運行可執行程序, 測試用例集T為運行輸入參量, 探針采集數據為運行的輸出參量。探針函數采集動態跟蹤測試數據,傳輸給宿主機測試平臺。宿主機測試平臺對接收到的動態跟蹤數據進行處理,計算出路徑測試覆蓋率,并結合數據處理過程中的測試日志分析出最后的測試報告。
3 測試實例分析
該航標數據采集模塊由C語言開發, 根據插樁策略可以計算出插樁探針的位置、個數, 構造基本路徑和實際程序執行路徑, 計算路徑測試覆蓋率。部分測試結果分析如表1所示。
基本路徑測試覆蓋率大小涉及到測試的各個階段,受到各方面因素的影響。比如,在該測試模塊中,Rx_Data_Svr()和AddataConvert()程序中出現了多個判斷語句和多個循環語句,可能的路徑數目增長,以致影響路徑覆蓋率。
4 結 語
本文通過研究嵌入式軟件測試的特點和路徑覆蓋測試的相關理論,給出了嵌入式軟件動態測試框架方案。并結合實驗室目前的項目,分析基本路徑測試的各個步驟,得出路徑測試覆蓋率,進而達到測試目的。但是路徑覆蓋測試受多方面因素的影響,尤其是當程序中出現多個復合條件時,會大大的增加可能的路徑數目,所以接下來的工作是進一步探討插樁策略、測試用例生成等影響路徑覆蓋率的相關問題。
參考文獻
[1] 范海霞.嵌入式軟件覆蓋測試的插樁技術研究[D].南京:南京航空航天大學,2010.
[2] 楊俊,張倩,林依剛.一種嵌入式軟件覆蓋測試方法[J].指揮信息系統與技術,2010,12(6):24?26.
[3] 李志偉.程序插裝在軟件測試中的應用研究[J].測控技術,2011,30(10):88?91.
[4] 張榮,王曙燕.基于插樁技術的動態測試研究與實現[J].現代電子技術,2011,34(4):50?52.
[5] 張志華,牟永敏.基于函數調用的路徑覆蓋生成技術研究[J].電子學報,2010,38(8):1808?1811.
[6] PRESSMAN R S.軟件工程[M].北京:機械工業出版社,2007.
[7] 于全喜,張毅坤,胡燕京,等.嵌入式軟件路徑覆蓋測試數據采集[J].計算機工程,2009,35(21):54?59.
[8] 施冬梅.嵌入式軟件路徑覆蓋測試的研究[J].計算機測量與控制,2010,18(10):2236?2240.
[9] 唐銥笛,張義德,劉利枚.嵌入式軟件測試系統的設計與實現[J].福建電腦,2009(7):133?134.
[10] 施冬梅.基本路徑覆蓋測試探針插樁技術的研究[J].計算機工程與設計,2010,31(13):3025?3028.