范琳+王海
摘 要: 深入研究嵌入式軟件的白盒測(cè)試技術(shù),提出基于宿主平臺(tái)的嵌入式軟件測(cè)試構(gòu)架。針對(duì)語(yǔ)句覆蓋測(cè)試,提出一種基于順序塊的插樁方法,能有效減少樁的個(gè)數(shù),從而減少樁函數(shù)對(duì)測(cè)試過(guò)程的影響。針對(duì)分支覆蓋率測(cè)試,插樁后的被測(cè)程序運(yùn)行在ARMulator上,樁獲取器分析樁信息,得出程序運(yùn)行中的實(shí)時(shí)語(yǔ)句覆蓋率。實(shí)現(xiàn)了嵌入式軟件測(cè)試平臺(tái)ARM?Test,實(shí)驗(yàn)證明:該模型能獲取實(shí)時(shí)的語(yǔ)句覆蓋率,有效進(jìn)行白盒測(cè)試。
關(guān)鍵詞: 嵌入式模擬器; 順序塊; 插樁; 白盒測(cè)試
中圖分類號(hào): TN710?34; TG335.58 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)18?0140?03
An instrumentation method based on sequence block for embedded software
white?box testing
FAN Lin1, WANG Hai2
(1. Department of Computer Science and Technology, Xian University of Posts and Telecommunications, Xian 710121, China;
2. School of Information Science & Technology, Northwest University, Xian 710069, China)
Abstract: An embedded software testing framework based on hosting platform is proposed on the basis of in?depth study of the white?box testing technology for embedded softwares. An instrumentation method based on sequence block is brought forward to conduct statement coverage testing, which can effectively reduce the number of stubs, so as to reduce the impact of stubs on the testing process. After instrumentation, the program under test was run on ARMulator. The stub information is analyzed by the stub receiver to get the real?time statement branch coverage. An embedded software testing platform ARM?Test was developed. The experiment results show ARM?Test can get real?time statement branch coverage and do white?box testing effectively.
Keywords: embedded system simulator; sequence block; instrumentation; white?box testing
0 引 言
隨著嵌入式系統(tǒng)的廣泛應(yīng)用,人們對(duì)嵌入式設(shè)備的穩(wěn)定性和可靠性提出了更高的要求。由于目標(biāo)機(jī)與宿主機(jī)硬件環(huán)境不同,使用的是不同體系結(jié)構(gòu)的處理器,嵌入式軟件無(wú)法在宿主機(jī)上直接運(yùn)行與測(cè)試[1?4],將嵌入式模擬器應(yīng)用于嵌入式軟件的開(kāi)發(fā)與測(cè)試,能使得軟件與硬件并行開(kāi)發(fā)。在宿主機(jī)上建立起一個(gè)內(nèi)核與外設(shè)均可配置與裁剪的模擬器,使得硬件還沒(méi)有開(kāi)發(fā)出來(lái)時(shí),軟件就能在模擬器上運(yùn)行和測(cè)試,就像在真正的硬件系統(tǒng)運(yùn)行上一樣[5?7]。
本文采用ARM公司提供的源內(nèi)核模擬器ARMulator搭建嵌入式測(cè)試平臺(tái),針對(duì)源碼進(jìn)行基于順序塊的插樁,進(jìn)行語(yǔ)句覆蓋率測(cè)試,能在宿主平臺(tái)通過(guò)ARMulator實(shí)時(shí)獲取樁數(shù)據(jù)并進(jìn)行分析,得到程序運(yùn)行過(guò)程中的語(yǔ)句覆蓋率,以實(shí)現(xiàn)軟硬件開(kāi)發(fā)的同步,保證嵌入式系統(tǒng)的質(zhì)量。
1 已有研究
目前實(shí)用的嵌入式系統(tǒng)測(cè)試平臺(tái)主要由國(guó)外廠商開(kāi)發(fā),比較具有代表性的測(cè)試平臺(tái)有Teleloglc公司的Logi?scope,Metrowerks公司的CodeTest,Windriver公司的CoverageScope和IPL公司的Cantata等。但一套測(cè)試系統(tǒng)價(jià)格往往高達(dá)數(shù)萬(wàn)到十多萬(wàn)美元,極大增加了嵌入式系統(tǒng)的開(kāi)發(fā)成本[8?10]。ARM公司提供嵌入式系統(tǒng)模擬器ARMulator,能在宿主機(jī)上提供嵌入式軟件運(yùn)行環(huán)境 [11]。
北京大學(xué)、北京航空航天大學(xué)進(jìn)行了一系列的軟件分析和測(cè)試工具的研究與開(kāi)發(fā),研制了一系列的測(cè)試工具,代表性的工具有SafePro C/C++,SafePro/java。西北工業(yè)大學(xué)在航空軟件仿真測(cè)試、并行軟件綜合測(cè)試平臺(tái)及C/S系統(tǒng)的測(cè)試方面進(jìn)行了許多研究工作并取得一些成果 [1?4]。
2 基于宿主機(jī)的嵌入式軟件白盒測(cè)試技術(shù)
2.1 基于宿主機(jī)的嵌入式軟件測(cè)試構(gòu)架
本文提出了基于宿主平臺(tái)的嵌入式軟件測(cè)試構(gòu)架。在宿主機(jī)上搭建嵌入式測(cè)試平臺(tái),內(nèi)部加載嵌入式模擬器,使得嵌入式軟件具備運(yùn)行環(huán)境;在進(jìn)行白盒測(cè)試時(shí),首先對(duì)被測(cè)程序進(jìn)行插樁,樁函數(shù)在程序運(yùn)行過(guò)程中能同步的、實(shí)時(shí)的輸出預(yù)設(shè)的樁信息。使用樁信息分析器接收樁信息,并進(jìn)行分析和計(jì)算,能實(shí)時(shí)獲取整個(gè)程序運(yùn)行過(guò)程中的語(yǔ)句覆蓋和分支選擇情況。
2.2 被測(cè)程序的處理流程
被測(cè)程序的處理流程如圖1所示,具體為:
(1) 對(duì)源程序進(jìn)行規(guī)范化,規(guī)范化的過(guò)程包括了詞法分析、語(yǔ)法分析和代碼整理。
(2) 對(duì)規(guī)范化后的程序進(jìn)行順序塊劃分,并統(tǒng)計(jì)每個(gè)順序塊的信息:塊起止行號(hào)、塊內(nèi)語(yǔ)句數(shù)、順序塊總數(shù)等。
(3) 由測(cè)試平臺(tái)自動(dòng)插入不同的樁函數(shù),經(jīng)過(guò)編譯、鏈接后,生成嵌入式映像文件,能運(yùn)行于嵌入式模擬器之上。在動(dòng)態(tài)測(cè)試階段通過(guò)運(yùn)行目標(biāo)代碼將樁信息發(fā)送至樁信息分析器,以獲取程序運(yùn)行過(guò)程中的語(yǔ)句覆蓋率。
圖1 被測(cè)程序處理流程
2.3 基于順序塊的插樁技術(shù)
本文中將被測(cè)程序劃分為若干順序塊,針對(duì)順序塊進(jìn)行插樁。有如下定義:
順序塊:若干相連順序語(yǔ)句的集合,是一段不包含任何分支、循環(huán)或函數(shù)調(diào)用的順序程序段。一個(gè)順序塊中所有語(yǔ)句的執(zhí)行次數(shù)相同。在程序插樁時(shí),只需對(duì)順序塊的開(kāi)始或結(jié)尾處插樁即可,避免了對(duì)每條語(yǔ)句的重復(fù)插樁,減少了測(cè)試過(guò)程對(duì)程序運(yùn)行的影響。
遍歷整個(gè)程序,統(tǒng)計(jì)可執(zhí)行語(yǔ)句的總行數(shù),并進(jìn)行順序塊劃分。非可執(zhí)行語(yǔ)句不在統(tǒng)計(jì)的范疇內(nèi)。從第一條可執(zhí)行代碼開(kāi)始處理,遇到以下內(nèi)容時(shí)當(dāng)前順序塊結(jié)束:
(1) 循環(huán)語(yǔ)句關(guān)鍵字for,do,while,do until;
(2) 分支語(yǔ)句關(guān)鍵字if,else if,else及end if ;
(3) 函數(shù)調(diào)用語(yǔ)句;
(4) return語(yǔ)句。
在對(duì)被測(cè)程序進(jìn)行順序塊劃分后,針對(duì)每個(gè)被測(cè)程序建立分塊信息[Bl[N]],[N]為總分塊數(shù)。
[Bl[n]={n,Start,End,Lines},n∈[0,N) ]
其中[n]是順序塊的編號(hào),[Start]是起始行號(hào),[End]是結(jié)束行號(hào),[Lines]是該順序塊的行數(shù)。
分塊后在源程序頭添加全局變量的定義和樁函數(shù)的聲明:
[staticintblock=0; voidsendstub();]
在每個(gè)塊結(jié)束的位置插入下列語(yǔ)句,其中[n]為當(dāng)前塊的塊號(hào),[sendstub]函數(shù)發(fā)送信息到樁信息分析器:
[block=n;sendstub(block); ]
以上插樁過(guò)程由函數(shù)自動(dòng)進(jìn)行。在進(jìn)行語(yǔ)句覆蓋測(cè)試時(shí),先發(fā)送[Bl[N]]信息到樁信息分析器。然后在程序運(yùn)行過(guò)程中,實(shí)時(shí)由樁函數(shù)[sendstub]發(fā)送當(dāng)前執(zhí)行的塊號(hào)到樁信息分析器,以計(jì)算實(shí)時(shí)的語(yǔ)句覆蓋率。
本文采用了進(jìn)程間通信的方式,在嵌入式模擬器中維護(hù)一塊共享內(nèi)存,每次樁函數(shù)將要發(fā)送的信息寫(xiě)入共享內(nèi)存,并通過(guò)Windows消息通知樁信息分析器取走數(shù)據(jù)。這樣樁信息分析器就能實(shí)時(shí)獲取樁數(shù)據(jù),并繪制出實(shí)時(shí)的覆蓋率曲線。
在每個(gè)順序塊后調(diào)用樁函數(shù),樁函數(shù)的作用是發(fā)送樁信息到樁信息分析器,由樁信息分析器實(shí)時(shí)分析程序運(yùn)行過(guò)程中的覆蓋率。為盡量減少模擬器和樁信息分析器之間的數(shù)據(jù)傳輸,樁函數(shù)只需將當(dāng)前順序塊號(hào)[i]發(fā)送給樁信息分析器,當(dāng)執(zhí)行到樁函數(shù)時(shí),證明當(dāng)前順序塊已被完全執(zhí)行,樁信息分析器就能及時(shí)更新其程序覆蓋率的值。
在語(yǔ)句覆蓋測(cè)試中,設(shè)樁信息分析器在測(cè)試過(guò)程中動(dòng)態(tài)獲取的信息為:[{i1,i2,…,ik}?[0,N)],如果有重復(fù)塊號(hào)說(shuō)明該塊被執(zhí)行了不止一次。其中不重復(fù)塊號(hào)組成集合[?],則語(yǔ)句覆蓋率[Cs]為:
[Cs=n∈?Bln→Linesn=0N-1Bln→Lines×100%]
3 系統(tǒng)實(shí)現(xiàn)
項(xiàng)目組基于ARM內(nèi)核模擬器ARMulator開(kāi)發(fā)嵌入式測(cè)試平臺(tái)ARM?Test,能實(shí)現(xiàn)嵌入式程序的白盒測(cè)試,在被測(cè)程序或工程經(jīng)過(guò)預(yù)處理、插樁、編譯、鏈接后,生成可執(zhí)行文件運(yùn)行于嵌入式模擬器之上,運(yùn)行過(guò)程中實(shí)時(shí)將樁信息發(fā)送出來(lái),經(jīng)分析器獲取并處理,獲得實(shí)時(shí)的語(yǔ)句覆蓋率和分支覆蓋率。系統(tǒng)界面及測(cè)試效果如圖2,圖3所示。
圖2 ARM?Test界面
圖3 某例子程序的語(yǔ)句覆蓋率
4 結(jié) 語(yǔ)
本文提出一種基于順序塊的插樁方法,能進(jìn)行語(yǔ)句覆蓋測(cè)試。測(cè)試過(guò)程中能對(duì)樁信息實(shí)時(shí)處理獲得動(dòng)態(tài)的語(yǔ)句覆蓋率曲線,以實(shí)現(xiàn)軟硬件開(kāi)發(fā)的同步,保證了嵌入式系統(tǒng)的質(zhì)量。測(cè)試方法僅針對(duì)語(yǔ)句覆蓋率,后期還需進(jìn)行分支覆蓋、條件覆蓋測(cè)試。
參考文獻(xiàn)
[1] 盛云龍.基于組合覆蓋的嵌入式軟件測(cè)試平臺(tái)研制[D].哈爾濱:哈爾濱工業(yè)大學(xué),2013.
[2] 葉永鑫.嵌入式軟件測(cè)試平臺(tái)的研究與實(shí)現(xiàn)[D].北京:北京交通大學(xué),2010.
[3] 呂金和.嵌入式軟件測(cè)試[J].軟件導(dǎo)刊,2010(9):40?41.
[4] 王熒.嵌入式軟件可靠性測(cè)試工具的研究與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2009.
[5] Bill Blunden.虛擬機(jī)的設(shè)計(jì)與實(shí)現(xiàn)[M].北京:機(jī)械工業(yè)出版社,2003.
[6] 范琳,王忠民,王海.基于嵌入式系統(tǒng)模擬器的測(cè)試平臺(tái)構(gòu)架[J].微計(jì)算機(jī)信息,2010(17):61?62.
[7] 范琳,王忠民,梁琛,等.基于Proemulator的插樁構(gòu)架研究[J].現(xiàn)代電子技術(shù),2010,33(3):188?190.
[8] 蔣崇武,楊順昆,劉斌.面向嵌入式軟件測(cè)試的仿真建模[J].計(jì)算機(jī)工程,2008,34(4):87?89.
[9] 祝義.嵌入式軟件需求規(guī)約到軟件體系結(jié)構(gòu)模型的轉(zhuǎn)換研究[D].南京:南京航空航天大學(xué),2011.
[10] HAN Alex Heunhe, AHN Yong?Ho, CHUNG Ki?Seok. Virtual ARM simulation platform for embedded system developers [C]// ITC?CSCC. [S.l.]: ITC, 2008: 253?256.
[11] 周立功.ARM嵌入式系統(tǒng)基礎(chǔ)教程[M].北京:北京航空航天大學(xué)出版社,2007.