電子百科
在實現(xiàn)覆蓋測試的過程中,往往需要知道某些信息,如:程序中可執(zhí)行語句被執(zhí)行(即被覆蓋)的情況,程序執(zhí)行的路徑,變量的引用、定義等。要想獲取這類信息,需要跟蹤被測程序的執(zhí)行過程,或者是由計算機(jī)在被測程序執(zhí)行的過程中自動記錄。前者需要人工進(jìn)行,效率低下且枯燥乏味;后者則需要在被測程序中插入完成相應(yīng)工作的代碼,即代碼插樁技術(shù)。如今大多數(shù)的覆蓋測試工具均采用代碼插樁技術(shù)。
在對普通應(yīng)用的軟件進(jìn)行測試時,由于現(xiàn)在電腦的配置越來越高,電腦的運(yùn)行速度越來越快,代碼插樁所引起的問題還不是很明顯或者說是在可以接受的范圍之內(nèi)。但是對于嵌入式軟件來說這卻是致命的問題。因為嵌入式軟件的系統(tǒng)資源有限(內(nèi)存較小、I/O 通道較少等),過大的代碼膨脹率將使得程序不能在嵌入式系統(tǒng)中運(yùn)行;同時嵌入式軟件通常具有很強(qiáng)的實時性,程序的輸出只在有限的時間內(nèi)有效,遲到的“正確的”結(jié)果是無用的甚至?xí)兂慑e誤的、有害的。
代碼插樁技術(shù)會破壞程序的時間特性等,導(dǎo)致軟件執(zhí)行的錯誤。因此我們需要更高效的代碼插樁技術(shù)來完成覆蓋測試,尤其是嵌入式軟件的覆蓋測試。
由于程序插樁技術(shù)是在被測程序中插入探針,然后通過探針的執(zhí)行來獲得程序的控制流和數(shù)據(jù)流信息,以此來實現(xiàn)測試的目的。因此,根據(jù)探針插入的時間可以分為目標(biāo)代碼插樁和源代碼插樁。
?。?)目標(biāo)代碼插樁的前提是對目標(biāo)代碼進(jìn):
行必要的分析以確定需要插樁的地點(diǎn)和內(nèi)容。由于目標(biāo)代碼的格式主要和操作系統(tǒng)相關(guān),和具體的編程語言及版本無關(guān),所以得到了廣泛的應(yīng)用,尤其是在需要對內(nèi)存進(jìn)行監(jiān)控的軟件中。但是由于目標(biāo)代碼中語法、語義信息不完整,而插樁技術(shù)需要對代碼詞法語法的分析有較高的要求,故在覆蓋測試工具中多采用源代碼插樁。
?。?)源代碼插樁是在對源文件進(jìn)行完整的:
詞法分析和語法分析的基礎(chǔ)上進(jìn)行的,這就保證對源文件的插樁能夠達(dá)到很高的準(zhǔn)確度和針對性。但是源代碼插樁需要接觸到源代碼,使得工作量較大,而且隨著編碼語言和版本的不同需要做一定的修改。在后面我們所提到的程序插樁均指源代碼插樁。
?。?)插樁位置:
探針的植入要做到緊湊精干,才能保證在做到收集的信息全面而無冗余,減少代碼的膨脹率。因此,在確定插樁位置時,要將程序劃分,基本的劃分方法是基于“塊”結(jié)構(gòu)。
按照塊結(jié)構(gòu)的劃分,探針的植入位置有以下幾種情況:
a. 程序的第一條語句;b. 分支語句的開始;c. 循環(huán)語句的開始;d. 下一個入口語句之前的語句;e. 程序的結(jié)束語句;f. 分支語句的結(jié)束;g. 循環(huán)語句的結(jié)束;除此之外,根據(jù)覆蓋測試要求的不同,插樁的位置除了上面所說的幾種情況外,也會隨著覆蓋測試要求的不同有所變化。
(2)插樁策略:
插樁策略是解決“如何插”的問題。傳統(tǒng)的插樁策略是在所有需要插樁的位置插入探針,在程序運(yùn)行過程收集所有可能用到得程序信息,將其寫入數(shù)據(jù)庫進(jìn)行分析和處理。這種方法對于大型的程序來說,將會造成相當(dāng)大的工作量,效率很低,且會造成很大的代碼膨脹率。而我們會根據(jù)不同的測試要求,每次插入不同的探針,采用相應(yīng)的插樁策略,這樣就減少了代碼的膨脹率,保證了程序執(zhí)行的效率。下面簡單介紹幾種探針的插樁策略。
語句覆蓋探針(基本塊探針):在基本塊的入口和出口處,分別植入相應(yīng)的探針,以確定程序執(zhí)行時該基本塊是否被覆蓋。
分支覆蓋探針:C/C++語言中,分支由分支點(diǎn)確定。對于每個分支,在其開始處植入一個相應(yīng)的探針,以確定程序執(zhí)行時該分支是否被覆蓋。
條件覆蓋探針:C/C++語言中,if, swich,while, do-while, for 幾種語法結(jié)構(gòu)都支持條件判定,在每個條件表達(dá)式的布爾表達(dá)式處植入探針,進(jìn)行變量跟蹤取值,以確定其被覆蓋情況。
根據(jù)不同測試要求采用不用的插樁策略,每次在不同的位置植入相應(yīng)的探針,使得每次只是植入有限的探針,這就更大大減少了代碼的膨脹率和插樁的速度。
采用了一個 1000 行的程序作為被測程序,分別采用使用整體插樁的工具和我們自己開發(fā)的工具進(jìn)行測試,結(jié)果發(fā)現(xiàn)前者插樁的時間和代碼膨脹率分別為3s 和35%,后者插樁的平均時間和平均的代碼膨脹率為1s 和8%,插樁時間得到明顯提升,代碼膨脹率明顯減少。
采用以上的程序插樁技術(shù),除了常用的覆蓋測試策略外,我們還可以實現(xiàn)MC/DC 和LCSAJ 測試。