更新時間:2021年12月24日15時15分 來源:傳智教育 瀏覽次數(shù):
源代碼插樁是指對源文件進(jìn)行完整的詞法、語法分析后,確認(rèn)插樁的位置,植入探針代相比于目標(biāo)代碼插樁,源代碼插樁具有針對性和精確性。源代碼插樁模型如圖3-4所示。
圖3-4 源代碼插樁模型
從圖3-4可以看出,源代碼插樁是在程序執(zhí)行之前完成的,因此源代碼插樁在程序運(yùn)行過程中會產(chǎn)生探針代碼的開銷。相比于目標(biāo)代碼插樁,源代碼插樁實現(xiàn)復(fù)雜程度低。源代碼插樁是源代碼級別的測試技術(shù),探針代碼程序具有較好的通用性,使用同一種編程語言編寫的程序可以使用一個探針代碼程序來完成測試。
上面講解了源代碼插樁的概念與模型,為了讓讀者理解源代碼插樁的使用,下面通過一小案例來講解源代碼插樁。該案例是一個除法運(yùn)算,代碼如下所示。
# include < stdio.h > # define ASSERT(y) if (y) { printf("出錯文件:%s\n", __FILE__);\ Printf("在第%d行:\n") __LINE__\); printf(” 提示: 除數(shù)不能為0!\ n ");\ } //定義ASSERT(Y) int main(){ int x, y; printf( "請輸入被除數(shù):"); scanf("%d", & x); Printf( "請輸入除數(shù):"); scanf("%d", & y); ASSERT(y == 0); //插入的樁(即探針代碼) printf("%d", x / y); return 0; }
為了監(jiān)視除法運(yùn)算除數(shù)輸入是否正確,在代碼第13行插入宏函數(shù)ASSERT(y),當(dāng)除數(shù)為O時打印錯誤原因、出錯文件、出錯行數(shù)等信息提示。宏函數(shù)ASSERT(y)中使用了C語言標(biāo)準(zhǔn)庫的宏定義“▁FILE▁”提示出錯文件、“▁LINE▁”提示文件出錯位置。程序運(yùn)行后,提示輸入被除數(shù)和除數(shù)在輸入除數(shù)后,程序宏函數(shù)ASSERT(y)判斷除數(shù)是否為0,若除數(shù)為0則打印錯誤信息,程序運(yùn)行結(jié)束;若除數(shù)不為0,則進(jìn)行除法運(yùn)算并打印計算結(jié)果。根據(jù)除法運(yùn)算規(guī)則設(shè)計測試用例,如表下表所示。
對插樁后的C源程序進(jìn)行編譯、鏈接,生成可執(zhí)行文件并運(yùn)行,然后輸入表3-8中的測試用例數(shù)據(jù),讀者可觀察測試用例的實際執(zhí)行結(jié)果與預(yù)期結(jié)果是否一致。程序插樁測試方法有效地提高了代碼測試覆蓋率,但是插樁測試方法會帶來代碼膨脹、執(zhí)行效率低下和HeisenBugs,在一般情況下插樁后的代碼膨脹率在20%~40%,甚至能達(dá)到100%導(dǎo)致插樁測試失敗。
HeisenBugs即海森堡Bug,它是一種軟件缺陷,這種缺陷的重現(xiàn)率很低,當(dāng)人們試圖研究時Bug會消失或改變行為。實際開發(fā)軟件測試中,這種缺陷也比較常見,例如,測試人員測試到一個缺陷提交給開發(fā)人員后,開發(fā)人員執(zhí)行缺陷重現(xiàn)步驟卻得不到報告的缺陷,因為缺陷已經(jīng)消失或者出現(xiàn)了其他缺陷。