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