中國電子科技集團(tuán)公司第三十二研究所 蘇青琴 李鳳雯 周蘭英
針對目前箭載嵌入式軟件集成測試工具測試用例編寫時間長、人力成本高、測試用例報告適用性低等方面的問題,提出一種基于SmartRocket 的箭載嵌入式軟件集成測試方法。SmartRocket 采用廣度優(yōu)先自頂向下集成測試方法確定集成測試組合,基于動態(tài)符號執(zhí)行技術(shù)自動生成集成測試用例,在滿足函數(shù)覆蓋和調(diào)用覆蓋指標(biāo)下生成與實際要求相符的測試用例報告。通過實驗發(fā)現(xiàn),該集成測試方法能夠很好地實現(xiàn)集成測試用例自動化,提高了測試用例報告適用性,一定程度地增加了箭載嵌入式軟件集成測試人員的測試效率。
隨著嵌入式軟件在各個領(lǐng)域的廣泛應(yīng)用,對嵌入式軟件的各項要求也越來越高,特別是作為航天產(chǎn)業(yè)的箭載嵌入式軟件的測試工作變得尤為重要。集成測試作為一種重要的箭載嵌入式軟件測試方法,能在早期發(fā)現(xiàn)與軟件設(shè)計相關(guān)的模塊調(diào)用關(guān)系以及模塊間接口方面的問題。目前主要使用的箭載嵌入式軟件集成測試工具為Testbed[1]和VeterCast。Testbded 無法自動生成集成測試用例,增加了測試時間和人力成本;VeterCast 雖然可以自動生成測試用例,但生成的測試用例報告需要編寫腳本轉(zhuǎn)化成實際使用的測試用例報告,導(dǎo)致適用性不高。為了改進(jìn)Testbed 和VeterCast 這兩種集成測試工具的不足,結(jié)合具體箭載嵌入式軟件實踐,形成了基于SmartRocket 的箭載嵌入式軟件集成測試方法。
SmartRocket 是一種基于動態(tài)符號執(zhí)行技術(shù)的集成測試工具。SmartRocket 工具能自動生成集成測試用例,并采用函數(shù)覆蓋、調(diào)用覆蓋作為集成測試指標(biāo),自動生成符合實際需要的測試用例報告。
動態(tài)符號執(zhí)行技術(shù)[2]是實際執(zhí)行和符號執(zhí)行同時執(zhí)行的技術(shù)。對于與符號無關(guān)的操作或變量等程序會實際執(zhí)行,對于與符號相關(guān)的操作或變量等程序會符號執(zhí)行。符號執(zhí)行將程序中的每一個輸入變量作為符號處理,將不同的路徑約束條件用輸入的符號來執(zhí)行,符號執(zhí)行會模擬程序執(zhí)行并收集所有路徑上的約束信息[3]。最終,約束求解器會根據(jù)每條路徑上的符號組合信息求得每條路徑的輸入。
如圖1 所示是一個程序代碼轉(zhuǎn)化成符號執(zhí)行控制流程圖的示例。程序的輸入是一個整型變量i和一個整型變量j,若i+j>0,則將返回i;否則,返回-i。
圖1 程序代碼轉(zhuǎn)化符號執(zhí)行流程圖Fig.1 Program code conversion symbol execution flowchart
如圖2 所示是符號執(zhí)行的路徑圖。首先隨機(jī)輸入i為1,j為2,依據(jù)該隨機(jī)輸入值可以到達(dá)一條路徑終點4;接著對約束條件取反得到新的輸入i為1,j為-2,依據(jù)該新的輸入可以到達(dá)另一條路徑終點6,從而覆蓋了所有的路徑。
圖2 符號執(zhí)行路徑圖Fig.2 Symbol execution path diagram
SmartRocket 能夠自動生成集成測試用例。以C 語言為例說明SmartRocket 自動生成集成測試用例的過程。SmartRocket 將接收到的.c 和.h 源文件轉(zhuǎn)化成可識別格式,使用C 語言編譯器對源文件進(jìn)行預(yù)處理和編譯,得到抽象語法樹。在抽象語法樹的基礎(chǔ)上構(gòu)造出含有程序結(jié)構(gòu)和信息的控制流程圖。以控制流圖的初始節(jié)點為起始點,采用搜索算法[4]尋找下一個節(jié)點,只有當(dāng)識別出分支條件時才會執(zhí)行該分支。在遍歷整個控制流程圖過程中,將所有約束條件收集起來添加到一個路徑,當(dāng)搜索到終點時求解該路徑,并轉(zhuǎn)換成能夠識別的集成測試用例。
集成測試依據(jù)軟件概要設(shè)計并遵循特定的策略和步驟,將已經(jīng)通過單元測試的各個軟件單元(或模塊)逐步組合在一起進(jìn)行測試,以期通過測試發(fā)現(xiàn)各軟件單元接口之間存在的問題。
集成測試方法包括漸增式和非漸增式兩大類,其中漸增式測試又可分為自頂向下、自底向上和三明治集成三種方法[5],而自頂向下的漸增式測試方法又可以分為深度優(yōu)先自頂向下測試法和廣度優(yōu)先自頂向下測試法。
SmartRocket 工具采用廣度優(yōu)先自頂向下集成測試法。
廣度優(yōu)先自頂向下的集成測試分為以下三個步驟:
(1)用主控制模塊(如圖3 中D1 所示)做測試驅(qū)動模塊,用樁模塊代替所有間接被主控模塊調(diào)用的模塊。
圖3 廣度優(yōu)先自頂向下集成測試Fig.3 Breadth first top down integration testing
(2)根據(jù)廣度優(yōu)先法(如圖3 中從D1 出發(fā),先集成M1、M2 及M3,接著是S1、S2 這一層,以此類推)和新模塊的選擇原則,每次用一個實際單元替代一個被調(diào)用的樁模塊,并開發(fā)該單元可能需要的樁模塊。
(3)每組裝一個新模塊,測試一個,直到新模塊為系統(tǒng)函數(shù)。
SmartRocket 工具支持集成測試的函數(shù)覆蓋和調(diào)用覆蓋兩大覆蓋準(zhǔn)則。
2.2.1 函數(shù)覆蓋
函數(shù)覆蓋是指程序中所有被調(diào)不同函數(shù)(除系統(tǒng)函數(shù))均被調(diào)用一次。函數(shù)覆蓋是條件最弱的一種集成覆蓋準(zhǔn)則。其原因是它只考慮了被調(diào)不同函數(shù)只調(diào)用一次,忽略了同一個被調(diào)函數(shù)[6]可能在不同的分支被調(diào)用多次。舉例說明函數(shù)覆蓋的局限性,如圖4 所示。
圖4 函數(shù)覆蓋局限性實例Fig.4 Function coverage limitation instance
按照函數(shù)覆蓋的標(biāo)準(zhǔn),該集成的覆蓋率已經(jīng)達(dá)到了100%,然而卻沒有發(fā)現(xiàn)明顯的錯誤,如當(dāng)x為-1 時,程序會出現(xiàn)除零異常。因此,函數(shù)覆蓋沒有考慮到相同被調(diào)函數(shù)的邏輯性,需要結(jié)合其他的集成測試方法來使用。
2.2.2 調(diào)用覆蓋
調(diào)用覆蓋是指程序中所有被調(diào)函數(shù)均被調(diào)用。調(diào)用覆蓋需要結(jié)合分支覆蓋指標(biāo),確保程序真假分支上的被調(diào)函數(shù)都遍歷過至少一次。調(diào)用覆蓋更能準(zhǔn)確地反映集成測試的集成關(guān)系。
以編譯環(huán)境為Rede 的箭載嵌入式軟件中的BC 模式初始化功能為例,使用SmartRocket 進(jìn)行集成測試。集成關(guān)系如圖5 所示,其中printf 函數(shù)為系統(tǒng)函數(shù)。
圖5 集成關(guān)系Fig.5 Integration relationship
首先新建編譯環(huán)境Rede 和GCC;其次創(chuàng)建項目信息(項目名稱、版本號、項目類型、編譯器),并上傳被測項目文件;最后選擇集成測試的覆蓋準(zhǔn)則(調(diào)用覆蓋、函數(shù)覆蓋),并填寫配置信息(運(yùn)行環(huán)境、編譯環(huán)境、包含目錄等)。
解析被測項目文件,在被測項目文件解析無誤的情況下,依據(jù)廣度優(yōu)先的自頂向下的集成方法確定圖4 中的集成組合并選擇集成測試層級,運(yùn)行自動生成的測試用例,并在調(diào)用覆蓋率和函數(shù)覆蓋率指標(biāo)滿足要求的情況下導(dǎo)出測試用例報告。SmartRocket 集成測試界面如圖6 所示。
圖6 SmartRocket 集成測試界面Fig.6 SmartRocket integration test interface
部分集成測試用例報告如表1 所示。
表1 部分測試用例報告Pig.1 Partial test case report
SmartRocket 工具選擇廣度優(yōu)先的自頂向下的集成方法,利用符號執(zhí)行技術(shù)自動生成集成測試用例,并以函數(shù)覆蓋和調(diào)用覆蓋作為集成覆蓋標(biāo)準(zhǔn),自動生成所需測試用例報告,實現(xiàn)了對箭載嵌入式軟件自動化集成測試,并解決了集成測試用例自動生成和測試用例報告適用性問題。
目前,箭載嵌入式軟件含有絕對地址變量時,Smart Rocket 自動生成的集成測試用例無法滿足函數(shù)覆蓋和調(diào)用覆蓋100%的指標(biāo),需人工設(shè)計集成測試用例,后續(xù)自動生成集成測試用例時需針對絕對地址變量自動識別并賦值進(jìn)一步研究。