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