基于仿真的嵌入式軟件白盒覆蓋測試系統設計
引言
隨著(zhù)嵌入式系統的廣泛應用,人們對嵌入式系統軟件的質(zhì)量提出了更高的要求,而作為保證軟件質(zhì)量最有效手段的測試技術(shù),也越來(lái)越受到關(guān)注。目前嵌入式軟件的開(kāi)發(fā)語(yǔ)言以C等高級語(yǔ)言為卞,因此,對這些高級語(yǔ)言的測試顯得尤為重要,”。
目前實(shí)用的嵌入式系統測試平臺卞要由國外廠(chǎng)商開(kāi)發(fā),比較具有代表性的測試平臺有T eleloglc公司的Logi-scope .M etrow erk、公司的CodeTest, Windriver公司的CoverageScope和IPL公司的C ant at a等。國外廠(chǎng)商的嵌入式系統測試平臺功能較強,技術(shù)較先進(jìn),但一套測試系統價(jià)格往往高達數萬(wàn)到十多萬(wàn)美元,極大增加了嵌入式系統的開(kāi)發(fā)成木,無(wú)法得到普遍的應用,影響了國內嵌入式系統的開(kāi)發(fā)質(zhì)量,2’。
國內的嵌入式系統測試平臺有基于目標開(kāi)發(fā)的測試系統。電子科技大學(xué)研究了基于目標的嵌入式軟件測試系統,實(shí)現了對匯編語(yǔ)言進(jìn)行自動(dòng)插裝,并實(shí)現基木的覆蓋測試功能。但由于嵌入式軟件需要基于硬件電路進(jìn)行調試,當軟件程序寫(xiě)入硬件電路后,如果電路工作不正常甚至無(wú)法工作,則難以斷定問(wèn)題所在,這就限制了嵌入式軟件測試必須按照先硬件后軟件的模式進(jìn)行,3’。
木系統實(shí)現了基于仿真的嵌入式C語(yǔ)言軟件覆蓋測試分析。通過(guò)有效的詞法語(yǔ)法分析、自動(dòng)插裝、測試用例的生成和加入、動(dòng)態(tài)仿真運行及覆蓋報告分析等模塊對源代碼進(jìn)行覆蓋分析,縮短了嵌入式系統開(kāi)發(fā)周期,有效地解決了傳統手工測試程序運行效率低、繁瑣等問(wèn)題,保證了嵌入式軟件系統高效穩定的運行。
1嵌入式軟件測試系統框圖
嵌入式軟件測試系統的結構框圖如圖1所示。它卞要由5部分組成:程序的預處理過(guò)程(包括詞法語(yǔ)法分析)程序的自動(dòng)插裝過(guò)程、測試用例的加入、動(dòng)態(tài)仿真運行及覆蓋報告分析,4,。
被測試程序首先經(jīng)過(guò)預處理。由于源程序中存在宏定義次件包含和條件編譯等預處理命令,因此在進(jìn)行詞法分析前必須進(jìn)行預處理,將宏展開(kāi),以利于查找變量詞法分析是將預處理階段產(chǎn)生的中間代碼分解成單獨的詞的表示,語(yǔ)法分析是將輸入字符串識別為單詞符號流,卞要用來(lái)確定插裝的位置,在一些關(guān)鍵的字段和函數處插
2功能模塊設計
2. 1詞法語(yǔ)法分析模塊
(1)預處理
在源程序中,空白符測匕格符、回車(chē)符和換行符等編輯性字符除了出現在文字常數中之外,在別處任何地方出現都沒(méi)意義,而注釋部分出現在程序中的任何地方。對于這些不是程序必要組成的部分,預處理時(shí)可以將其剔掉,5’。
( 2)詞法分析
將預處理階段產(chǎn)生的中間代碼分解成單獨詞的表示,并將詞的基木信息表,如詞的行號、詞的列號及詞的類(lèi)型等信息,為語(yǔ)法分析做準備。詞的類(lèi)型有:普通變量標識符擻字表、關(guān)鍵字表運算符表,6’。
( 3)語(yǔ)法分析
語(yǔ)法分析的卞要任務(wù)是在詞法分析識別出的單詞符號串的基礎上,分析并判斷程序的語(yǔ)法結構是否符合語(yǔ)法規則。由于木系統分析的程序是經(jīng)過(guò)嵌入式軟件編譯器編譯的,因此認為不存在語(yǔ)法上的錯誤,只是通過(guò)語(yǔ)法分析得到程序結構及函數信息,為插裝做準備。
2. 2插裝模塊
程序插裝概念由J. G. H uang教授首次提出,簡(jiǎn)單地說(shuō)就是借助向被測程序中插入操作來(lái)實(shí)現測試目的。在調試程序時(shí),常常要在程序中插入一些打印語(yǔ)句,希望執行程序時(shí)打印出所關(guān)心的信息。通過(guò)這些信息進(jìn)一步了解執行過(guò)程中程序的一些動(dòng)態(tài)特性。比如,程序的實(shí)際執行路徑,或是特定變量在特定時(shí)刻的取值。從這一思想發(fā)展出的程序插裝技術(shù)能夠按用戶(hù)的要求,獲取程序的各種
2. 4覆蓋率分析
通過(guò)動(dòng)態(tài)仿真運行模塊,覆蓋信息被寫(xiě)入文件中,讀取存放記錄文件,分別對語(yǔ)句塊數和執行分支數進(jìn)行計算。根據覆蓋率公式,結合計算的結果,得到測試語(yǔ)句覆蓋汾支覆蓋與程序的有效代碼率并GUI顯示。將測試的結果與測試用例庫生成的測試用例期望值作比較,得出測試結論,9’。
2. 4. 1語(yǔ)句覆蓋率算法分析
語(yǔ)句覆蓋是軟件測試中最基木的覆蓋標準,因此在測試時(shí)應將每個(gè)語(yǔ)句至少執行1次。在 T estImp系統中得到語(yǔ)句覆蓋率的算法流程如圖3所示,通過(guò)詞法分析后,讀單獨的詞語(yǔ),如遇到能產(chǎn)生分支的關(guān)鍵詞(for .if .else .switch .goto .return .break .continue .do :`{”和“}’,)則繼續往卜判斷,否則返回繼續讀詞語(yǔ)。如果是能產(chǎn)生分支的關(guān)鍵詞,則將關(guān)鍵詞對應的當前標號(flagif }flagelse .flagwhile,flagfor }flagswitch)推進(jìn)棧中的account單元保存,并將當前標號加1。當讀取到關(guān)鍵詞之后第1個(gè)氣”時(shí),標志fflag加1,且判斷是否大于1:如果大于1,則將此時(shí)的行號推入到棧當前位置中的mine單元中保存;否則直接返回讀詞。如果是+}”標號,則判斷鏈表的節點(diǎn)是否大于。,如果是且為1,則用“}”當前行數減去保存棧中“{”的行數,然后減去最近嵌套內層的總行數即得到該層對應行數;如果鏈表節點(diǎn)大于1,則判斷鏈表節點(diǎn)數與對應層數是否相等,如果相等則計算出該層的總行數,即用此時(shí)+}”行數減去棧中保存“{”的總行數,然后保存該層總行數,并用總行數減去最近嵌套內層行數之和,即得到該層行數對應記錄。如果鏈表節點(diǎn)數與對應層數不相等,則將對應層數加1循環(huán)作判斷。當所有的詞語(yǔ)全部讀取完畢后,讀取動(dòng)態(tài)執行時(shí)寫(xiě)入的插裝文件,讀取關(guān)鍵詞標號,取對應關(guān)鍵詞鏈表中的行數與總行數變量相加,直至插裝文件讀取完畢,此時(shí)可以輸出被覆蓋語(yǔ)句數。
2.4.2分支覆蓋率算法分析
分支覆蓋率的計算一般也需要達到一定的指標。在T estImp系統中得到分支覆蓋率的算法流程如圖4
該系統實(shí)現如卜幾個(gè)模塊:
①分析模塊。用打開(kāi)文件菜單選擇要分析的源文件,并進(jìn)行詞法分析。在詞法分析過(guò)程中,對關(guān)鍵詞、符號擻字變量等用不同的標記,并去除源文件中的注釋?zhuān)o出每個(gè)詞的行數和列數。語(yǔ)法分析并沒(méi)有生成可見(jiàn)的語(yǔ)法樹(shù),只是形成提供插裝的結構信息。
②插裝模塊。選擇自動(dòng)插裝菜單,系統會(huì )讀取詞法語(yǔ)法分析的結果,根據圖2算法流程實(shí)現對源程序的自動(dòng)插裝,插裝點(diǎn)有for ,if ,else ,case ,goto ,return ,break ,con-tinue .do ,while語(yǔ)句后及程序開(kāi)始與結束處插入記錄函數指針,并在程序最后插入插裝函數體。
③編譯器配置模塊。根據不同嵌入式軟件選擇不同的編譯環(huán)境,該部分需在使用該系統之前對各種嵌入式編譯軟件進(jìn)行配置,在木系統中有Visual C + + ,ARM編譯器ADS ,Keil環(huán)境沛福環(huán)境,Borland C環(huán)境,DSP編譯器CCS。
④覆蓋率報告。木系統已實(shí)現的覆蓋率報告有語(yǔ)句覆蓋與分支覆蓋,并將覆蓋率通過(guò)二維圖形形式體現。后續將實(shí)現條件覆蓋、多條件判定覆蓋、多條件覆蓋,M C/DC潞徑覆蓋等覆蓋率報告。
C服告生成及幫助文檔。將測試覆蓋結果與測試前生成設定的覆蓋率指標進(jìn)行比較得到測試結果。如果覆蓋率沒(méi)有達到要求,則繼續增加測試用例,以提高測試覆蓋率。另外有幫助文檔,提供使用說(shuō)明、注意事項及應用范圍等。
4實(shí)驗結果
在實(shí)驗中,采用1個(gè)AT 89C51單片機鍵盤(pán)識別系統作為實(shí)驗對象。在該系統中,通過(guò)AT 89C51的P1口連接1個(gè)4x4的知陣鍵盤(pán),并通過(guò)P0. 4 } P0. 6所連接的74LS138擴展連接到型號位7SEG-MPXGCA的6位LED選通端上,可以顯示所按卜鍵盤(pán)的編號,將RXD和T XD連接到串口。
實(shí)驗過(guò)程中,將測試源程序進(jìn)行分析并自動(dòng)插裝,然后通過(guò)單片機的Keil編譯器對插裝后的源程序進(jìn)行編譯,得到.hex文件,添加到Proteus6. 9仿真軟件原理圖中的AT 89C51單片機中,點(diǎn)擊運行按鈕后可以執行程序。此時(shí)可以在Proteus6. 9界而中輸入生成的測試用例,’。,,木實(shí)例中的測試用例是鍵盤(pán)按鍵的輸入,只需點(diǎn)擊Proteus6. 9原理圖中的鍵盤(pán)。此時(shí)插裝后的程序會(huì )將插裝的信急通過(guò)串口傳送到TestImp測試系統的聯(lián)機串口傳送界而中,并將其保存在指定文件中,為覆蓋測試做準備。
為該系統設計的基木測試用例是按卜單個(gè)1號鍵。在此測試用例卜,手工運行推算出語(yǔ)句覆蓋率和分支覆蓋率分別為55. 6%和42. 80}0 ,在測試系統運行后,得出的語(yǔ)句覆蓋率和分支覆蓋率分別為55. 6%和42. 8 0}o。測試結果如圖5所示。
實(shí)驗結果表明:在特定的測試用例卜,對嵌入式系統應用木文設計的基于仿真嵌入式軟件白盒覆蓋測試系統與理論上推導出來(lái)的語(yǔ)句和分支覆蓋率指標完全相同。
評論