基于路徑覆蓋的嵌入式軟件動態(tài)測試研究
摘要:針對嵌入式軟件動態(tài)測試時的覆蓋率分析問題,提出了一種嵌入式軟件動態(tài)測試系統(tǒng)框架。該框架基于嵌入式軟件測試的特點及路徑覆蓋的相關理論,包括被測試程序的靜態(tài)分析、插樁技術和數(shù)據(jù)處理分析等部分。以靜態(tài)分析指導插樁庫的建立,通過插樁技術在程序分支或重要位置點植入探針,執(zhí)行已插樁程序,獲得動態(tài)測試跟蹤數(shù)據(jù),最后對數(shù)據(jù)進行處理分析并制作初步測試報告。結合該框架,模擬測試實驗室現(xiàn)行項目208型海區(qū)終端的航標數(shù)據(jù)采集模塊,得出路徑覆蓋率,證明該系統(tǒng)框架的可行性。
關鍵詞:嵌入式軟件;軟件測試;路徑覆蓋;基本路徑測試;覆蓋率分析
0 引言
目前,嵌入式軟件已廣泛的應用在各個領域:如工業(yè)控制、通信設備、信息家電以及航空航天等領域,應用越來越廣泛,復雜性也日益增加。但由于嵌入式軟件實時性強、I/O通道少、內(nèi)存資源受限、與硬件及硬件驅動緊密關聯(lián)、CPU種類繁多等特點,決定了嵌入式軟件的開發(fā)和測試必須在交叉編譯環(huán)境下進行,即開發(fā)及測試工具運行在宿主機上,而被測程序運行在軟硬件資源緊張的目標機上。僅僅在開發(fā)環(huán)境下進行嵌入式軟件測試,難以保障其測試結果的有效性;而僅在目標機上進行測試,由于軟件運行的不可視性,又使得測試者難以知曉程序當前運行狀態(tài),以及代碼的覆蓋情況。因此對嵌入式軟件覆蓋測試技術的要求也更高。
軟件測試是一種有效地保證軟件質量的重要手段。常用的軟件測試方法有黑盒測試、白盒測試和灰盒測試。白盒測試中最成熟、最常用的方法是覆蓋測試,它是一種動態(tài)軟件測試方法。覆蓋測試是驗證軟件功能結構正確性以及查找問題的一種重要方法和手段。為了獲取覆蓋率信息,必須在獲得被測程序結構信息、靜態(tài)數(shù)據(jù)流信息、控制流信息等基礎上,加入一些探針,通過探針收集的信息來獲得程序的執(zhí)行路徑、狀態(tài)等控制流。
路徑覆蓋測試是覆蓋測試中的關鍵測試技術之一,目前已應用于程序覆蓋率分析、測試用例設計、程序調(diào)試、性能優(yōu)化等多個方面,是覆蓋程度最高的測試。其基本原理是用最少的測試用例,覆蓋程序中的所有路徑,發(fā)現(xiàn)程序中最多的錯誤,安排測試計劃、分配測試資源,并對實際測試所達到的覆蓋率做出評估。本文給出了路徑覆蓋相關理論,并在理論研究的基礎上設計出了一種嵌入式軟件動態(tài)測試系統(tǒng)框架,完成對被測程序的路徑覆蓋率分析,進而判斷測試的充分性及弱點,從而進一步改進測試過程。
1 路徑覆蓋相關理論
路徑覆蓋使程序中每一條可能的路徑至少執(zhí)行一次。但在實際工作中,即使一個不太復雜的程序,路徑數(shù)量往往也是較多的。要在測試中覆蓋所有的路徑是不現(xiàn)實的,而基本路徑測試就是一種簡化路徑數(shù)的測試方法。
基本路徑測試是在控制流圖的基礎上,通過分析控制結構的環(huán)形復雜度,導出執(zhí)行路徑的基本集,再從該基本集設計測試用例。為了清晰描述基本路徑測試方法,需要對本文中用到的幾個基本概念進行說明。
(1)程序控制流圖:是對程序流程圖簡化后得到的,它是一種有向圖G=(N,E,Entry,Exit),其中N是流圖的節(jié)點數(shù),E是流圖的邊數(shù)。
(2)Z路徑優(yōu)化:是指限制循環(huán)的次數(shù),無論循環(huán)的形式和循環(huán)體實際執(zhí)行的次數(shù),簡化后的循環(huán)測試只考慮執(zhí)行循環(huán)體一次和零次(不執(zhí)行)兩種情況。
(3)環(huán)形復雜度:提供程序基本路徑集的獨立路徑數(shù)量以及確保所有語句至少執(zhí)行一次的測試數(shù)量的上界??梢酝ㄟ^下列兩種方法來計算:對流圖G,環(huán)形復雜度V(G)=E-N+2;或V(G)=P+1,其中P為包含在流圖G中的判定節(jié)點數(shù)。
(4)基本路徑集BP:指軟件可達路徑的最小集合,等于環(huán)形復雜度V(G)。
(5)路徑覆蓋率計算:由基本路徑集BP設計測試用例集T,使T理論上按BP執(zhí)行。然后分析動態(tài)跟蹤數(shù)據(jù),構造實測路徑集Pn。計算測試覆蓋率PCP=(Pn/BP)×100%其中Pn=P(T1)P(T2)…P(Tn)。
2 嵌入式軟件動態(tài)測試框架
嵌入式軟件動態(tài)測試框架如圖1所示。它包含宿主機程序插樁及數(shù)據(jù)處理分析和目標機數(shù)據(jù)處理兩部分。
在嵌入式軟件測試中,靜態(tài)測試是基礎,對被測軟件進行代碼規(guī)則檢查、靜態(tài)結構分析和代碼質量評估;動態(tài)測試是必要補充,在目標機真實環(huán)境下或仿真環(huán)境下運行被測程序,采集動態(tài)跟蹤數(shù)據(jù),分析其動態(tài)行為。
嵌入式軟件路徑覆蓋測試的特點就是必須在交叉編譯環(huán)境下,通過物理通道傳輸完整的動態(tài)測試跟蹤數(shù)據(jù),分析數(shù)據(jù)后得到路徑覆蓋率。動態(tài)執(zhí)行前先要檢查目標機與宿主機的連接狀況,確保測試正常進行。
2.1 被測試程序靜態(tài)分析
靜態(tài)分析并不真正執(zhí)行被測程序,也不需要對代碼進行編譯鏈接,生成可執(zhí)行文件。首先,對源碼進行詞法語法分析和變量分析,找出不符合編碼規(guī)范的地方,根據(jù)某種質量模型評價代碼的質量,生成模塊調(diào)用關系圖、模塊的程序流程圖等。其次,從程序中提取必要的數(shù)據(jù)并保存,提供給后續(xù)的動態(tài)分析和測試報告使用。最后,根據(jù)模塊的程序流程圖繪制程序控制流圖G,得到程序控制流圖的邊數(shù)E和節(jié)點數(shù)N,指導插樁庫的建立,并根據(jù)Z路徑優(yōu)化法構造程序的基本路徑集BP,構建動態(tài)路徑覆蓋測試的比較基礎。
2.2 插樁技術
一般來說,對程序進行動態(tài)測試的時候,基本上要使用程序插樁來進行覆蓋測試。程序插樁技術是保持被測軟件邏輯完整性的基礎上,在源代碼中插入探針函數(shù),它是一個子過程調(diào)用,調(diào)用的子過程能在運行到插樁點時記錄下有關的運行情況,采集執(zhí)行程序在真實環(huán)境中運行的控制流、數(shù)據(jù)流等測試數(shù)據(jù)。插樁時需確保探針函數(shù)對源程序執(zhí)行影響最小。
基本路徑測試依賴探針插樁技術完成分支位置點標志位的采集。插樁位置最好選擇在應用程序層,重點采集輸入輸出模塊中的上層函數(shù)運行信息,底層模塊加強單元測試,而在嵌入式軟件模塊集成時,默認這些模塊是正確無誤的。根據(jù)程序按塊劃分的原則,可以在子函數(shù)出入點、程序塊控制流圖G的分支節(jié)點、功能測試的重點變量處植入探針。
基本路徑測試的插樁過程是靜態(tài)的,數(shù)據(jù)收集過程是動態(tài)的,結束時需恢復現(xiàn)場。動態(tài)測試前,被測程序與插樁庫連接,完成插樁操作,獲取執(zhí)行程序。執(zhí)行程序交叉編譯后運行于目標實際環(huán)境或者仿真環(huán)境下,通過探針函數(shù)返回動態(tài)測試跟蹤數(shù)據(jù)。
評論