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