版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章白盒測(cè)試及其用例的設(shè)計(jì)3.1白盒測(cè)試方法3.2控制流圖3.3白盒測(cè)試覆蓋指標(biāo)3.4數(shù)據(jù)流測(cè)試3.5白盒測(cè)試方法總結(jié)第3章白盒測(cè)試及其用例的設(shè)計(jì)3.1白盒測(cè)試方法本章教學(xué)目標(biāo)理論環(huán)節(jié)學(xué)習(xí)理解白盒測(cè)試方法的基本概念學(xué)習(xí)理解白盒測(cè)試的覆蓋理論學(xué)習(xí)掌握白盒測(cè)試的路徑表達(dá)學(xué)習(xí)掌握白盒測(cè)試的基本路徑測(cè)試法學(xué)習(xí)掌握白盒測(cè)試的數(shù)據(jù)流測(cè)試法實(shí)踐環(huán)節(jié)通過(guò)案例運(yùn)用學(xué)習(xí)掌握覆蓋問(wèn)題的解決方法運(yùn)用基本路徑測(cè)試方法進(jìn)行實(shí)際程序測(cè)試本章教學(xué)目標(biāo)理論環(huán)節(jié)3.1白盒測(cè)試方法為什么要進(jìn)行白盒測(cè)試?如果所有軟件錯(cuò)誤的根源都可以追溯到某個(gè)唯一原因,那么問(wèn)題就簡(jiǎn)單了。然而,事實(shí)上一個(gè)bug常常是由多個(gè)因素共同導(dǎo)致的,如下圖所示。假設(shè)此時(shí)開(kāi)發(fā)工作已結(jié)束,程序送交到測(cè)試組,沒(méi)有人知道代碼中有一個(gè)潛在的被0除的錯(cuò)誤。若測(cè)試組采用的測(cè)試用例的執(zhí)行路徑?jīng)]有同時(shí)經(jīng)過(guò)x=0和y=5/x進(jìn)行測(cè)試,顯然測(cè)試工作似乎非常完善,測(cè)試用例覆蓋了所有執(zhí)行語(yǔ)句,也沒(méi)有被0除的錯(cuò)誤發(fā)生。3.1白盒測(cè)試方法為什么要進(jìn)行白盒測(cè)試?假白盒測(cè)試方法(續(xù))白盒測(cè)試也稱結(jié)構(gòu)測(cè)試或邏輯驅(qū)動(dòng)測(cè)試,是針對(duì)被測(cè)單元內(nèi)部是如何進(jìn)行工作的測(cè)試。它根據(jù)程序的控制結(jié)構(gòu)設(shè)計(jì)測(cè)試用例。白盒測(cè)試法檢查程序內(nèi)部邏輯結(jié)構(gòu),對(duì)所有邏輯路徑進(jìn)行測(cè)試,是一種窮舉路徑的測(cè)試方法。但即使每條路徑都測(cè)試過(guò)了,仍然可能存在錯(cuò)誤。因?yàn)椋焊F舉路徑測(cè)試無(wú)法檢查出程序本身是否違反了設(shè)計(jì)規(guī)范,即程序是否是一個(gè)錯(cuò)誤的程序。窮舉路徑測(cè)試不可能查出程序因?yàn)檫z漏路徑而出錯(cuò)。窮舉路徑測(cè)試發(fā)現(xiàn)不了一些與數(shù)據(jù)相關(guān)的錯(cuò)誤。白盒測(cè)試方法(續(xù))白盒測(cè)試也稱結(jié)構(gòu)測(cè)試或邏輯驅(qū)動(dòng)測(cè)試,是針對(duì)白盒測(cè)試方法(續(xù))采用白盒測(cè)試方法必須遵循以下幾條原則,才能達(dá)到測(cè)試的目的:保證一個(gè)模塊中的所有獨(dú)立路徑至少被測(cè)試一次。所有邏輯值均需測(cè)試真(true)和假(false)兩種情況。檢查程序的內(nèi)部數(shù)據(jù)結(jié)構(gòu),保證其結(jié)構(gòu)的有效性。在上下邊界及可操作范圍內(nèi)運(yùn)行所有循環(huán)。白盒測(cè)試方法(續(xù))采用白盒測(cè)試方法必須遵循以下幾條原則,才能白盒測(cè)試常用的測(cè)試用例設(shè)計(jì)方法邏輯覆蓋以程序內(nèi)部的邏輯結(jié)構(gòu)為基礎(chǔ);根據(jù)覆蓋測(cè)試的目標(biāo),邏輯覆蓋分為:語(yǔ)句、判定、條件、判定/條件、組合、路徑基本路徑測(cè)試為了解決路徑龐大難題;在程序控制流程圖的基礎(chǔ)上,分析控制構(gòu)造的環(huán)路復(fù)雜性,導(dǎo)出基本可執(zhí)行路徑集合,設(shè)計(jì)測(cè)試用例的方法。白盒測(cè)試常用的測(cè)試用例設(shè)計(jì)方法邏輯覆蓋3.3控制流圖控制流圖(可簡(jiǎn)稱流圖)是對(duì)程序流程圖進(jìn)行簡(jiǎn)化后得到的,它可以更加突出的表示程序控制流的結(jié)構(gòu),唯一的??刂屏鲌D中包括兩種圖形符號(hào):節(jié)點(diǎn)和控制流線。節(jié)點(diǎn)由帶標(biāo)號(hào)的圓圈表示,可代表一個(gè)或多個(gè)語(yǔ)句、一個(gè)處理框序列和一個(gè)條件判定框(假設(shè)不包含復(fù)合條件)。控制流線由帶箭頭的弧或線表示,可稱為邊。它代表程序中的控制流。對(duì)于復(fù)合條件,則可將其分解為多個(gè)單個(gè)條件,并映射成控制流圖。常見(jiàn)結(jié)構(gòu)的控制流圖3.3控制流圖控制流圖(可簡(jiǎn)稱流圖)是對(duì)程序流程圖進(jìn)行簡(jiǎn)化常見(jiàn)結(jié)構(gòu)的控制流圖其中,包含條件的節(jié)點(diǎn)被稱為判定節(jié)點(diǎn)(也叫謂詞節(jié)點(diǎn)),由判定節(jié)點(diǎn)發(fā)出的邊必須終止于某一個(gè)節(jié)點(diǎn),由邊和節(jié)點(diǎn)所限定的范圍被稱為區(qū)域。常見(jiàn)結(jié)構(gòu)的控制流圖其中,包含條件的節(jié)點(diǎn)被稱為判定節(jié)點(diǎn)(也叫謂軟件測(cè)試-3白盒測(cè)試及其用例的設(shè)計(jì)課件軟件測(cè)試-3白盒測(cè)試及其用例的設(shè)計(jì)課件轉(zhuǎn)化程序流程圖為控制流圖
A>1and
B=0
X=X/A
1
2
3
A>1
B=0
X=X/A
2
3
1
4
YYY轉(zhuǎn)化程序流程圖為控制流圖A>1andB=0X=X/3.3覆蓋測(cè)試3.4.1測(cè)試覆蓋率3.4.2邏輯覆蓋法3.4.3功能覆蓋3.4.4其他覆蓋3.4.5如何使用覆蓋率3.4.6測(cè)試覆蓋準(zhǔn)則3.3覆蓋測(cè)試3.4.1測(cè)試覆蓋率結(jié)構(gòu)測(cè)試中的一個(gè)重要問(wèn)題是,測(cè)試進(jìn)行到什么地步就達(dá)到要求,可以結(jié)束測(cè)試。這需要給出結(jié)構(gòu)測(cè)試的覆蓋準(zhǔn)則。結(jié)構(gòu)測(cè)試中的一個(gè)重要問(wèn)題是,測(cè)試進(jìn)行到什么地步就達(dá)到要求,可3.3.1測(cè)試覆蓋率測(cè)試覆蓋率:用于確定測(cè)試所執(zhí)行到的覆蓋項(xiàng)的百分比。其中的覆蓋項(xiàng)是指作為測(cè)試基礎(chǔ)的一個(gè)入口或?qū)傩裕热缯Z(yǔ)句、分支、條件等。通過(guò)覆蓋率數(shù)據(jù)可以知道測(cè)試得是否充分,測(cè)試的弱點(diǎn)在哪些方面,從而指導(dǎo)我們?cè)O(shè)計(jì)能夠增加覆蓋率的測(cè)試用例。能夠有效地提高測(cè)試質(zhì)量,避免設(shè)計(jì)無(wú)效用例。在測(cè)試分析報(bào)告中可以作為量化指標(biāo)的依據(jù),測(cè)試覆蓋率越高效果越好。但覆蓋率不是目標(biāo),只是一種手段。3.3.1測(cè)試覆蓋率測(cè)試覆蓋率:用于確定測(cè)試所執(zhí)行到的覆覆蓋率概念覆蓋率是用來(lái)度量測(cè)試完整性的一個(gè)手段。本身并不包含測(cè)試技術(shù),只是測(cè)試技術(shù)有效性的一個(gè)度量。
覆蓋率種類:邏輯覆蓋(LogicalCoverage),也叫:代碼覆蓋率(CodeCoverage)結(jié)構(gòu)化覆蓋率(StructuralCoverage)功能覆蓋(FunctionCoverage)。
覆蓋率概念覆蓋率是用來(lái)度量測(cè)試完整性的一個(gè)手段。本身3.3.2邏輯覆蓋法根據(jù)覆蓋目標(biāo)的不同,邏輯覆蓋可分為語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。語(yǔ)句覆蓋:選擇若干個(gè)測(cè)試用例,運(yùn)行被測(cè)程序,使得程序中的每個(gè)可執(zhí)行語(yǔ)句至少執(zhí)行一次。覆蓋指標(biāo)C0判定覆蓋(分支覆蓋):選擇若干個(gè)測(cè)試用例,運(yùn)行被測(cè)程序,使得程序中的每個(gè)判斷真假值均曾被滿足,也就是使程序中的每個(gè)取“真”分支和取“假”分支至少均經(jīng)歷一次。覆蓋指標(biāo)C1條件覆蓋:選擇若干個(gè)測(cè)試用例,運(yùn)行被測(cè)程序,使得程序中每個(gè)判定包含的每個(gè)條件的可能取值(真/假)都至少滿足一次。3.3.2邏輯覆蓋法根據(jù)覆蓋目標(biāo)的不同,邏輯覆蓋可分為語(yǔ)邏輯覆蓋法(續(xù))判定-條件覆蓋:設(shè)計(jì)足夠多的測(cè)試用例,使得程序中每個(gè)判定包含的每個(gè)條件的所有情況(真/假)至少出現(xiàn)一次,并且每個(gè)判定本身的判定結(jié)果(真/假)也至少出現(xiàn)一次?!獫M足判定-條件覆蓋的測(cè)試用例一定同時(shí)滿足判定覆蓋和條件覆蓋。組合覆蓋:通過(guò)執(zhí)行足夠的測(cè)試用例,使得程序中每個(gè)判定的所有可能的條件取值組合都至少出現(xiàn)一次。覆蓋指標(biāo)CMCC
——滿足組合覆蓋的測(cè)試用例一定滿足判定覆蓋、條件覆蓋和判定-條件覆蓋。路徑覆蓋:設(shè)計(jì)足夠多的測(cè)試用例,要求覆蓋程序中所有可能的路徑。覆蓋指標(biāo)C∞邏輯覆蓋法(續(xù))判定-條件覆蓋:設(shè)計(jì)足夠多的測(cè)試用例,使得程邏輯覆蓋法(續(xù))組合覆蓋判定-條件覆蓋判定覆蓋條件覆蓋語(yǔ)句覆蓋邏輯覆蓋法(續(xù))組合覆蓋判定-條件覆蓋判定覆蓋條件覆蓋語(yǔ)句覆邏輯覆蓋法(續(xù))voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;j=sqrt(k);}//語(yǔ)句塊1if((x==4)||(y>5)){j=x*y+10;}//語(yǔ)句塊2
j=j%3;//語(yǔ)句塊3}邏輯覆蓋法(續(xù))voidDoWork(intx,in邏輯覆蓋法(續(xù))X>3&&z<10執(zhí)行語(yǔ)句塊1執(zhí)行語(yǔ)句塊2X==4||y>5執(zhí)行語(yǔ)句塊3FFTTabdce邏輯覆蓋法(續(xù))X>3&&z<10執(zhí)行語(yǔ)句塊1執(zhí)行語(yǔ)句塊語(yǔ)句覆蓋要實(shí)現(xiàn)DoWork函數(shù)的語(yǔ)句覆蓋,只需設(shè)計(jì)一個(gè)測(cè)試用例就可以覆蓋程序中的所有可執(zhí)行語(yǔ)句。測(cè)試用例輸入為:{x=4、y=5、z=5}程序執(zhí)行的路徑是:abd分析:語(yǔ)句覆蓋可以保證程序中的每個(gè)語(yǔ)句都得到執(zhí)行,但發(fā)現(xiàn)不了判定中邏輯運(yùn)算的錯(cuò)誤,即它并不是一種充分的檢驗(yàn)方法。例如在第一個(gè)判定((x>3)&&(z<10))中把“&&”錯(cuò)誤的寫(xiě)成了“||”,這時(shí)仍使用該測(cè)試用例,則程序仍會(huì)按照流程圖上的路徑abd執(zhí)行??梢哉f(shuō)語(yǔ)句覆蓋是最弱的邏輯覆蓋準(zhǔn)則。語(yǔ)句覆蓋要實(shí)現(xiàn)DoWork函數(shù)的語(yǔ)句覆蓋,只需設(shè)計(jì)一個(gè)測(cè)試用判定覆蓋注:教材中又稱為DD-路徑覆蓋,測(cè)試滿足DD-路徑覆蓋要求可以發(fā)現(xiàn)全部缺陷的85%要實(shí)現(xiàn)DoWork函數(shù)的判定覆蓋,需要設(shè)計(jì)兩個(gè)測(cè)試用例。測(cè)試用例的輸入為:{x=4、y=5、z=5};{x=2、y=5、z=5}程序執(zhí)行的路徑分別是:abd;ace分析:上述兩個(gè)測(cè)試用例不僅滿足了判定覆蓋,同時(shí)還做到語(yǔ)句覆蓋。從這點(diǎn)看似乎判定覆蓋比語(yǔ)句覆蓋更強(qiáng)一些,但仍然無(wú)法確定判定內(nèi)部條件的錯(cuò)誤。例如把第二個(gè)判定中的條件y>5錯(cuò)誤寫(xiě)為y<5,使用上述測(cè)試用例,照樣能按原路徑執(zhí)行而不影響結(jié)果。因此,需要有更強(qiáng)的邏輯覆蓋準(zhǔn)則去檢驗(yàn)判定內(nèi)的條件。判定覆蓋注:教材中又稱為DD-路徑覆蓋,測(cè)試滿足DD-路徑覆判定覆蓋(續(xù))13524說(shuō)明:以上僅考慮了兩出口的判斷,我們還應(yīng)把判定覆蓋準(zhǔn)則擴(kuò)充到多出口判斷(如Case語(yǔ)句)的情況。因此,判定覆蓋更為廣泛的含義應(yīng)該是使得每一個(gè)判定獲得每一種可能的結(jié)果至少一次。6789105’判定覆蓋(續(xù))13524說(shuō)明:以上僅考慮了兩出口的判斷,我們條件覆蓋在實(shí)際程序代碼中,一個(gè)判定中通常都包含若干條件。條件覆蓋的目的是設(shè)計(jì)若干測(cè)試用例,在執(zhí)行被測(cè)程序后,要使每個(gè)判定中每個(gè)條件的可能值至少滿足一次。對(duì)DoWork函數(shù)的各個(gè)判定的各種條件取值加以標(biāo)記。對(duì)于第一個(gè)判定((x>3)&&(z<10)): 條件x>3取真值記為T1,取假值記為-T1
條件z<10取真值記為T2,取假值記為-T2對(duì)于第二個(gè)判定((x==4)||(y>5)):條件x==4取真值記為T3,取假值記為-T3條件y>5取真值記為T4,取假值記為-T4條件覆蓋在實(shí)際程序代碼中,一個(gè)判定中通常都包含若干條件。條條件覆蓋(續(xù))根據(jù)條件覆蓋的基本思想,要使上述4個(gè)條件可能產(chǎn)生的8種情況至少滿足一次,設(shè)計(jì)測(cè)試用例如下:分析:上面這組測(cè)試用例不但覆蓋了4個(gè)條件的全部8種情況,而且將兩個(gè)判定的4個(gè)分支b、c、d、e也同時(shí)覆蓋了,即同時(shí)達(dá)到了條件覆蓋和判定覆蓋。條件覆蓋(續(xù))根據(jù)條件覆蓋的基本思想,要使上述4個(gè)條件可能產(chǎn)條件覆蓋(續(xù))說(shuō)明:雖然前面的一組測(cè)試用例同時(shí)達(dá)到了條件覆蓋和判定覆蓋,但是,并不是說(shuō)滿足條件覆蓋就一定能滿足判定覆蓋。如果設(shè)計(jì)了下表中的這組測(cè)試用例,則雖然滿足了條件覆蓋,但只是覆蓋了程序中第一個(gè)判定的取假分支c和第二個(gè)判定的取真分支d,不滿足判定覆蓋的要求。條件覆蓋(續(xù))說(shuō)明:雖然前面的一組測(cè)試用例同時(shí)達(dá)到了條件覆蓋判定-條件覆蓋判定-條件覆蓋實(shí)際上是將判定覆蓋和條件覆蓋結(jié)合起來(lái)的一種方法,即:設(shè)計(jì)足夠的測(cè)試用例,使得判定中每個(gè)條件的所有可能取值至少滿足一次,同時(shí)每個(gè)判定的可能結(jié)果也至少出現(xiàn)一次。根據(jù)判定-條件覆蓋的基本思想,只需設(shè)計(jì)以下兩個(gè)測(cè)試用例便可以覆蓋4個(gè)條件的8種取值以及4個(gè)判定分支。判定-條件覆蓋判定-條件覆蓋實(shí)際上是將判定覆蓋和條件覆蓋結(jié)合判定-條件覆蓋(續(xù))分析:從表面上看,判定-條件覆蓋測(cè)試了各個(gè)判定中的所有條件的取值,但實(shí)際上,編譯器在檢查含有多個(gè)條件的邏輯表達(dá)式時(shí),某些情況下的某些條件將會(huì)被其它條件所掩蓋。因此,判定-條件覆蓋也不一定能夠完全檢查出邏輯表達(dá)式中的錯(cuò)誤。例如:對(duì)于第一個(gè)判定(x>3)&&(z<10)來(lái)說(shuō),必須x>3和z<10這兩個(gè)條件同時(shí)滿足才能確定該判定為真。如果x>3為假,則編譯器將不再檢查z<10這個(gè)條件,那么即使這個(gè)條件有錯(cuò)也無(wú)法被發(fā)現(xiàn)。對(duì)于第二個(gè)判定(x==4)||(y>5)來(lái)說(shuō),若條件x==4滿足,就認(rèn)為該判定為真,這時(shí)將不會(huì)再檢查y>5,那么同樣也無(wú)法發(fā)現(xiàn)這個(gè)條件中的錯(cuò)誤。判定-條件覆蓋(續(xù))分析:從表面上看,判定-條件覆蓋測(cè)試了各組合覆蓋組合覆蓋的目的是要使設(shè)計(jì)的測(cè)試用例能覆蓋每一個(gè)判定的所有可能的條件取值組合。對(duì)DoWork函數(shù)中的各個(gè)判定的條件取值組合加以標(biāo)記:1、x>3,z<10記做T1T2,第一個(gè)判定的取真分支2、x>3,z>=10記做T1-T2,第一個(gè)判定的取假分支3、x<=3,z<10記做-T1T2,第一個(gè)判定的取假分支4、x<=3,z>=10記做-T1-T2,第一個(gè)判定的取假分支5、x==4,y>5記做T3T4,第二個(gè)判定的取真分支6、x==4,y<=5記做T3-T4,第二個(gè)判定的取真分支7、x!=4,y>5記做-T3T4,第二個(gè)判定的取真分支8、x!=4,y<=5記做-T3-T4,第二個(gè)判定的取假分支組合覆蓋組合覆蓋的目的是要使設(shè)計(jì)的測(cè)試用例能覆蓋每一個(gè)判定的組合覆蓋(續(xù))根據(jù)組合覆蓋的基本思想,設(shè)計(jì)測(cè)試用例如下:分析:上面這組測(cè)試用例覆蓋了所有8種條件取值的組合,覆蓋了所有判定的真假分支,但是卻丟失了一條路徑abe。組合覆蓋(續(xù))根據(jù)組合覆蓋的基本思想,設(shè)計(jì)測(cè)試用例如下:分析路徑覆蓋前面提到的5種邏輯覆蓋都未涉及到路徑的覆蓋。事實(shí)上,只有當(dāng)程序中的每一條路徑都受到了檢驗(yàn),才能使程序受到全面檢驗(yàn)。路徑覆蓋的目的就是要使設(shè)計(jì)的測(cè)試用例能覆蓋被測(cè)程序中所有可能的路徑。根據(jù)路徑覆蓋的基本思想,在滿足組合覆蓋的測(cè)試用例中修改其中一個(gè)測(cè)試用例,則可以實(shí)現(xiàn)路徑覆蓋:路徑覆蓋前面提到的5種邏輯覆蓋都未涉及到路徑的覆蓋。事實(shí)上,路徑覆蓋(續(xù))分析:雖然前面一組測(cè)試用例滿足了路徑覆蓋,但并沒(méi)有覆蓋程序中所有的條件組合(丟失了組合3和7),即滿足路徑覆蓋的測(cè)試用例并不一定滿足組合覆蓋。說(shuō)明:對(duì)于比較簡(jiǎn)單的小程序,實(shí)現(xiàn)路徑覆蓋是可能做到的。但如果程序中出現(xiàn)較多判斷和較多循環(huán),可能的路徑數(shù)目將會(huì)急劇增長(zhǎng),要在測(cè)試中覆蓋所有的路徑是無(wú)法實(shí)現(xiàn)的。為了解決這個(gè)難題,只有把覆蓋路徑數(shù)量壓縮到一定的限度內(nèi),如程序中的循環(huán)體只執(zhí)行一次。在實(shí)際測(cè)試中,即使對(duì)于路徑數(shù)很有限的程序已經(jīng)做到路徑覆蓋,仍然不能保證被測(cè)試程序的正確性。路徑覆蓋(續(xù))分析:雖然前面一組測(cè)試用例滿足了路徑覆蓋,但并邏輯覆蓋小結(jié)各種結(jié)構(gòu)測(cè)試方法都不能保證程序的正確性。測(cè)試的目的并非要證明程序的正確性,而是要盡可能找出程序中的錯(cuò)誤。邏輯覆蓋率可以作為測(cè)試完整性的一個(gè)度量。即使達(dá)到100%的邏輯覆蓋率,仍然無(wú)法保證程序的正確性;確實(shí)并不存在一種十全十美的測(cè)試方法,能夠發(fā)現(xiàn)所有的錯(cuò)誤。邏輯覆蓋小結(jié)各種結(jié)構(gòu)測(cè)試方法都不能保證程序的正確性。3.4.3功能覆蓋 功能覆蓋屬于黑盒測(cè)試范疇。常見(jiàn)的是需求覆蓋和接口覆蓋。
需求覆蓋:通過(guò)設(shè)計(jì)一定的測(cè)試用例,要求每個(gè)需求點(diǎn)都被測(cè)試到。
接口覆蓋:也叫入口點(diǎn)覆蓋,接口覆蓋要求通過(guò)設(shè)計(jì)一定的用例使系統(tǒng)的每個(gè)接口都被測(cè)試到。
3.4.3功能覆蓋 功能覆蓋屬于黑盒測(cè)試范疇。常見(jiàn)的是需求3.4.4其他覆蓋率函數(shù)覆蓋定義:在測(cè)試中有哪些函數(shù)被測(cè)試到了,其被測(cè)試到的頻率有多大,這些函數(shù)在系統(tǒng)所有函數(shù)中占的比例有多大。是針對(duì)系統(tǒng)或一個(gè)子系統(tǒng)而測(cè)試的;比較容易自動(dòng)化(TrueCoveragePureCoverage);易于理解。指令塊覆蓋是語(yǔ)句覆蓋的一個(gè)變體。3.4.4其他覆蓋率函數(shù)覆蓋3.4.5如何使用覆蓋率 在選擇和使用覆蓋率時(shí),必須遵循的基本原則:覆蓋率不是目的,只是一種手段;不可能針對(duì)所有的覆蓋率指標(biāo)去進(jìn)行測(cè)試;只考慮一種覆蓋率指標(biāo)也是不恰當(dāng)?shù)?;不要追求絕對(duì)100%的覆蓋率。3.4.5如何使用覆蓋率 在選擇和使用覆蓋率時(shí),必須遵循評(píng)價(jià)標(biāo)準(zhǔn)覆蓋率度量覆蓋率評(píng)價(jià)表評(píng)價(jià)標(biāo)準(zhǔn)覆蓋覆蓋率評(píng)價(jià)表課堂練習(xí)為以下流程圖所示的程序段設(shè)計(jì)一組測(cè)試用例,要求分別滿足語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定-條件覆蓋、組合覆蓋和路徑覆蓋。(A>1)and(B=0)(A=2)or(X>1)X=X/AX=X+1TTFFbdcea課堂練習(xí)為以下流程圖所示的程序段設(shè)計(jì)一組測(cè)試用例,要求分別滿A=2,B=0,X=4(沿路徑ace執(zhí)行);語(yǔ)句覆蓋測(cè)試用例A=2,B=0,X=4(沿路徑ace執(zhí)行);語(yǔ)句覆蓋測(cè)試用A=3,B=0,X=3(acd);A=2,B=1,X=1(abe);aa判定覆蓋測(cè)試用例A=3,B=0,X=3(acd);A=2,B=1,X=1A=2,B=1,X=1(abe);A=1,B=0,X=3(abe);條件覆蓋測(cè)試用例A=2,B=1,X=1(abe);A=1,B=0,X=3判定-條件覆蓋測(cè)試用例判定-條件覆蓋測(cè)試用例判定條件的8種組合:A>1,B=0記為T1,T2;A>1,B<>0記為T1,F(xiàn)2;A<=1,B=0記為F1,T2;A<=1,B<>0記為F1,F(xiàn)2;A=2,X>1記為T3,T4;A=2,X<=1記為T3,F(xiàn)4;A<>2,X>1記為F3,T4;A<>2,X<=1記為F3,F(xiàn)4;判定條件的8種組合:組合覆蓋測(cè)試用例組合覆蓋測(cè)試用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abe)組合覆蓋測(cè)試用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abA=1,B=1,X=1(abd)A=1,B=0,X=3(abe)組合覆蓋測(cè)試用例A=1,B=1,X=1(abd)A=1,B=0,X=3(ab路徑覆蓋測(cè)試用例路徑覆蓋測(cè)試用例3.7數(shù)據(jù)流測(cè)試數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目標(biāo)碼而出現(xiàn)的,這類方法主要用于代碼優(yōu)化。近年來(lái)在測(cè)試中也得到成功運(yùn)用,查找引用未定義變量等程序錯(cuò)誤,查找對(duì)以前未曾使用的變量再次賦值等數(shù)據(jù)流異常的情況。這常常是常見(jiàn)程序錯(cuò)誤的表現(xiàn)形式,如:錯(cuò)拼名字、名字混淆或丟失了語(yǔ)句。3.7數(shù)據(jù)流測(cè)試數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目數(shù)據(jù)流測(cè)試關(guān)注變量定義賦值點(diǎn)(語(yǔ)句)和引用或使用這些值的點(diǎn)(語(yǔ)句)的結(jié)構(gòu)性測(cè)試。用作路徑測(cè)試的真實(shí)性檢查。程序和程序的元素通過(guò)它們的數(shù)據(jù)訪問(wèn)行為關(guān)聯(lián)起來(lái),確定了數(shù)據(jù)流關(guān)系。數(shù)據(jù)流測(cè)試形式:定義/使用測(cè)試基于程序片的測(cè)試定義/使用路徑和片的定義能夠非常準(zhǔn)確地描述要測(cè)試的程序部分?jǐn)?shù)據(jù)流測(cè)試關(guān)注變量定義賦值點(diǎn)(語(yǔ)句)和引用或使用這些值的點(diǎn)(常見(jiàn)的數(shù)據(jù)流異常包括:變量被定義,但是從來(lái)沒(méi)有使用;所使用的變量沒(méi)有被定義;變量在使用之前被定義兩次;等待一個(gè)還沒(méi)有被安排的進(jìn)程;安排一個(gè)與其自身相同的進(jìn)程;等待一個(gè)先前已經(jīng)被中止了的進(jìn)程;引用一個(gè)在并行進(jìn)程中被定義的變量;引用一個(gè)值不確定的變量。這些異常通過(guò)靜態(tài)分析發(fā)現(xiàn)常見(jiàn)的數(shù)據(jù)流異常包括:舉例:程序Main:program:declareintegerx,y;declarebooleanflag;T1:task;writex;waitforT3;closeT1;T2:task;x=5;y=6;closeT2;T3:task;readx;closeT3;scheduleT1;scheduleT2;readflag;ifflagthenx=8;writex;y=9;waitforT2;ifflagtheny=10;writey;waitforT2;scheduleT1;closeMain;舉例:程序Main:program:schedule數(shù)據(jù)流圖(1)Main:Program(15)scheduleT1(16)scheduleT2(17)defflag(18)ifflagthendefx(19)refx(20)defy(21)waitforT2(22)ifflag(23)refy(24)waitforT2(25)scheduleT1(26)closeMainthendefy(8)T2:task(4)T1:task(12)T3:task(13)defx(14)closeT3(5)refx(6)waitforT3(7)closeT1(9)defx(10)defy(11)closeT2數(shù)據(jù)流圖(1)Main:Program(15)sched可能的異常變量x在語(yǔ)句第5行處的引用可能沒(méi)有被定義,這是因?yàn)槿蝿?wù)T1可能在任務(wù)T2開(kāi)始前結(jié)束;在任務(wù)T2(第10行)以及主程序第20行發(fā)現(xiàn)的變量y的定義可能沒(méi)有用,這是因?yàn)閥會(huì)在其可能被引用前在第22行被重新定義;y被兩個(gè)可能并行執(zhí)行的進(jìn)程定義,并且這樣在第23行的引用其值可能是無(wú)法確定的;變量x在任務(wù)T2(第9行)被賦了一個(gè)值,然而,同時(shí)又在主程序第19行處被引用;可能的異常變量x在語(yǔ)句第5行處的引用可能沒(méi)有被定義,這是因?yàn)榭赡艿漠惓#ɡm(xù))存在這樣一個(gè)可能性,即T1可能在第25行被并行安排,因?yàn)闆](méi)有任何保證T1在最初被安排后會(huì)終結(jié);第24行的等待是沒(méi)有必要的,因?yàn)門2被保證在第21行終結(jié),并且隨后沒(méi)有再被安排過(guò);第6行的等待永遠(yuǎn)不會(huì)被滿足,因?yàn)門3從來(lái)沒(méi)有被安排過(guò)。可能的異常(續(xù))存在這樣一個(gè)可能性,即T1可能在第25行被并例如例如第一個(gè)語(yǔ)句定義3個(gè)變量X,Y和Z;表明它們的值是程序外賦給的。出口語(yǔ)句引用Z,表明Z的值被送給外部環(huán)境。第一個(gè)語(yǔ)句定義3個(gè)變量X,Y和Z;表明它們的值是程序外賦給的該程序含有2個(gè)錯(cuò)誤:語(yǔ)句2使用了變量W,而在此之前未定義;語(yǔ)句5、6使用變量V,這在第一次執(zhí)行循環(huán)時(shí)也未對(duì)其定義過(guò)。該程序還包含兩個(gè)異常:語(yǔ)句6對(duì)Z的定義從未使用過(guò);語(yǔ)句8對(duì)W的定義也從未使用過(guò)。可以把程序?qū)懙酶菀桌斫?,從而能夠?jiǎn)化驗(yàn)證工作,以及隨后的維護(hù)工作。該程序含有2個(gè)錯(cuò)誤:該方法提供一種檢查缺陷可能發(fā)生點(diǎn)的嚴(yán)格和系統(tǒng)化方法。假設(shè)程序圖中的節(jié)點(diǎn)代表語(yǔ)句片段,且程序遵循結(jié)構(gòu)化程序設(shè)計(jì)規(guī)則,不允許有從節(jié)點(diǎn)到自身的邊。P——程序G(P)——P的程序圖V——P的一組程序變量,v——P的變量PATHS(P)——P中所有路徑集合3.7.1定義/使用測(cè)試該方法提供一種檢查缺陷可能發(fā)生點(diǎn)的嚴(yán)格和系統(tǒng)化方法。3.7.v的定義節(jié)點(diǎn)n∈G(P):當(dāng)且僅當(dāng)v的值由對(duì)應(yīng)節(jié)點(diǎn)n的語(yǔ)句片段處定義,DEF(v,n)v的使用節(jié)點(diǎn)n∈G(P):當(dāng)且僅當(dāng)v的值由對(duì)應(yīng)節(jié)點(diǎn)n的語(yǔ)句片段處使用,USE(v,n)USE(v,n)是謂詞使用(P-use,外度≥2):當(dāng)且僅當(dāng)語(yǔ)句n是謂詞語(yǔ)句,否則是計(jì)算使用(C-use,外度≤1)。定義v的定義節(jié)點(diǎn)n∈G(P):當(dāng)且僅當(dāng)v的值由對(duì)應(yīng)節(jié)點(diǎn)n的語(yǔ)句X:=Y(jié)+ZIfY>ZthengotoexitREADX//輸入語(yǔ)句WRITEX//輸出語(yǔ)句X:=Y(jié)+Zv的定義-使用路徑(du-path):PATHS(P)中的路徑,使對(duì)v∈V,存在DEF(v,m)和USE(v,n),m,n分別為路徑的最初和最終節(jié)點(diǎn)v的定義-清除路徑(dc-path):PATHS(P)中的具有最初DEF(v,m)和最終節(jié)點(diǎn)USE(v,n)的路徑,該路徑中沒(méi)有其它節(jié)點(diǎn)是v的定義節(jié)點(diǎn)。注意:不是定義-清除的定義-使用路徑,可能是出問(wèn)題的地方。v的定義-使用路徑(du-path):PATHS(P)中的舉例(傭金問(wèn)題)偽代碼、程序圖、DD路徑表、DD-路徑圖變量定義節(jié)點(diǎn)和使用節(jié)點(diǎn)(表10-2)舉例(傭金問(wèn)題)部分變量的定義/使用路徑(表10-3)stocks的定義/使用路徑(1╳1)locks的定義/使用路徑(2╳2)totallocks的定義/使用路徑(2╳3)sales的定義/使用路徑(1╳6)commission的定義/使用路徑(6╳4)注意:機(jī)械組合的物理路徑邏輯上不一定可行部分變量的定義/使用路徑(表10-3)如:commission的定義-使用路徑31,37;32,37;33,32;33,37;36,32;36,33;37,32;37,33;38,32;38,33;38,37都不可行如:commission的定義-使用路徑31,37;32,3全定義準(zhǔn)則:當(dāng)且僅當(dāng)T包含從所有v的每個(gè)定義節(jié)點(diǎn)到v的一個(gè)使用的定義清除路徑全使用準(zhǔn)則:當(dāng)且僅當(dāng)T包含從所有v的每個(gè)定義節(jié)點(diǎn)到v的所有使用,以及到所有USE(v,n)后續(xù)節(jié)點(diǎn)的定義清除路徑定義/使用路徑測(cè)試覆蓋指標(biāo)假設(shè):定義/使用路徑均可行;T:擁有變量集合V的程序P的程序圖G(P)中的一個(gè)路徑集合全定義準(zhǔn)則:定義/使用路徑測(cè)試覆蓋指標(biāo)全謂詞使用/部分計(jì)算使用準(zhǔn)則: 當(dāng)且僅當(dāng)T包含從所有v的每個(gè)定義節(jié)點(diǎn)到v的所有謂詞使用的定義清除路徑,如果v的一個(gè)定義沒(méi)有謂詞使用,則定義清除路徑導(dǎo)致至少一個(gè)計(jì)算使用全計(jì)算使用/部分謂詞使用準(zhǔn)則: 當(dāng)且僅當(dāng)T包含從所有v的每個(gè)定義節(jié)點(diǎn)到v的所有計(jì)算使用的定義清除路徑,如果v的一個(gè)定義沒(méi)有計(jì)算使用,則定義清除路徑導(dǎo)致至少一個(gè)謂詞使用全謂詞使用/部分計(jì)算使用準(zhǔn)則:全定義-使用路徑準(zhǔn)則: 當(dāng)且僅當(dāng)T包含從所有v的每個(gè)定義節(jié)點(diǎn)到v的 所有使用,以及到所有USE(v,n)后續(xù)節(jié)點(diǎn)的定義清除路徑,并且這些路徑要么有一次環(huán)路經(jīng)過(guò),要么沒(méi)有環(huán)路。
定義/使用路徑測(cè)試覆蓋指標(biāo)以上面5種情況為依據(jù)選擇路徑的集合,這些指標(biāo)的關(guān)系如下:全定義-使用路徑準(zhǔn)則:定義/使用路徑測(cè)試覆蓋指標(biāo)關(guān)系全路徑全定義-使用路徑全使用全計(jì)算使用/部分謂詞使用全謂詞使用/部分計(jì)算使用全定義全謂詞使用全邊全節(jié)點(diǎn)高低定義/使用路徑測(cè)試覆蓋指標(biāo)關(guān)系全路徑全定義-使用路徑全使用全程序片是確定或影響某個(gè)變量在程序某個(gè)點(diǎn)上的取值的一組程序語(yǔ)句;片測(cè)試可以消除變量之間的交互對(duì)測(cè)試的影響;片測(cè)試的原則是選擇恰當(dāng),完整的片,對(duì)每個(gè)片進(jìn)行測(cè)試。3.7.2基于程序片的測(cè)試3.7.2基于程序片的測(cè)試定義:P中對(duì)V中的變量值作出貢獻(xiàn)的所有語(yǔ)句的集合,即V在語(yǔ)句n上的一個(gè)片,S(V,n)或P中在n以前對(duì)V中的變量值作出貢獻(xiàn)的所有語(yǔ)句片段編號(hào)的集合,即V在語(yǔ)句片段n上的一個(gè)片,S(V,n)程序片程序片片和貢獻(xiàn)的含義片:將程序分為具有某種功能/含義的組件;貢獻(xiàn)(USE):
謂詞使用用在謂詞(判斷)中 計(jì)算使用用在計(jì)算中 輸出使用用于輸出 定位使用用于定位(指針、下標(biāo)) 迭代使用迭代(內(nèi)部計(jì)數(shù)器、循環(huán)指示) 輸入定義通過(guò)輸入定義 賦值定義通過(guò)賦值定義片內(nèi)語(yǔ)句片斷選擇原則:包含和不包含該語(yǔ)句片段,變量v取值不同片和貢獻(xiàn)的含義舉例1begin2read(x,y);3total:=0.0;4sum:=0.0;5ifx<=16thensum:=y7elsebegin8read(z);9total:=x*y10end;11write(total,sum)12end舉例1begin第一個(gè)切片1begin2read(x,y);3total:=0.0;4sum:=0.0;5ifx<=16thensum:=y7elsebegin8read(z);9total:=x*y10end;11write(total,sum)12end1begin2read(x,y);5ifx<=16then7elsebegin8read(z);10end;12end變量z的值在語(yǔ)句12的切片:第一個(gè)切片1begin1begin變量z的值在語(yǔ)句1第二個(gè)切片1begin2read(x,y);3total:=0.0;4sum:=0.0;5ifx<=16thensum:=y7elsebegin8read(z);9total:=x*y10end;11write(total,sum)12end1begin2read(x,y);3total:=0.0;5ifx<=16then7elsebegin9total:=x*y10end;12end變量total的值在語(yǔ)句12的切片:第二個(gè)切片1begin1begin變量total的值補(bǔ)充:程序分析技術(shù)1.程序插裝2.故障插入3.程序變異補(bǔ)充:程序分析技術(shù)1.程序插裝程序插裝(ProgramInstrumentation)是一種基本的測(cè)試手段,在軟件測(cè)試中有著廣泛的應(yīng)用。程序插裝(ProgramInstrumentation)是1.程序插裝定義:是借助向被測(cè)程序中插入操作來(lái)實(shí)現(xiàn)測(cè)試目的的方法。好處:能夠按用戶的要求,獲取程序的各種信息,成為測(cè)試工作的有效手段。所帶來(lái)的負(fù)面影響: 插裝過(guò)的代碼比原先的代碼大且運(yùn)行得慢。可能會(huì)掩蓋時(shí)間、規(guī)模和位置,尤其對(duì)實(shí)時(shí)系統(tǒng)。1.程序插裝定義:是借助向被測(cè)程序中插入操作來(lái)實(shí)現(xiàn)測(cè)試目的的程序插裝的應(yīng)用測(cè)試覆蓋率度量;測(cè)試用例有效性度量;斷言檢測(cè);數(shù)據(jù)流異常檢測(cè);路徑智能分解。程序插裝的應(yīng)用測(cè)試覆蓋率度量;1)用于測(cè)試覆蓋率度量的程序插裝具體實(shí)施步驟:在控制流中確定一個(gè)點(diǎn)集;在程序中的這些點(diǎn)上插入軟件計(jì)數(shù)器;用一組測(cè)試用例測(cè)試這個(gè)程序;檢查計(jì)數(shù)器的值以確定獲得的覆蓋率的范圍。凡經(jīng)歷的計(jì)數(shù)語(yǔ)句都能記錄下該程序點(diǎn)的實(shí)際執(zhí)行次數(shù)1)用于測(cè)試覆蓋率度量的程序插裝具體實(shí)施步驟:入口C(1)=C(1)+1Q=XR=YC(2)=C(2)+1Q≠RC(4)=C(4)+1Q>RC(6)=C(6)+1C(5)=C(5)+1Q=Q-RR=R-QC(3)=C(3)+1出口TTFF插裝后的求最大公約數(shù)程序流程圖入口C(1)=C(1)+1Q=XR=YC(2)=C(2)+插裝程序中插入的語(yǔ)句插裝程序中插入的語(yǔ)句設(shè)計(jì)插裝程序時(shí)需考慮的問(wèn)題探測(cè)哪些信息;在程序的什么部位設(shè)置探測(cè)點(diǎn);需要設(shè)置多少個(gè)探測(cè)點(diǎn)。 在一般情況,在沒(méi)有分支的程序段中只需一個(gè)計(jì)數(shù)語(yǔ)句。為了在程序中設(shè)置最少的計(jì)數(shù)語(yǔ)句,需要針對(duì)程序的控制結(jié)構(gòu)具體分析。設(shè)計(jì)插裝程序時(shí)需考慮的問(wèn)題探測(cè)哪些信息;至少在哪些部位設(shè)置計(jì)數(shù)語(yǔ)句的建議程序塊的第一個(gè)可執(zhí)行語(yǔ)句之前;有標(biāo)號(hào)的可執(zhí)行語(yǔ)句處;BLOCK-IF、ELSEIF、ELSE及ENDIF語(yǔ)句之后;DO、DOWHILE、DOUNTIL及DO終端語(yǔ)句之后;輸入/輸出語(yǔ)句之后;CALL語(yǔ)句之后;
至少在哪些部位設(shè)置計(jì)數(shù)語(yǔ)句的建議程序塊的第一個(gè)可執(zhí)行語(yǔ)句之前2)用于測(cè)試用例的有效性度量的程序插裝測(cè)試用例的有效性是指該用例揭示程序錯(cuò)誤的能力;程序的測(cè)試用例的單一指數(shù):在一次特定測(cè)試執(zhí)行期間,一個(gè)測(cè)試用例唯一地關(guān)注于遇到的一個(gè)多重表達(dá)式的次數(shù)。單一指數(shù)越高,測(cè)試用例的有效性越低。2)用于測(cè)試用例的有效性度量的程序插裝測(cè)試用例的有效性是指該例一個(gè)語(yǔ)句包含a×(c+(d/e))一個(gè)表達(dá)式,則這個(gè)表達(dá)式存在3個(gè)需要關(guān)注的因子:a、(c+(d/e))、d。設(shè)計(jì)一個(gè)工具用來(lái)插裝該表達(dá)式:
If(a==0)si++;If((c+(d/e))==0)si++;If(d==0)si++;其中si是變量,用于存儲(chǔ)測(cè)試用例的單一指數(shù)例一個(gè)語(yǔ)句包含a×(c+(d/e))一個(gè)表達(dá)式,則這個(gè)表達(dá)式3)用于斷言檢測(cè)的程序插裝在程序的特定部位插入某些用以判斷變量特性的語(yǔ)句,使這些語(yǔ)句在程序執(zhí)行中得以證實(shí),從而使程序的運(yùn)行特性得以證實(shí);插入的這些語(yǔ)句稱為斷言(Assertions)。斷言是程序插裝的一個(gè)典型使用;但在實(shí)際中不是那么好用; 必須在程序的正確位置放入正確的斷言;分析到底是程序錯(cuò)誤引起的還是因?yàn)椴徽_的斷言引起的違例。3)用于斷言檢測(cè)的程序插裝在程序的特定部位插入某些用以判斷變例unsignedintDev(intnum1,intnum2,int&ref){intvall,val2,k=0;val1=num1;val2=num2;_ASSERT(num1>=0);_ASSERT(num2>0);while((val1-val2)>0){val1=val1-val2;k++;_ASSERT((num2*k+val1)==num1);}ref=val1;_ASSERT(ref<num2);returnk;}例unsignedintDev(intnum1,int2.故障插入(FaultSeeding)是一個(gè)統(tǒng)計(jì)的方法,用于評(píng)價(jià)遺留在一個(gè)程序中的故障數(shù)量和種類。計(jì)算公式:原本錯(cuò)誤總數(shù)=(插入的錯(cuò)誤總數(shù)/發(fā)現(xiàn)的插入錯(cuò)誤數(shù))×發(fā)現(xiàn)的原本錯(cuò)誤數(shù)殘留錯(cuò)誤數(shù)=原本錯(cuò)誤總數(shù)-發(fā)現(xiàn)的原本錯(cuò)誤數(shù)2.故障插入(FaultSeeding)是一個(gè)統(tǒng)計(jì)的方法,故障插入用于軟件可靠性方面比較廣泛(尤其在硬件的測(cè)試中);通過(guò)有意插入的故障來(lái)調(diào)用系統(tǒng)的故障容錯(cuò)能力,在一個(gè)可控制的環(huán)境和期望的時(shí)間段內(nèi)獲得完整的測(cè)試;與現(xiàn)有測(cè)試方法比較:現(xiàn)有的測(cè)試是從系統(tǒng)的正確狀態(tài)開(kāi)始,測(cè)試系統(tǒng)如何轉(zhuǎn)入故障狀態(tài)。故障注入測(cè)試從系統(tǒng)的故障狀態(tài)開(kāi)始,測(cè)試系統(tǒng)在發(fā)生故障后的運(yùn)行規(guī)律;故障插入用于軟件可靠性方面比較廣泛(尤其在硬件的測(cè)試中);故障插入用于驗(yàn)證測(cè)試用例有效性原理: 為了檢查設(shè)計(jì)的測(cè)試用例是否能發(fā)現(xiàn)某一類型的故障,人為地在被測(cè)系統(tǒng)中引入該類型的故障,如果在測(cè)試過(guò)程中能發(fā)現(xiàn)這個(gè)故障,則應(yīng)該也可以測(cè)試出系統(tǒng)原來(lái)就存在的該類故障。故障插入用于驗(yàn)證測(cè)試用例有效性原理:經(jīng)過(guò)若干年的測(cè)試?yán)碚撗芯亢蛙浖y(cè)試的實(shí)踐,人們逐漸發(fā)現(xiàn)要想找出程序中所有的錯(cuò)誤幾乎是不可能的。比較現(xiàn)實(shí)的解決辦法是將錯(cuò)誤的搜索范圍盡可能縮小,以利于專門測(cè)試某類錯(cuò)誤是否存在。經(jīng)過(guò)若干年的測(cè)試?yán)碚撗芯亢蛙浖y(cè)試的實(shí)踐,人們逐漸發(fā)現(xiàn)要想找3.程序變異(MutationAnalysis)定義:使用故障插入來(lái)分析測(cè)試數(shù)據(jù)的屬性。變異:帶有插入錯(cuò)誤的程序;產(chǎn)物:關(guān)于測(cè)試數(shù)據(jù)能夠在多大程度上殺死變體的度量;變體通過(guò)使用一個(gè)變體操作產(chǎn)生。3.程序變異(MutationAnalysis)定義:使用程序P的變異因子m(P)也是一個(gè)程序,它是對(duì)P進(jìn)行微小改動(dòng)而得到的。如果程序P是正確的,m(P)是一個(gè)幾乎正確的程序。如果P不正確,則P的某一個(gè)變異因子m(P)可能是正確的。假設(shè)P有一組測(cè)試數(shù)據(jù),為D。我們現(xiàn)在關(guān)心的是P在D上無(wú)錯(cuò)誤的情況。怎樣確定程序的正確程度呢?程序P的變異因子m(P)也是一個(gè)程序,它是對(duì)P進(jìn)行微小改動(dòng)而程序變異思想若P在D上是正確的,可以找出P的變異因子的某一集合:m={M(P)|m(P)是P的變異因子}若m中每一元素在D上都存在錯(cuò)誤,則可認(rèn)為程序的正確程度較高。若m中某些元素在D上不存在錯(cuò)誤,則可能存在3種情況:這些變異因子與P在功能上是等價(jià)的;現(xiàn)有的測(cè)試數(shù)據(jù)不足以找出P與其變異因子間的差別;P可能含有錯(cuò)誤,而其某些變異因子卻是正確的。程序變異思想若P在D上是正確的,可以找出P的變異因子的某一集仔細(xì)核對(duì)P及其m(P),避免的一種情況出現(xiàn);P與某些m(P)都正確時(shí),可能測(cè)試數(shù)據(jù)太少、不夠典型造成。應(yīng)該增加測(cè)試數(shù)據(jù),直到所有m(P)都出錯(cuò);第三種情況提醒我們,當(dāng)許多典型的測(cè)試數(shù)據(jù)仍然不能使某一m(P)出錯(cuò)時(shí),此m(P)可能是程序的正確形式。仔細(xì)核對(duì)P及其m(P),避免的一種情況出現(xiàn);考慮下面的C程序main(){inti;floate,sum,term,x;scanf(“%f%f”x,e);printf(“x=%10.6fe=%10.6f\n”x,e);term=x;for(i=3;i<=100&&term>e;i=i+2){term=term*x*x/(i*(i-1));if(i%2==0)sum=sum+term;elsesum=sum-term;}printf(“sin(x)=%8.6f\n”sum);}考慮下面的C程序main()把x設(shè)成常量0,產(chǎn)生一個(gè)變體main(){inti;floate,sum,term,x;scanf(“%f%f”x,e);printf(“x=%10.6fe=%10.6f\n”x,e);term=0;for(i=3;i<=100&&term>e;i=i+2){term=term*x*x/(i*(i-1));if(i%2==0)sum=sum+term;elsesum=sum-term;}printf(“sin(x)=%8.6f\n”sum);}把x設(shè)成常量0,產(chǎn)生一個(gè)變體main()另一個(gè)變體main(){inti;floate,sum,term,x;scanf(“%f%f”x,e);printf(“x=%10.6fe=%10.6f\n”x,e);term=x;for(i=3;i>=100&&term>e;i=i+2){term=term*x*x/(i*(i-1));if(i%2==0)sum=sum+term;elsesum=sum-term;}printf(“sin(x)=%8.6f\n”sum);}另一個(gè)變體main()把0換成1,產(chǎn)生一個(gè)變體main(){inti;floate,sum,term,x;scanf(“%f%f”x,e);printf(“x=%10.6fe=%10.6f\n”x,e);term=x;for(i=3;i<=100&&term>e;i=i+2){term=term*x*x/(i*(i-1));if(i%2==1)sum=sum+term;elsesum=sum-term;}printf(“sin(x)=%8.6f\n”sum);}把0換成1,產(chǎn)生一個(gè)變體main()關(guān)鍵:要求測(cè)試數(shù)據(jù)集D和變異因子集m(P)都需精心挑選。怎樣建立變異因子?可將其看作是變異操作符作用在被測(cè)程序上的結(jié)果。關(guān)鍵:要求測(cè)試數(shù)據(jù)集D和變異因子集m(P)都需精心挑選。變體操作的構(gòu)造與程序設(shè)計(jì)語(yǔ)言密切相關(guān);關(guān)于Fortran程序的變體操作:常量替換A=0→A=1標(biāo)量替換A=B-1→A=D-1標(biāo)量替換常量/常量替換標(biāo)量用數(shù)組引用替換常量A=2→A=B(2)求負(fù)操作替換A=X→A=-X數(shù)學(xué)操作符替換A=B+C→A=B-C語(yǔ)句刪除GOTO語(yǔ)句替換GOTO20→GOTO30…變體操作的構(gòu)造與程序設(shè)計(jì)語(yǔ)言密切相關(guān); 通過(guò)變異分析構(gòu)造測(cè)試數(shù)據(jù)的過(guò)程是一個(gè)循環(huán)過(guò)程。測(cè)試人員提供被測(cè)程序以及初始數(shù)據(jù)、變異運(yùn)算符。當(dāng)P和m(P)被初始測(cè)試數(shù)據(jù)測(cè)試后,可能會(huì)有變異因子未被發(fā)現(xiàn)錯(cuò)誤??梢栽黾訙y(cè)試數(shù)據(jù)。若所有的m(P)均出錯(cuò),也可以增加新的m(P)。然后進(jìn)行下一輪變異測(cè)試。 通過(guò)變異分析構(gòu)造測(cè)試數(shù)據(jù)的過(guò)程是一個(gè)循環(huán)過(guò)程。 Budd等人統(tǒng)計(jì)了他們?cè)O(shè)計(jì)的程序變異系統(tǒng)在輔助測(cè)試人員進(jìn)行測(cè)試的效果。被測(cè)程序13個(gè),共包含30個(gè)錯(cuò)誤。統(tǒng)計(jì)結(jié)果如下圖: Budd等人統(tǒng)計(jì)了他們?cè)O(shè)計(jì)的程序變異系統(tǒng)在輔助測(cè)試人員進(jìn)行程序變異由于其針對(duì)性強(qiáng)、系統(tǒng)性強(qiáng),正成為軟件測(cè)試中一種相當(dāng)活躍的辦法。特別是在變異測(cè)試系統(tǒng)支持下,用戶可以更有效地測(cè)試自己的程序。程序變異由于其針對(duì)性強(qiáng)、系統(tǒng)性強(qiáng),正成為軟件測(cè)試中一種相當(dāng)活習(xí)題1、使用基本路徑測(cè)試方法,為以下程序段設(shè)計(jì)測(cè)試用例。voidDo(intX,intA,intB){1if((A>1)&&(B=0))2X=X/A;3if((A=2)||(X>1))4X=X+1;5}習(xí)題1、使用基本路徑測(cè)試方法,為以下程序段設(shè)計(jì)測(cè)試用例。2、某程序所畫(huà)出的N-S圖如右圖所示的,至少需要多少個(gè)測(cè)試用例才能對(duì)該程序?qū)崿F(xiàn)邏輯覆蓋?習(xí)題2、某程序所畫(huà)出的N-S圖如右圖所示的,至少需要多少個(gè)測(cè)試用3、判斷正誤并說(shuō)明理由(可以舉例):在沒(méi)有產(chǎn)品說(shuō)明書(shū)和需求文檔的條件下可以進(jìn)行動(dòng)態(tài)黑盒測(cè)試;靜態(tài)白盒測(cè)試可以找出軟件的遺漏之處和問(wèn)題;白盒測(cè)試的條件覆蓋標(biāo)準(zhǔn)強(qiáng)于判定覆蓋。4、試分析動(dòng)態(tài)白盒子測(cè)試(dynamicwhite-boxtesting)和調(diào)試(debugging)有何異同。習(xí)題3、判斷正誤并說(shuō)明理由(可以舉例):習(xí)題第3章白盒測(cè)試及其用例的設(shè)計(jì)3.1白盒測(cè)試方法3.2控制流圖3.3白盒測(cè)試覆蓋指標(biāo)3.4數(shù)據(jù)流測(cè)試3.5白盒測(cè)試方法總結(jié)第3章白盒測(cè)試及其用例的設(shè)計(jì)3.1白盒測(cè)試方法本章教學(xué)目標(biāo)理論環(huán)節(jié)學(xué)習(xí)理解白盒測(cè)試方法的基本概念學(xué)習(xí)理解白盒測(cè)試的覆蓋理論學(xué)習(xí)掌握白盒測(cè)試的路徑表達(dá)學(xué)習(xí)掌握白盒測(cè)試的基本路徑測(cè)試法學(xué)習(xí)掌握白盒測(cè)試的數(shù)據(jù)流測(cè)試法實(shí)踐環(huán)節(jié)通過(guò)案例運(yùn)用學(xué)習(xí)掌握覆蓋問(wèn)題的解決方法運(yùn)用基本路徑測(cè)試方法進(jìn)行實(shí)際程序測(cè)試本章教學(xué)目標(biāo)理論環(huán)節(jié)3.1白盒測(cè)試方法為什么要進(jìn)行白盒測(cè)試?如果所有軟件錯(cuò)誤的根源都可以追溯到某個(gè)唯一原因,那么問(wèn)題就簡(jiǎn)單了。然而,事實(shí)上一個(gè)bug常常是由多個(gè)因素共同導(dǎo)致的,如下圖所示。假設(shè)此時(shí)開(kāi)發(fā)工作已結(jié)束,程序送交到測(cè)試組,沒(méi)有人知道代碼中有一個(gè)潛在的被0除的錯(cuò)誤。若測(cè)試組采用的測(cè)試用例的執(zhí)行路徑?jīng)]有同時(shí)經(jīng)過(guò)x=0和y=5/x進(jìn)行測(cè)試,顯然測(cè)試工作似乎非常完善,測(cè)試用例覆蓋了所有執(zhí)行語(yǔ)句,也沒(méi)有被0除的錯(cuò)誤發(fā)生。3.1白盒測(cè)試方法為什么要進(jìn)行白盒測(cè)試?假白盒測(cè)試方法(續(xù))白盒測(cè)試也稱結(jié)構(gòu)測(cè)試或邏輯驅(qū)動(dòng)測(cè)試,是針對(duì)被測(cè)單元內(nèi)部是如何進(jìn)行工作的測(cè)試。它根據(jù)程序的控制結(jié)構(gòu)設(shè)計(jì)測(cè)試用例。白盒測(cè)試法檢查程序內(nèi)部邏輯結(jié)構(gòu),對(duì)所有邏輯路徑進(jìn)行測(cè)試,是一種窮舉路徑的測(cè)試方法。但即使每條路徑都測(cè)試過(guò)了,仍然可能存在錯(cuò)誤。因?yàn)椋焊F舉路徑測(cè)試無(wú)法檢查出程序本身是否違反了設(shè)計(jì)規(guī)范,即程序是否是一個(gè)錯(cuò)誤的程序。窮舉路徑測(cè)試不可能查出程序因?yàn)檫z漏路徑而出錯(cuò)。窮舉路徑測(cè)試發(fā)現(xiàn)不了一些與數(shù)據(jù)相關(guān)的錯(cuò)誤。白盒測(cè)試方法(續(xù))白盒測(cè)試也稱結(jié)構(gòu)測(cè)試或邏輯驅(qū)動(dòng)測(cè)試,是針對(duì)白盒測(cè)試方法(續(xù))采用白盒測(cè)試方法必須遵循以下幾條原則,才能達(dá)到測(cè)試的目的:保證一個(gè)模塊中的所有獨(dú)立路徑至少被測(cè)試一次。所有邏輯值均需測(cè)試真(true)和假(false)兩種情況。檢查程序的內(nèi)部數(shù)據(jù)結(jié)構(gòu),保證其結(jié)構(gòu)的有效性。在上下邊界及可操作范圍內(nèi)運(yùn)行所有循環(huán)。白盒測(cè)試方法(續(xù))采用白盒測(cè)試方法必須遵循以下幾條原則,才能白盒測(cè)試常用的測(cè)試用例設(shè)計(jì)方法邏輯覆蓋以程序內(nèi)部的邏輯結(jié)構(gòu)為基礎(chǔ);根據(jù)覆蓋測(cè)試的目標(biāo),邏輯覆蓋分為:語(yǔ)句、判定、條件、判定/條件、組合、路徑基本路徑測(cè)試為了解決路徑龐大難題;在程序控制流程圖的基礎(chǔ)上,分析控制構(gòu)造的環(huán)路復(fù)雜性,導(dǎo)出基本可執(zhí)行路徑集合,設(shè)計(jì)測(cè)試用例的方法。白盒測(cè)試常用的測(cè)試用例設(shè)計(jì)方法邏輯覆蓋3.3控制流圖控制流圖(可簡(jiǎn)稱流圖)是對(duì)程序流程圖進(jìn)行簡(jiǎn)化后得到的,它可以更加突出的表示程序控制流的結(jié)構(gòu),唯一的??刂屏鲌D中包括兩種圖形符號(hào):節(jié)點(diǎn)和控制流線。節(jié)點(diǎn)由帶標(biāo)號(hào)的圓圈表示,可代表一個(gè)或多個(gè)語(yǔ)句、一個(gè)處理框序列和一個(gè)條件判定框(假設(shè)不包含復(fù)合條件)。控制流線由帶箭頭的弧或線表示,可稱為邊。它代表程序中的控制流。對(duì)于復(fù)合條件,則可將其分解為多個(gè)單個(gè)條件,并映射成控制流圖。常見(jiàn)結(jié)構(gòu)的控制流圖3.3控制流圖控制流圖(可簡(jiǎn)稱流圖)是對(duì)程序流程圖進(jìn)行簡(jiǎn)化常見(jiàn)結(jié)構(gòu)的控制流圖其中,包含條件的節(jié)點(diǎn)被稱為判定節(jié)點(diǎn)(也叫謂詞節(jié)點(diǎn)),由判定節(jié)點(diǎn)發(fā)出的邊必須終止于某一個(gè)節(jié)點(diǎn),由邊和節(jié)點(diǎn)所限定的范圍被稱為區(qū)域。常見(jiàn)結(jié)構(gòu)的控制流圖其中,包含條件的節(jié)點(diǎn)被稱為判定節(jié)點(diǎn)(也叫謂軟件測(cè)試-3白盒測(cè)試及其用例的設(shè)計(jì)課件軟件測(cè)試-3白盒測(cè)試及其用例的設(shè)計(jì)課件轉(zhuǎn)化程序流程圖為控制流圖
A>1and
B=0
X=X/A
1
2
3
A>1
B=0
X=X/A
2
3
1
4
YYY轉(zhuǎn)化程序流程圖為控制流圖A>1andB=0X=X/3.3覆蓋測(cè)試3.4.1測(cè)試覆蓋率3.4.2邏輯覆蓋法3.4.3功能覆蓋3.4.4其他覆蓋3.4.5如何使用覆蓋率3.4.6測(cè)試覆蓋準(zhǔn)則3.3覆蓋測(cè)試3.4.1測(cè)試覆蓋率結(jié)構(gòu)測(cè)試中的一個(gè)重要問(wèn)題是,測(cè)試進(jìn)行到什么地步就達(dá)到要求,可以結(jié)束測(cè)試。這需要給出結(jié)構(gòu)測(cè)試的覆蓋準(zhǔn)則。結(jié)構(gòu)測(cè)試中的一個(gè)重要問(wèn)題是,測(cè)試進(jìn)行到什么地步就達(dá)到要求,可3.3.1測(cè)試覆蓋率測(cè)試覆蓋率:用于確定測(cè)試所執(zhí)行到的覆蓋項(xiàng)的百分比。其中的覆蓋項(xiàng)是指作為測(cè)試基礎(chǔ)的一個(gè)入口或?qū)傩?,比如語(yǔ)句、分支、條件等。通過(guò)覆蓋率數(shù)據(jù)可以知道測(cè)試得是否充分,測(cè)試的弱點(diǎn)在哪些方面,從而指導(dǎo)我們?cè)O(shè)計(jì)能夠增加覆蓋率的測(cè)試用例。能夠有效地提高測(cè)試質(zhì)量,避免設(shè)計(jì)無(wú)效用例。在測(cè)試分析報(bào)告中可以作為量化指標(biāo)的依據(jù),測(cè)試覆蓋率越高效果越好。但覆蓋率不是目標(biāo),只是一種手段。3.3.1測(cè)試覆蓋率測(cè)試覆蓋率:用于確定測(cè)試所執(zhí)行到的覆覆蓋率概念覆蓋率是用來(lái)度量測(cè)試完整性的一個(gè)手段。本身并不包含測(cè)試技術(shù),只是測(cè)試技術(shù)有效性的一個(gè)度量。
覆蓋率種類:邏輯覆蓋(LogicalCoverage),也叫:代碼覆蓋率(CodeCoverage)結(jié)構(gòu)化覆蓋率(StructuralCoverage)功能覆蓋(FunctionCoverage)。
覆蓋率概念覆蓋率是用來(lái)度量測(cè)試完整性的一個(gè)手段。本身3.3.2邏輯覆蓋法根據(jù)覆蓋目標(biāo)的不同,邏輯覆蓋可分為語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。語(yǔ)句覆蓋:選擇若干個(gè)測(cè)試用例,運(yùn)行被測(cè)程序,使得程序中的每個(gè)可執(zhí)行語(yǔ)句至少執(zhí)行一次。覆蓋指標(biāo)C0判定覆蓋(分支覆蓋):選擇若干個(gè)測(cè)試用例,運(yùn)行被測(cè)程序,使得程序中的每個(gè)判斷真假值均曾被滿足,也就是使程序中的每個(gè)取“真”分支和取“假”分支至少均經(jīng)歷一次。覆蓋指標(biāo)C1條件覆蓋:選擇若干個(gè)測(cè)試用例,運(yùn)行被測(cè)程序,使得程序中每個(gè)判定包含的每個(gè)條件的可能取值(真/假)都至少滿足一次。3.3.2邏輯覆蓋法根據(jù)覆蓋目標(biāo)的不同,邏輯覆蓋可分為語(yǔ)邏輯覆蓋法(續(xù))判定-條件覆蓋:設(shè)計(jì)足夠多的測(cè)試用例,使得程序中每個(gè)判定包含的每個(gè)條件的所有情況(真/假)至少出現(xiàn)一次,并且每個(gè)判定本身的判定結(jié)果(真/假)也至少出現(xiàn)一次?!獫M足判定-條件覆蓋的測(cè)試用例一定同時(shí)滿足判定覆蓋和條件覆蓋。組合覆蓋:通過(guò)執(zhí)行足夠的測(cè)試用例,使得程序中每個(gè)判定的所有可能的條件取值組合都至少出現(xiàn)一次。覆蓋指標(biāo)CMCC
——滿足組合覆蓋的測(cè)試用例一定滿足判定覆蓋、條件覆蓋和判定-條件覆蓋。路徑覆蓋:設(shè)計(jì)足夠多的測(cè)試用例,要求覆蓋程序中所有可能的路徑。覆蓋指標(biāo)C∞邏輯覆蓋法(續(xù))判定-條件覆蓋:設(shè)計(jì)足夠多的測(cè)試用例,使得程邏輯覆蓋法(續(xù))組合覆蓋判定-條件覆蓋判定覆蓋條件覆蓋語(yǔ)句覆蓋邏輯覆蓋法(續(xù))組合覆蓋判定-條件覆蓋判定覆蓋條件覆蓋語(yǔ)句覆邏輯覆蓋法(續(xù))voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;j=sqrt(k);}//語(yǔ)句塊1if((x==4)||(y>5)){j=x*y+10;}//語(yǔ)句塊2
j=j%3;//語(yǔ)句塊3}邏輯覆蓋法(續(xù))voidDoWork(intx,in邏輯覆蓋法(續(xù))X>3&&z<10執(zhí)行語(yǔ)句塊1執(zhí)行語(yǔ)句塊2X==4||y>5執(zhí)行語(yǔ)句塊3FFTTabdce邏輯覆蓋法(續(xù))X>3&&z<10執(zhí)行語(yǔ)句塊1執(zhí)行語(yǔ)句塊語(yǔ)句覆蓋要實(shí)現(xiàn)DoWork函數(shù)的語(yǔ)句覆蓋,只需設(shè)計(jì)一個(gè)測(cè)試用例就可以覆蓋程序中的所有可執(zhí)行語(yǔ)句。測(cè)試用例輸入為:{x=4、y=5、z=5}程序執(zhí)行的路徑是:abd分析:語(yǔ)句覆蓋可以保證程序中的每個(gè)語(yǔ)句都得到執(zhí)行,但發(fā)現(xiàn)不了判定中邏輯運(yùn)算的錯(cuò)誤,即它并不是一種充分的檢驗(yàn)方法。例如在第一個(gè)判定((x>3)&&(z<10))中把“&&”錯(cuò)誤的寫(xiě)成了“||”,這時(shí)仍使用該測(cè)試用例,則程序仍會(huì)按照流程圖上的路徑abd執(zhí)行。可以說(shuō)語(yǔ)句覆蓋是最弱的邏輯覆蓋準(zhǔn)則。語(yǔ)句覆蓋要實(shí)現(xiàn)DoWork函數(shù)的語(yǔ)句覆蓋,只需設(shè)計(jì)一個(gè)測(cè)試用判定覆蓋注:教材中又稱為DD-路徑覆蓋,測(cè)試滿足DD-路徑覆蓋要求可以發(fā)現(xiàn)全部缺陷的85%要實(shí)現(xiàn)DoWork函數(shù)的判定覆蓋,需要設(shè)計(jì)兩個(gè)測(cè)試用例。測(cè)試用例的輸入為:{x=4、y=5、z=5};{x=2、y=5、z=5}程序執(zhí)行的路徑分別是:abd;ace分析:上述兩個(gè)測(cè)試用例不僅滿足了判定覆蓋,同時(shí)還做到語(yǔ)句覆蓋。從這點(diǎn)看似乎判定覆蓋比語(yǔ)句覆蓋更強(qiáng)一些,但仍然無(wú)法確定判定內(nèi)部條件的錯(cuò)誤。例如把第二個(gè)判定中的條件y>5錯(cuò)誤寫(xiě)為y<5,使用上述測(cè)試用例,照樣能按原路徑執(zhí)行而不影響結(jié)果。因此,需要有更強(qiáng)的邏輯覆蓋準(zhǔn)則去檢驗(yàn)判定內(nèi)的條件。判定覆蓋注:教材中又稱為DD-路徑覆蓋,測(cè)試滿足DD-路徑覆判定覆蓋(續(xù))13524說(shuō)明:以上僅考慮了兩出口的判斷,我們還應(yīng)把判定覆蓋準(zhǔn)則擴(kuò)充到多出口判斷(如Case語(yǔ)句)的情況。因此,判定覆蓋更為廣泛的含義應(yīng)該是使得每一個(gè)判定獲得每一種可能的結(jié)果至少一次。6789105’判定覆蓋(續(xù))13524說(shuō)明:以上僅考慮了兩出口的判斷,我們條件覆蓋在實(shí)際程序代碼中,一個(gè)判定中通常都包含若干條件。條件覆蓋的目的是設(shè)計(jì)若干測(cè)試用例,在執(zhí)行被測(cè)程序后,要使每個(gè)判定中每個(gè)條件的可能值至少滿足一次。對(duì)DoWork函數(shù)的各個(gè)判定的各種條件取值加以標(biāo)記。對(duì)于第一個(gè)判定((x>3)&&(z<10)): 條件x>3取真值記為T1,取假值記為-T1
條件z<10取真值記為T2,取假值記為-T2對(duì)于第二個(gè)判定((x==4)||(y>5)):條件x==4取真值記為T3,取假值記為-T3條件y>5取真值記為T4,取假值記為-T4條件覆蓋在實(shí)際程序代碼中,一個(gè)判定中通常都包含若干條件。條條件覆蓋(續(xù))根據(jù)條件覆蓋的基本思想,要使上述4個(gè)條件可能產(chǎn)生的8種情況至少滿足一次,設(shè)計(jì)測(cè)試用例如下:分析:上面這組測(cè)試用例不但覆蓋了4個(gè)條件的全部8種情況,而且將兩個(gè)判定的4個(gè)分支b、c、d、e也同時(shí)覆蓋了,即同時(shí)達(dá)到了條件覆蓋和判定覆蓋。條件覆蓋(續(xù))根據(jù)條件覆蓋的基本思想,要使上述4個(gè)條件可能產(chǎn)條件覆蓋(續(xù))說(shuō)明:雖然前面的一組測(cè)試用例同時(shí)達(dá)到了條件覆蓋和判定覆蓋,但是,并不是說(shuō)滿足條件覆蓋就一定能滿足判定覆蓋。如果設(shè)計(jì)了下表中的這組測(cè)試用例,則雖然滿足了條件覆蓋,但只是覆蓋了程序中第一個(gè)判定的取假分支c和第二個(gè)判定的取真分支d,不滿足判定覆蓋的要求。條件覆蓋(續(xù))說(shuō)明:雖然前面的一組測(cè)試用例同時(shí)達(dá)到了條件覆蓋判定-條件覆蓋判定-條件覆蓋實(shí)際上是將判定覆蓋和條件覆蓋結(jié)合起來(lái)的一種方法,即:設(shè)計(jì)足夠的測(cè)試用例,使得判定中每個(gè)條件的所有可能取值至少滿足一次,同時(shí)每個(gè)判定的可能結(jié)果也至少出現(xiàn)一次。根據(jù)判定-條件覆蓋的基本思想,只需設(shè)計(jì)以下兩個(gè)測(cè)試用例便可以覆蓋4個(gè)條件的8種取值以及4個(gè)判定分支。判定-條件覆蓋判定-條件覆蓋實(shí)際上是將判定覆蓋和條件覆蓋結(jié)合判定-條件覆蓋(續(xù))分析:從表面上看,判定-條件覆蓋測(cè)試了各個(gè)判定中的所有條件的取值,但實(shí)際上,編譯器在檢查含有多個(gè)條件的邏輯表達(dá)式時(shí),某些情況下的某些條件將會(huì)被其它條件所掩蓋。因此,判定-條件覆蓋也不一定能夠完全檢查出邏輯表達(dá)式中的錯(cuò)誤。例如:對(duì)于第一個(gè)判定(x>3)&&(z<10)來(lái)說(shuō),必須x>3和z<10這兩個(gè)條件同時(shí)滿足才能確定該判定為真。如果x>3為假,則編譯器將不再檢查z<10這個(gè)條件,那么即使這個(gè)條件有錯(cuò)也無(wú)法被發(fā)現(xiàn)。對(duì)于第二個(gè)判定(x==4)||(y>5)來(lái)說(shuō),若條件x==4滿足,就認(rèn)為該判定為真,這時(shí)將不會(huì)再檢查y>5,那么同樣也無(wú)法發(fā)現(xiàn)這個(gè)條件中的錯(cuò)誤。判定-條件覆蓋(續(xù))分析:從表面上看,判定-條件覆蓋測(cè)試了各組合覆蓋組合覆蓋的目的是要使設(shè)計(jì)的測(cè)試用例能覆蓋每一個(gè)判定的所有可能的條件取值組合。對(duì)DoWork函數(shù)中的各個(gè)判定的條件取值組合加以標(biāo)記:1、x>3,z<10記做T1T2,第一個(gè)判定的取真分支2、x>3,z>=10記做T1-T2,第一個(gè)判定的取假分支3、x<=3,z<10記做-T1T2,第一個(gè)判定的取假分支4、x<=3,z>=10記做-T1-T2,第一個(gè)判定的取假分支5、x==4,y>5記做T3T4,第二個(gè)判定的取真分支6、x==4,y<=5記做T3-T4,第二個(gè)判定的取真分支7、x!=4,y>5記做-T3T4,第二個(gè)判定的取真分支8、x!=4,y<=5記做-T3-T4,第二個(gè)判定的取假分支組合覆蓋組合覆蓋的目的是要使設(shè)計(jì)的測(cè)試用例能覆蓋每一個(gè)判定的組合覆蓋(續(xù))根據(jù)組合覆蓋的基本思想,設(shè)計(jì)測(cè)試用例如下:分析:上面這組測(cè)試用例覆蓋了所有8種條件取值的組合,覆蓋了所有判定的真假分支,但是卻丟失了一條路徑abe。組合覆蓋(續(xù))根據(jù)組合覆蓋的基本思想,設(shè)計(jì)測(cè)試用例如下:分析路徑覆蓋前面提到的5種邏輯覆蓋都未涉及到路徑的覆蓋。事實(shí)上,只有當(dāng)程序中的每一條路徑都受到了檢驗(yàn),才能使程序受到全面檢驗(yàn)。路徑覆蓋的目的就是要使設(shè)計(jì)的測(cè)試用例能覆蓋被測(cè)程序中所有可能的路徑。根據(jù)路徑覆蓋的基本思想,在滿足組合覆蓋的測(cè)試用例中修改其中一個(gè)測(cè)試用例,則可以實(shí)現(xiàn)路徑覆蓋:路徑覆蓋前面提到的5種邏輯覆蓋都未涉及到路徑的覆蓋。事實(shí)上,路徑覆蓋(續(xù))分析:雖然前面一組測(cè)試用例滿足了路徑覆蓋,但并沒(méi)有覆蓋程序中所有的條件組合(丟失了組合3和7),即滿足路徑覆蓋的測(cè)試用例并不一定滿足組合覆蓋。說(shuō)明:對(duì)于比較簡(jiǎn)單的小程序,實(shí)現(xiàn)路徑覆蓋是可能做到的。但如果程序中出現(xiàn)較多判斷和較多循環(huán),可能的路徑數(shù)目將會(huì)急劇增長(zhǎng),要在測(cè)試中覆蓋所有的路徑是無(wú)法實(shí)現(xiàn)的。為了解決這個(gè)難題,只有把覆蓋路徑數(shù)量壓縮到一定的限度內(nèi),如程序中的循環(huán)體只執(zhí)行一次。在實(shí)際測(cè)試中,即使對(duì)于路徑數(shù)很有限的程序已經(jīng)做到路徑覆蓋,仍然不能保證被測(cè)試程序的正確性。路徑覆蓋(續(xù))分析:雖然前面一組測(cè)試用例滿足了路徑覆蓋,但并邏輯覆蓋小結(jié)各種結(jié)構(gòu)測(cè)試方法都不能保證程序的正確性。測(cè)試的目的并非要證明程序的正確性,而是要盡可能找出程序中的錯(cuò)誤。邏輯覆蓋率可以作為測(cè)試完整性的一個(gè)度量。即使達(dá)到100%的邏輯覆蓋率,仍然無(wú)法保證程序的正確性;確實(shí)并不存在一種十全十美的測(cè)試方法,能夠發(fā)現(xiàn)所有的錯(cuò)誤。邏輯覆蓋小結(jié)各種結(jié)構(gòu)測(cè)試方法都不能保證程序的正確性。3.4.3功能覆蓋 功能覆蓋屬于黑盒測(cè)試范疇。常見(jiàn)的是需求覆蓋和接口覆蓋。
需求覆蓋:通過(guò)設(shè)計(jì)一定的測(cè)試用例,要求每個(gè)需求點(diǎn)都被測(cè)試到。
接口覆蓋:也叫入口點(diǎn)覆蓋,接口覆蓋要求通過(guò)設(shè)計(jì)一定的用例使系統(tǒng)的每個(gè)接口都被測(cè)試到。
3.4.3功能覆蓋 功能覆蓋屬于黑盒測(cè)試范疇。常見(jiàn)的是需求3.4.4其他覆蓋率函數(shù)覆蓋定義:在測(cè)試中有哪些函數(shù)被測(cè)試到了,其被測(cè)試到的頻率有多大,這些函數(shù)在系統(tǒng)所有函數(shù)中占的比例有多大。是針對(duì)系統(tǒng)或一個(gè)子系統(tǒng)而測(cè)試的;比較容易自動(dòng)化(TrueCoveragePureCoverage);易于理解。指令塊覆蓋是語(yǔ)句覆蓋的一個(gè)變體。3.4.4其他覆蓋率函數(shù)覆蓋3.4.5如何使用覆蓋率 在選擇和使用覆蓋率時(shí),必須遵循的基本原則:覆蓋率不是目的,只是一種手段;不可能針對(duì)所有的覆蓋率指標(biāo)去進(jìn)行測(cè)試;只考慮一種覆蓋率指標(biāo)也是不恰當(dāng)?shù)模徊灰非蠼^對(duì)100%的覆蓋率。3.4.5如何使用覆蓋率 在選擇和使用覆蓋率時(shí),必須遵循評(píng)價(jià)標(biāo)準(zhǔn)覆蓋率度量覆蓋率評(píng)價(jià)表評(píng)價(jià)標(biāo)準(zhǔn)覆蓋覆蓋率評(píng)價(jià)表課堂練習(xí)為以下流程圖所示的程序段設(shè)計(jì)一組測(cè)試用例,要求分別滿足語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定-條件覆蓋、組合覆蓋和路徑覆蓋。(A>1)and(B=0)(A=2)or(X>1)X=X/AX=X+1TTFFbdcea課堂練習(xí)為以下流程圖所示的程序段設(shè)計(jì)一組測(cè)試用例,要求分別滿A=2,B=0,X=4(沿路徑ace執(zhí)行);語(yǔ)句覆蓋測(cè)試用例A=2,B=0,X=4(沿路徑ace執(zhí)行);語(yǔ)句覆蓋測(cè)試用A=3,B=0,X=3(acd);A=2,B=1,X=1(abe);aa判定覆蓋測(cè)試用例A=3,B=0,X=3(acd);A=2,B=1,X=1A=2,B=1,X=1(abe);A=1,B=0,X=3(abe);條件覆蓋測(cè)試用例A=2,B=1,X=1(abe);A=1,B=0,X=3判定-條件覆蓋測(cè)試用例判定-條件覆蓋測(cè)試用例判定條件的8種組合:A>1,B=0記為T1,T2;A>1,B<>0記為T1,F(xiàn)2;A<=1,B=0記為F1,T2;A<=1,B<>0記為F1,F(xiàn)2;A=2,X>1記為T3,T4;A=2,X<=1記為T3,F(xiàn)4;A<>2,X>1記為F3,T4;A<>2,X<=1記為F3,F(xiàn)4;判定條件的8種組合:組合覆蓋測(cè)試用例組合覆蓋測(cè)試用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abe)組合覆蓋測(cè)試用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abA=1,B=1,X=1(abd)A=1,B=0,X=3(abe)組合覆蓋測(cè)試用例A=1,B=1,X=1(abd)A=1,B=0,X=3(ab路徑覆蓋測(cè)試用例路徑覆蓋測(cè)試用例3.7數(shù)據(jù)流測(cè)試數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目標(biāo)碼而出現(xiàn)的,這類方法主要用于代碼優(yōu)化。近年來(lái)在測(cè)試中也得到成功運(yùn)用,查找引用未定義變量等程序錯(cuò)誤,查找對(duì)以前未曾使用的變量再次賦值等數(shù)據(jù)流異常的情況。這常常是常見(jiàn)程序錯(cuò)誤的表現(xiàn)形式,如:錯(cuò)拼名字、名字混淆或丟失了語(yǔ)句。3.7數(shù)據(jù)流測(cè)試數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目數(shù)據(jù)流測(cè)試關(guān)注變量定義賦值點(diǎn)(語(yǔ)句)和引用或使用這些值的點(diǎn)(語(yǔ)句)的結(jié)構(gòu)性測(cè)試。用作路徑測(cè)試的真實(shí)性檢查。程序和程序的元素通過(guò)它們的數(shù)據(jù)訪問(wèn)行為關(guān)聯(lián)起來(lái),確定了數(shù)據(jù)流關(guān)系。數(shù)據(jù)流測(cè)試形式:定義/使用測(cè)試基于程序片的測(cè)試定義/使用路徑和片的定義能夠非常準(zhǔn)確地描述要測(cè)試的程序部分?jǐn)?shù)據(jù)流測(cè)試關(guān)注變量定義賦值點(diǎn)(語(yǔ)句)和引用或使用這些值的點(diǎn)(常見(jiàn)的數(shù)據(jù)流異常包括:變量被定義,但是從來(lái)沒(méi)有使用;所使用的變量沒(méi)有被定義;變量在使用之前被定義兩次;等待一個(gè)還沒(méi)有被安排的進(jìn)程;安排一個(gè)與其自身相同的進(jìn)程;等待一個(gè)先前已經(jīng)被中止了的進(jìn)程;引用一個(gè)在并行進(jìn)程中被定義的變量;引用一個(gè)值不確定的變量。這些
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 機(jī)械行業(yè)促銷計(jì)劃總結(jié)
- 健康行業(yè)采購(gòu)工作總結(jié)
- 重要工程安保工作的系統(tǒng)總結(jié)計(jì)劃
- 科技產(chǎn)品設(shè)計(jì)師的智能體驗(yàn)與科技感
- 水務(wù)文化建設(shè)的探索計(jì)劃
- 中小學(xué)了解學(xué)習(xí)歷史英雄人物故事主題班會(huì):紅色人物1
- 2023年云南省臨滄市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2022年浙江省舟山市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2024年山西省忻州市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2022年浙江省麗水市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 裝配式鋼筋混凝土簡(jiǎn)支T梁設(shè)計(jì)
- COMMERCIAL INVOICE 商業(yè)發(fā)票
- 大氣課程設(shè)計(jì)-—袋式除塵器
- 普天超五類檢測(cè)報(bào)告
- 會(huì)計(jì)師事務(wù)所業(yè)務(wù)培訓(xùn)制度
- CMM2-18錨桿機(jī)(新)說(shuō)明書(shū)
- 12噸汽車起重機(jī)基本技術(shù)規(guī)格資料
- WEB開(kāi)發(fā)基礎(chǔ)-2021秋本-計(jì)算機(jī)科學(xué)與技術(shù)本復(fù)習(xí)資料-國(guó)家開(kāi)放大學(xué)2022年1月期末考試復(fù)習(xí)資料
- 安徽省政協(xié)機(jī)關(guān)文件材料歸檔范圍
- 本質(zhì)安全理論綜述研究
- 代建項(xiàng)目管理工作大綱
評(píng)論
0/150
提交評(píng)論