覆蓋測試中高效代碼插樁技術(shù)的研究
由于代碼插樁技術(shù)中插樁點(diǎn)識別過(guò)程中的詞法、語(yǔ)法分析只需要識別有限的程序結構特征即可,而對程序中所有的詞法語(yǔ)法進(jìn)行分析是因為由中間代碼生成匯編代碼時(shí),需要以詞法語(yǔ)法分析作為基礎,識別出所有的程序結構特征。由此可以知道滿(mǎn)足插樁技術(shù)要求的詞法語(yǔ)法分析器可以比中間代碼生成的詞法語(yǔ)法分析器簡(jiǎn)單。生成滿(mǎn)足插樁點(diǎn)識別的詞法語(yǔ)法分析器的詞法語(yǔ)法分析程序的輸入為預處理后的源代碼文件,輸出是插樁后的源代碼文件(如圖1 所示的灰色部分)。由于新增加的詞法語(yǔ)法分析程序僅僅是針對插樁所需識別的詞法、語(yǔ)法進(jìn)行分析,故而需要植入的探針比較少,代碼膨脹率自然減小,插樁速度加快,進(jìn)而整個(gè)編譯過(guò)程就會(huì )加快。
2.3 插樁程序的設計
探針的設計解決了插樁內容的問(wèn)題,而插樁程序的設計是用來(lái)確定插樁位置和插樁策略的,即回答“在哪插”和“如何插”的問(wèn)題。
(1)插樁位置:
探針的植入要做到緊湊精干,才能保證在做到收集的信息全面而無(wú)冗余,減少代碼的膨脹率。因此,在確定插樁位置時(shí),要將程序劃分,基本的劃分方法是基于“塊”結構。
按照塊結構的劃分,探針的植入位置有以下幾種情況:
a. 程序的第一條語(yǔ)句;b. 分支語(yǔ)句的開(kāi)始;c. 循環(huán)語(yǔ)句的開(kāi)始;d. 下一個(gè)入口語(yǔ)句之前的語(yǔ)句;e. 程序的結束語(yǔ)句;f. 分支語(yǔ)句的結束;g. 循環(huán)語(yǔ)句的結束;除此之外,根據覆蓋測試要求的不同,插樁的位置除了上面所說(shuō)的幾種情況外,也會(huì )隨著(zhù)覆蓋測試要求的不同有所變化。
(2)插樁策略:
插樁策略是解決“如何插”的問(wèn)題。傳統的插樁策略是在所有需要插樁的位置插入探針,在程序運行過(guò)程收集所有可能用到得程序信息,將其寫(xiě)入數據庫進(jìn)行分析和處理。這種方法對于大型的程序來(lái)說(shuō),將會(huì )造成相當大的工作量,效率很低,且會(huì )造成很大的代碼膨脹率。而我們會(huì )根據不同的測試要求,每次插入不同的探針,采用相應的插樁策略,這樣就減少了代碼的膨脹率,保證了程序執行的效率。下面簡(jiǎn)單介紹幾種探針的插樁策略。
語(yǔ)句覆蓋探針(基本塊探針):在基本塊的入口和出口處,分別植入相應的探針,以確定程序執行時(shí)該基本塊是否被覆蓋。
分支覆蓋探針:C/C++語(yǔ)言中,分支由分支點(diǎn)確定。對于每個(gè)分支,在其開(kāi)始處植入一個(gè)相應的探針,以確定程序執行時(shí)該分支是否被覆蓋。
條件覆蓋探針:C/C++語(yǔ)言中,if, swich,while, do-while, for 幾種語(yǔ)法結構都支持條件判定,在每個(gè)條件表達式的布爾表達式處植入探針,進(jìn)行變量跟蹤取值,以確定其被覆蓋情況。
根據不同測試要求采用不用的插樁策略,每次在不同的位置植入相應的探針,使得每次只是植入有限的探針,這就更大大減少了代碼的膨脹率和插樁的速度。
3 實(shí)驗
本文采用了一個(gè) 1000 行的程序作為被測程序,分別采用使用整體插樁的工具和我們自己開(kāi)發(fā)的工具進(jìn)行測試,結果發(fā)現前者插樁的時(shí)間和代碼膨脹率分別為3s 和35%,后者插樁的平均時(shí)間和平均的代碼膨脹率為1s 和8%,插樁時(shí)間得到明顯提升,代碼膨脹率明顯減少。
采用以上的程序插樁技術(shù),除了常用的覆蓋測試策略外,我們還可以實(shí)現MC/DC 和LCSAJ 測試。
4 結束語(yǔ)
本文詳細介紹了覆蓋測試中的高效代碼插樁技術(shù),由此可以看出在實(shí)際中覆蓋測試分析采用的覆蓋策略的多樣性決定了程序插樁時(shí)需要識別程序的特征的復雜性。同時(shí)在軟件覆蓋測試工具的開(kāi)發(fā)中,如果從軟件的分析開(kāi)始,就有合理的程序劃分、適當的選定插樁位置和插樁策略,就可以滿(mǎn)足多種測試要求,使得測試能夠合理又快速的實(shí)現。如果再加上自動(dòng)化測試工具的支持,那就可以大大提高測試的效率。本文引用地址:http://dyxdggzs.com/article/202489.htm
評論