軟件測試3白盒測試及其用例的設(shè)計(jì)課件_第1頁
軟件測試3白盒測試及其用例的設(shè)計(jì)課件_第2頁
軟件測試3白盒測試及其用例的設(shè)計(jì)課件_第3頁
軟件測試3白盒測試及其用例的設(shè)計(jì)課件_第4頁
軟件測試3白盒測試及其用例的設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩207頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第3章白盒測試及其用例的設(shè)計(jì)3.1白盒測試方法3.2控制流圖3.3白盒測試覆蓋指標(biāo)3.4數(shù)據(jù)流測試3.5白盒測試方法總結(jié)第3章白盒測試及其用例的設(shè)計(jì)3.1白盒測試方法本章教學(xué)目標(biāo)理論環(huán)節(jié)學(xué)習(xí)理解白盒測試方法的基本概念學(xué)習(xí)理解白盒測試的覆蓋理論學(xué)習(xí)掌握白盒測試的路徑表達(dá)學(xué)習(xí)掌握白盒測試的基本路徑測試法學(xué)習(xí)掌握白盒測試的數(shù)據(jù)流測試法實(shí)踐環(huán)節(jié)通過案例運(yùn)用學(xué)習(xí)掌握覆蓋問題的解決方法運(yùn)用基本路徑測試方法進(jìn)行實(shí)際程序測試本章教學(xué)目標(biāo)理論環(huán)節(jié)3.1白盒測試方法為什么要進(jìn)行白盒測試?如果所有軟件錯誤的根源都可以追溯到某個(gè)唯一原因,那么問題就簡單了。然而,事實(shí)上一個(gè)bug常常是由多個(gè)因素共同導(dǎo)致的,如下圖所示。假設(shè)此時(shí)開發(fā)工作已結(jié)束,程序送交到測試組,沒有人知道代碼中有一個(gè)潛在的被0除的錯誤。若測試組采用的測試用例的執(zhí)行路徑?jīng)]有同時(shí)經(jīng)過x=0和y=5/x進(jìn)行測試,顯然測試工作似乎非常完善,測試用例覆蓋了所有執(zhí)行語句,也沒有被0除的錯誤發(fā)生。3.1白盒測試方法為什么要進(jìn)行白盒測試?假白盒測試方法(續(xù))白盒測試也稱結(jié)構(gòu)測試或邏輯驅(qū)動測試,是針對被測單元內(nèi)部是如何進(jìn)行工作的測試。它根據(jù)程序的控制結(jié)構(gòu)設(shè)計(jì)測試用例。白盒測試法檢查程序內(nèi)部邏輯結(jié)構(gòu),對所有邏輯路徑進(jìn)行測試,是一種窮舉路徑的測試方法。但即使每條路徑都測試過了,仍然可能存在錯誤。因?yàn)椋焊F舉路徑測試無法檢查出程序本身是否違反了設(shè)計(jì)規(guī)范,即程序是否是一個(gè)錯誤的程序。窮舉路徑測試不可能查出程序因?yàn)檫z漏路徑而出錯。窮舉路徑測試發(fā)現(xiàn)不了一些與數(shù)據(jù)相關(guān)的錯誤。白盒測試方法(續(xù))白盒測試也稱結(jié)構(gòu)測試或邏輯驅(qū)動測試,是針對白盒測試方法(續(xù))采用白盒測試方法必須遵循以下幾條原則,才能達(dá)到測試的目的:保證一個(gè)模塊中的所有獨(dú)立路徑至少被測試一次。所有邏輯值均需測試真(true)和假(false)兩種情況。檢查程序的內(nèi)部數(shù)據(jù)結(jié)構(gòu),保證其結(jié)構(gòu)的有效性。在上下邊界及可操作范圍內(nèi)運(yùn)行所有循環(huán)。白盒測試方法(續(xù))采用白盒測試方法必須遵循以下幾條原則,才能白盒測試常用的測試用例設(shè)計(jì)方法邏輯覆蓋以程序內(nèi)部的邏輯結(jié)構(gòu)為基礎(chǔ);根據(jù)覆蓋測試的目標(biāo),邏輯覆蓋分為:語句、判定、條件、判定/條件、組合、路徑基本路徑測試為了解決路徑龐大難題;在程序控制流程圖的基礎(chǔ)上,分析控制構(gòu)造的環(huán)路復(fù)雜性,導(dǎo)出基本可執(zhí)行路徑集合,設(shè)計(jì)測試用例的方法。白盒測試常用的測試用例設(shè)計(jì)方法邏輯覆蓋3.3控制流圖控制流圖(可簡稱流圖)是對程序流程圖進(jìn)行簡化后得到的,它可以更加突出的表示程序控制流的結(jié)構(gòu),唯一的??刂屏鲌D中包括兩種圖形符號:節(jié)點(diǎn)和控制流線。節(jié)點(diǎn)由帶標(biāo)號的圓圈表示,可代表一個(gè)或多個(gè)語句、一個(gè)處理框序列和一個(gè)條件判定框(假設(shè)不包含復(fù)合條件)。控制流線由帶箭頭的弧或線表示,可稱為邊。它代表程序中的控制流。對于復(fù)合條件,則可將其分解為多個(gè)單個(gè)條件,并映射成控制流圖。常見結(jié)構(gòu)的控制流圖3.3控制流圖控制流圖(可簡稱流圖)是對程序流程圖進(jì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é)構(gòu)的控制流圖其中,包含條件的節(jié)點(diǎn)被稱為判定節(jié)點(diǎn)(也叫謂軟件測試-3白盒測試及其用例的設(shè)計(jì)課件軟件測試-3白盒測試及其用例的設(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覆蓋測試3.4.1測試覆蓋率3.4.2邏輯覆蓋法3.4.3功能覆蓋3.4.4其他覆蓋3.4.5如何使用覆蓋率3.4.6測試覆蓋準(zhǔn)則3.3覆蓋測試3.4.1測試覆蓋率結(jié)構(gòu)測試中的一個(gè)重要問題是,測試進(jìn)行到什么地步就達(dá)到要求,可以結(jié)束測試。這需要給出結(jié)構(gòu)測試的覆蓋準(zhǔn)則。結(jié)構(gòu)測試中的一個(gè)重要問題是,測試進(jìn)行到什么地步就達(dá)到要求,可3.3.1測試覆蓋率測試覆蓋率:用于確定測試所執(zhí)行到的覆蓋項(xiàng)的百分比。其中的覆蓋項(xiàng)是指作為測試基礎(chǔ)的一個(gè)入口或?qū)傩裕热缯Z句、分支、條件等。通過覆蓋率數(shù)據(jù)可以知道測試得是否充分,測試的弱點(diǎn)在哪些方面,從而指導(dǎo)我們設(shè)計(jì)能夠增加覆蓋率的測試用例。能夠有效地提高測試質(zhì)量,避免設(shè)計(jì)無效用例。在測試分析報(bào)告中可以作為量化指標(biāo)的依據(jù),測試覆蓋率越高效果越好。但覆蓋率不是目標(biāo),只是一種手段。3.3.1測試覆蓋率測試覆蓋率:用于確定測試所執(zhí)行到的覆覆蓋率概念覆蓋率是用來度量測試完整性的一個(gè)手段。本身并不包含測試技術(shù),只是測試技術(shù)有效性的一個(gè)度量。

覆蓋率種類:邏輯覆蓋(LogicalCoverage),也叫:代碼覆蓋率(CodeCoverage)結(jié)構(gòu)化覆蓋率(StructuralCoverage)功能覆蓋(FunctionCoverage)。

覆蓋率概念覆蓋率是用來度量測試完整性的一個(gè)手段。本身3.3.2邏輯覆蓋法根據(jù)覆蓋目標(biāo)的不同,邏輯覆蓋可分為語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。語句覆蓋:選擇若干個(gè)測試用例,運(yùn)行被測程序,使得程序中的每個(gè)可執(zhí)行語句至少執(zhí)行一次。覆蓋指標(biāo)C0判定覆蓋(分支覆蓋):選擇若干個(gè)測試用例,運(yùn)行被測程序,使得程序中的每個(gè)判斷真假值均曾被滿足,也就是使程序中的每個(gè)取“真”分支和取“假”分支至少均經(jīng)歷一次。覆蓋指標(biāo)C1條件覆蓋:選擇若干個(gè)測試用例,運(yùn)行被測程序,使得程序中每個(gè)判定包含的每個(gè)條件的可能取值(真/假)都至少滿足一次。3.3.2邏輯覆蓋法根據(jù)覆蓋目標(biāo)的不同,邏輯覆蓋可分為語邏輯覆蓋法(續(xù))判定-條件覆蓋:設(shè)計(jì)足夠多的測試用例,使得程序中每個(gè)判定包含的每個(gè)條件的所有情況(真/假)至少出現(xiàn)一次,并且每個(gè)判定本身的判定結(jié)果(真/假)也至少出現(xiàn)一次。——滿足判定-條件覆蓋的測試用例一定同時(shí)滿足判定覆蓋和條件覆蓋。組合覆蓋:通過執(zhí)行足夠的測試用例,使得程序中每個(gè)判定的所有可能的條件取值組合都至少出現(xiàn)一次。覆蓋指標(biāo)CMCC

——滿足組合覆蓋的測試用例一定滿足判定覆蓋、條件覆蓋和判定-條件覆蓋。路徑覆蓋:設(shè)計(jì)足夠多的測試用例,要求覆蓋程序中所有可能的路徑。覆蓋指標(biāo)C∞邏輯覆蓋法(續(xù))判定-條件覆蓋:設(shè)計(jì)足夠多的測試用例,使得程邏輯覆蓋法(續(xù))組合覆蓋判定-條件覆蓋判定覆蓋條件覆蓋語句覆蓋邏輯覆蓋法(續(xù))組合覆蓋判定-條件覆蓋判定覆蓋條件覆蓋語句覆邏輯覆蓋法(續(xù))voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;j=sqrt(k);}//語句塊1if((x==4)||(y>5)){j=x*y+10;}//語句塊2

j=j%3;//語句塊3}邏輯覆蓋法(續(xù))voidDoWork(intx,in邏輯覆蓋法(續(xù))X>3&&z<10執(zhí)行語句塊1執(zhí)行語句塊2X==4||y>5執(zhí)行語句塊3FFTTabdce邏輯覆蓋法(續(xù))X>3&&z<10執(zhí)行語句塊1執(zhí)行語句塊語句覆蓋要實(shí)現(xiàn)DoWork函數(shù)的語句覆蓋,只需設(shè)計(jì)一個(gè)測試用例就可以覆蓋程序中的所有可執(zhí)行語句。測試用例輸入為:{x=4、y=5、z=5}程序執(zhí)行的路徑是:abd分析:語句覆蓋可以保證程序中的每個(gè)語句都得到執(zhí)行,但發(fā)現(xiàn)不了判定中邏輯運(yùn)算的錯誤,即它并不是一種充分的檢驗(yàn)方法。例如在第一個(gè)判定((x>3)&&(z<10))中把“&&”錯誤的寫成了“||”,這時(shí)仍使用該測試用例,則程序仍會按照流程圖上的路徑abd執(zhí)行。可以說語句覆蓋是最弱的邏輯覆蓋準(zhǔn)則。語句覆蓋要實(shí)現(xiàn)DoWork函數(shù)的語句覆蓋,只需設(shè)計(jì)一個(gè)測試用判定覆蓋注:教材中又稱為DD-路徑覆蓋,測試滿足DD-路徑覆蓋要求可以發(fā)現(xiàn)全部缺陷的85%要實(shí)現(xiàn)DoWork函數(shù)的判定覆蓋,需要設(shè)計(jì)兩個(gè)測試用例。測試用例的輸入為:{x=4、y=5、z=5};{x=2、y=5、z=5}程序執(zhí)行的路徑分別是:abd;ace分析:上述兩個(gè)測試用例不僅滿足了判定覆蓋,同時(shí)還做到語句覆蓋。從這點(diǎn)看似乎判定覆蓋比語句覆蓋更強(qiáng)一些,但仍然無法確定判定內(nèi)部條件的錯誤。例如把第二個(gè)判定中的條件y>5錯誤寫為y<5,使用上述測試用例,照樣能按原路徑執(zhí)行而不影響結(jié)果。因此,需要有更強(qiáng)的邏輯覆蓋準(zhǔn)則去檢驗(yàn)判定內(nèi)的條件。判定覆蓋注:教材中又稱為DD-路徑覆蓋,測試滿足DD-路徑覆判定覆蓋(續(xù))13524說明:以上僅考慮了兩出口的判斷,我們還應(yīng)把判定覆蓋準(zhǔn)則擴(kuò)充到多出口判斷(如Case語句)的情況。因此,判定覆蓋更為廣泛的含義應(yīng)該是使得每一個(gè)判定獲得每一種可能的結(jié)果至少一次。6789105’判定覆蓋(續(xù))13524說明:以上僅考慮了兩出口的判斷,我們條件覆蓋在實(shí)際程序代碼中,一個(gè)判定中通常都包含若干條件。條件覆蓋的目的是設(shè)計(jì)若干測試用例,在執(zhí)行被測程序后,要使每個(gè)判定中每個(gè)條件的可能值至少滿足一次。對DoWork函數(shù)的各個(gè)判定的各種條件取值加以標(biāo)記。對于第一個(gè)判定((x>3)&&(z<10)): 條件x>3取真值記為T1,取假值記為-T1

條件z<10取真值記為T2,取假值記為-T2對于第二個(gè)判定((x==4)||(y>5)):條件x==4取真值記為T3,取假值記為-T3條件y>5取真值記為T4,取假值記為-T4條件覆蓋在實(shí)際程序代碼中,一個(gè)判定中通常都包含若干條件。條條件覆蓋(續(xù))根據(jù)條件覆蓋的基本思想,要使上述4個(gè)條件可能產(chǎn)生的8種情況至少滿足一次,設(shè)計(jì)測試用例如下:分析:上面這組測試用例不但覆蓋了4個(gè)條件的全部8種情況,而且將兩個(gè)判定的4個(gè)分支b、c、d、e也同時(shí)覆蓋了,即同時(shí)達(dá)到了條件覆蓋和判定覆蓋。條件覆蓋(續(xù))根據(jù)條件覆蓋的基本思想,要使上述4個(gè)條件可能產(chǎn)條件覆蓋(續(xù))說明:雖然前面的一組測試用例同時(shí)達(dá)到了條件覆蓋和判定覆蓋,但是,并不是說滿足條件覆蓋就一定能滿足判定覆蓋。如果設(shè)計(jì)了下表中的這組測試用例,則雖然滿足了條件覆蓋,但只是覆蓋了程序中第一個(gè)判定的取假分支c和第二個(gè)判定的取真分支d,不滿足判定覆蓋的要求。條件覆蓋(續(xù))說明:雖然前面的一組測試用例同時(shí)達(dá)到了條件覆蓋判定-條件覆蓋判定-條件覆蓋實(shí)際上是將判定覆蓋和條件覆蓋結(jié)合起來的一種方法,即:設(shè)計(jì)足夠的測試用例,使得判定中每個(gè)條件的所有可能取值至少滿足一次,同時(shí)每個(gè)判定的可能結(jié)果也至少出現(xiàn)一次。根據(jù)判定-條件覆蓋的基本思想,只需設(shè)計(jì)以下兩個(gè)測試用例便可以覆蓋4個(gè)條件的8種取值以及4個(gè)判定分支。判定-條件覆蓋判定-條件覆蓋實(shí)際上是將判定覆蓋和條件覆蓋結(jié)合判定-條件覆蓋(續(xù))分析:從表面上看,判定-條件覆蓋測試了各個(gè)判定中的所有條件的取值,但實(shí)際上,編譯器在檢查含有多個(gè)條件的邏輯表達(dá)式時(shí),某些情況下的某些條件將會被其它條件所掩蓋。因此,判定-條件覆蓋也不一定能夠完全檢查出邏輯表達(dá)式中的錯誤。例如:對于第一個(gè)判定(x>3)&&(z<10)來說,必須x>3和z<10這兩個(gè)條件同時(shí)滿足才能確定該判定為真。如果x>3為假,則編譯器將不再檢查z<10這個(gè)條件,那么即使這個(gè)條件有錯也無法被發(fā)現(xiàn)。對于第二個(gè)判定(x==4)||(y>5)來說,若條件x==4滿足,就認(rèn)為該判定為真,這時(shí)將不會再檢查y>5,那么同樣也無法發(fā)現(xiàn)這個(gè)條件中的錯誤。判定-條件覆蓋(續(xù))分析:從表面上看,判定-條件覆蓋測試了各組合覆蓋組合覆蓋的目的是要使設(shè)計(jì)的測試用例能覆蓋每一個(gè)判定的所有可能的條件取值組合。對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ì)的測試用例能覆蓋每一個(gè)判定的組合覆蓋(續(xù))根據(jù)組合覆蓋的基本思想,設(shè)計(jì)測試用例如下:分析:上面這組測試用例覆蓋了所有8種條件取值的組合,覆蓋了所有判定的真假分支,但是卻丟失了一條路徑abe。組合覆蓋(續(xù))根據(jù)組合覆蓋的基本思想,設(shè)計(jì)測試用例如下:分析路徑覆蓋前面提到的5種邏輯覆蓋都未涉及到路徑的覆蓋。事實(shí)上,只有當(dāng)程序中的每一條路徑都受到了檢驗(yàn),才能使程序受到全面檢驗(yàn)。路徑覆蓋的目的就是要使設(shè)計(jì)的測試用例能覆蓋被測程序中所有可能的路徑。根據(jù)路徑覆蓋的基本思想,在滿足組合覆蓋的測試用例中修改其中一個(gè)測試用例,則可以實(shí)現(xiàn)路徑覆蓋:路徑覆蓋前面提到的5種邏輯覆蓋都未涉及到路徑的覆蓋。事實(shí)上,路徑覆蓋(續(xù))分析:雖然前面一組測試用例滿足了路徑覆蓋,但并沒有覆蓋程序中所有的條件組合(丟失了組合3和7),即滿足路徑覆蓋的測試用例并不一定滿足組合覆蓋。說明:對于比較簡單的小程序,實(shí)現(xiàn)路徑覆蓋是可能做到的。但如果程序中出現(xiàn)較多判斷和較多循環(huán),可能的路徑數(shù)目將會急劇增長,要在測試中覆蓋所有的路徑是無法實(shí)現(xiàn)的。為了解決這個(gè)難題,只有把覆蓋路徑數(shù)量壓縮到一定的限度內(nèi),如程序中的循環(huán)體只執(zhí)行一次。在實(shí)際測試中,即使對于路徑數(shù)很有限的程序已經(jīng)做到路徑覆蓋,仍然不能保證被測試程序的正確性。路徑覆蓋(續(xù))分析:雖然前面一組測試用例滿足了路徑覆蓋,但并邏輯覆蓋小結(jié)各種結(jié)構(gòu)測試方法都不能保證程序的正確性。測試的目的并非要證明程序的正確性,而是要盡可能找出程序中的錯誤。邏輯覆蓋率可以作為測試完整性的一個(gè)度量。即使達(dá)到100%的邏輯覆蓋率,仍然無法保證程序的正確性;確實(shí)并不存在一種十全十美的測試方法,能夠發(fā)現(xiàn)所有的錯誤。邏輯覆蓋小結(jié)各種結(jié)構(gòu)測試方法都不能保證程序的正確性。3.4.3功能覆蓋 功能覆蓋屬于黑盒測試范疇。常見的是需求覆蓋和接口覆蓋。

需求覆蓋:通過設(shè)計(jì)一定的測試用例,要求每個(gè)需求點(diǎn)都被測試到。

接口覆蓋:也叫入口點(diǎn)覆蓋,接口覆蓋要求通過設(shè)計(jì)一定的用例使系統(tǒng)的每個(gè)接口都被測試到。

3.4.3功能覆蓋 功能覆蓋屬于黑盒測試范疇。常見的是需求3.4.4其他覆蓋率函數(shù)覆蓋定義:在測試中有哪些函數(shù)被測試到了,其被測試到的頻率有多大,這些函數(shù)在系統(tǒng)所有函數(shù)中占的比例有多大。是針對系統(tǒng)或一個(gè)子系統(tǒng)而測試的;比較容易自動化(TrueCoveragePureCoverage);易于理解。指令塊覆蓋是語句覆蓋的一個(gè)變體。3.4.4其他覆蓋率函數(shù)覆蓋3.4.5如何使用覆蓋率 在選擇和使用覆蓋率時(shí),必須遵循的基本原則:覆蓋率不是目的,只是一種手段;不可能針對所有的覆蓋率指標(biāo)去進(jìn)行測試;只考慮一種覆蓋率指標(biāo)也是不恰當(dāng)?shù)?;不要追求絕對100%的覆蓋率。3.4.5如何使用覆蓋率 在選擇和使用覆蓋率時(shí),必須遵循評價(jià)標(biāo)準(zhǔn)覆蓋率度量覆蓋率評價(jià)表評價(jià)標(biāo)準(zhǔn)覆蓋覆蓋率評價(jià)表課堂練習(xí)為以下流程圖所示的程序段設(shè)計(jì)一組測試用例,要求分別滿足語句覆蓋、判定覆蓋、條件覆蓋、判定-條件覆蓋、組合覆蓋和路徑覆蓋。(A>1)and(B=0)(A=2)or(X>1)X=X/AX=X+1TTFFbdcea課堂練習(xí)為以下流程圖所示的程序段設(shè)計(jì)一組測試用例,要求分別滿A=2,B=0,X=4(沿路徑ace執(zhí)行);語句覆蓋測試用例A=2,B=0,X=4(沿路徑ace執(zhí)行);語句覆蓋測試用A=3,B=0,X=3(acd);A=2,B=1,X=1(abe);aa判定覆蓋測試用例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);條件覆蓋測試用例A=2,B=1,X=1(abe);A=1,B=0,X=3判定-條件覆蓋測試用例判定-條件覆蓋測試用例判定條件的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種組合:組合覆蓋測試用例組合覆蓋測試用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abe)組合覆蓋測試用例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)組合覆蓋測試用例A=1,B=1,X=1(abd)A=1,B=0,X=3(ab路徑覆蓋測試用例路徑覆蓋測試用例3.7數(shù)據(jù)流測試數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目標(biāo)碼而出現(xiàn)的,這類方法主要用于代碼優(yōu)化。近年來在測試中也得到成功運(yùn)用,查找引用未定義變量等程序錯誤,查找對以前未曾使用的變量再次賦值等數(shù)據(jù)流異常的情況。這常常是常見程序錯誤的表現(xiàn)形式,如:錯拼名字、名字混淆或丟失了語句。3.7數(shù)據(jù)流測試數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目數(shù)據(jù)流測試關(guān)注變量定義賦值點(diǎn)(語句)和引用或使用這些值的點(diǎn)(語句)的結(jié)構(gòu)性測試。用作路徑測試的真實(shí)性檢查。程序和程序的元素通過它們的數(shù)據(jù)訪問行為關(guān)聯(lián)起來,確定了數(shù)據(jù)流關(guān)系。數(shù)據(jù)流測試形式:定義/使用測試基于程序片的測試定義/使用路徑和片的定義能夠非常準(zhǔn)確地描述要測試的程序部分?jǐn)?shù)據(jù)流測試關(guān)注變量定義賦值點(diǎn)(語句)和引用或使用這些值的點(diǎn)(常見的數(shù)據(jù)流異常包括:變量被定義,但是從來沒有使用;所使用的變量沒有被定義;變量在使用之前被定義兩次;等待一個(gè)還沒有被安排的進(jìn)程;安排一個(gè)與其自身相同的進(jìn)程;等待一個(gè)先前已經(jīng)被中止了的進(jìn)程;引用一個(gè)在并行進(jìn)程中被定義的變量;引用一個(gè)值不確定的變量。這些異常通過靜態(tài)分析發(fā)現(xià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在語句第5行處的引用可能沒有被定義,這是因?yàn)槿蝿?wù)T1可能在任務(wù)T2開始前結(jié)束;在任務(wù)T2(第10行)以及主程序第20行發(fā)現(xiàn)的變量y的定義可能沒有用,這是因?yàn)閥會在其可能被引用前在第22行被重新定義;y被兩個(gè)可能并行執(zhí)行的進(jìn)程定義,并且這樣在第23行的引用其值可能是無法確定的;變量x在任務(wù)T2(第9行)被賦了一個(gè)值,然而,同時(shí)又在主程序第19行處被引用;可能的異常變量x在語句第5行處的引用可能沒有被定義,這是因?yàn)榭赡艿漠惓#ɡm(xù))存在這樣一個(gè)可能性,即T1可能在第25行被并行安排,因?yàn)闆]有任何保證T1在最初被安排后會終結(jié);第24行的等待是沒有必要的,因?yàn)門2被保證在第21行終結(jié),并且隨后沒有再被安排過;第6行的等待永遠(yuǎn)不會被滿足,因?yàn)門3從來沒有被安排過??赡艿漠惓#ɡm(xù))存在這樣一個(gè)可能性,即T1可能在第25行被并例如例如第一個(gè)語句定義3個(gè)變量X,Y和Z;表明它們的值是程序外賦給的。出口語句引用Z,表明Z的值被送給外部環(huán)境。第一個(gè)語句定義3個(gè)變量X,Y和Z;表明它們的值是程序外賦給的該程序含有2個(gè)錯誤:語句2使用了變量W,而在此之前未定義;語句5、6使用變量V,這在第一次執(zhí)行循環(huán)時(shí)也未對其定義過。該程序還包含兩個(gè)異常:語句6對Z的定義從未使用過;語句8對W的定義也從未使用過??梢园殉绦?qū)懙酶菀桌斫?,從而能夠簡化?yàn)證工作,以及隨后的維護(hù)工作。該程序含有2個(gè)錯誤:該方法提供一種檢查缺陷可能發(fā)生點(diǎn)的嚴(yán)格和系統(tǒng)化方法。假設(shè)程序圖中的節(jié)點(diǎn)代表語句片段,且程序遵循結(jié)構(gòu)化程序設(shè)計(jì)規(guī)則,不允許有從節(jié)點(diǎn)到自身的邊。P——程序G(P)——P的程序圖V——P的一組程序變量,v——P的變量PATHS(P)——P中所有路徑集合3.7.1定義/使用測試該方法提供一種檢查缺陷可能發(fā)生點(diǎn)的嚴(yán)格和系統(tǒng)化方法。3.7.v的定義節(jié)點(diǎn)n∈G(P):當(dāng)且僅當(dāng)v的值由對應(yīng)節(jié)點(diǎn)n的語句片段處定義,DEF(v,n)v的使用節(jié)點(diǎn)n∈G(P):當(dāng)且僅當(dāng)v的值由對應(yīng)節(jié)點(diǎn)n的語句片段處使用,USE(v,n)USE(v,n)是謂詞使用(P-use,外度≥2):當(dāng)且僅當(dāng)語句n是謂詞語句,否則是計(jì)算使用(C-use,外度≤1)。定義v的定義節(jié)點(diǎn)n∈G(P):當(dāng)且僅當(dāng)v的值由對應(yīng)節(jié)點(diǎn)n的語句X:=Y(jié)+ZIfY>ZthengotoexitREADX//輸入語句WRITEX//輸出語句X:=Y(jié)+Zv的定義-使用路徑(du-path):PATHS(P)中的路徑,使對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)的路徑,該路徑中沒有其它節(jié)點(diǎn)是v的定義節(jié)點(diǎn)。注意:不是定義-清除的定義-使用路徑,可能是出問題的地方。v的定義-使用路徑(du-path):PATHS(P)中的舉例(傭金問題)偽代碼、程序圖、DD路徑表、DD-路徑圖變量定義節(jié)點(diǎn)和使用節(jié)點(diǎn)(表10-2)舉例(傭金問題)部分變量的定義/使用路徑(表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)的定義清除路徑定義/使用路徑測試覆蓋指標(biāo)假設(shè):定義/使用路徑均可行;T:擁有變量集合V的程序P的程序圖G(P)中的一個(gè)路徑集合全定義準(zhǔn)則:定義/使用路徑測試覆蓋指標(biāo)全謂詞使用/部分計(jì)算使用準(zhǔn)則: 當(dāng)且僅當(dāng)T包含從所有v的每個(gè)定義節(jié)點(diǎn)到v的所有謂詞使用的定義清除路徑,如果v的一個(gè)定義沒有謂詞使用,則定義清除路徑導(dǎo)致至少一個(gè)計(jì)算使用全計(jì)算使用/部分謂詞使用準(zhǔn)則: 當(dāng)且僅當(dāng)T包含從所有v的每個(gè)定義節(jié)點(diǎn)到v的所有計(jì)算使用的定義清除路徑,如果v的一個(gè)定義沒有計(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)過,要么沒有環(huán)路。

定義/使用路徑測試覆蓋指標(biāo)以上面5種情況為依據(jù)選擇路徑的集合,這些指標(biāo)的關(guān)系如下:全定義-使用路徑準(zhǔn)則:定義/使用路徑測試覆蓋指標(biāo)關(guān)系全路徑全定義-使用路徑全使用全計(jì)算使用/部分謂詞使用全謂詞使用/部分計(jì)算使用全定義全謂詞使用全邊全節(jié)點(diǎn)高低定義/使用路徑測試覆蓋指標(biāo)關(guān)系全路徑全定義-使用路徑全使用全程序片是確定或影響某個(gè)變量在程序某個(gè)點(diǎn)上的取值的一組程序語句;片測試可以消除變量之間的交互對測試的影響;片測試的原則是選擇恰當(dāng),完整的片,對每個(gè)片進(jìn)行測試。3.7.2基于程序片的測試3.7.2基于程序片的測試定義:P中對V中的變量值作出貢獻(xiàn)的所有語句的集合,即V在語句n上的一個(gè)片,S(V,n)或P中在n以前對V中的變量值作出貢獻(xiàn)的所有語句片段編號的集合,即V在語句片段n上的一個(gè)片,S(V,n)程序片程序片片和貢獻(xiàn)的含義片:將程序分為具有某種功能/含義的組件;貢獻(xiàn)(USE):

謂詞使用用在謂詞(判斷)中 計(jì)算使用用在計(jì)算中 輸出使用用于輸出 定位使用用于定位(指針、下標(biāo)) 迭代使用迭代(內(nèi)部計(jì)數(shù)器、循環(huán)指示) 輸入定義通過輸入定義 賦值定義通過賦值定義片內(nèi)語句片斷選擇原則:包含和不包含該語句片段,變量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的值在語句12的切片:第一個(gè)切片1begin1begin變量z的值在語句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的值在語句12的切片:第二個(gè)切片1begin1begin變量total的值補(bǔ)充:程序分析技術(shù)1.程序插裝2.故障插入3.程序變異補(bǔ)充:程序分析技術(shù)1.程序插裝程序插裝(ProgramInstrumentation)是一種基本的測試手段,在軟件測試中有著廣泛的應(yīng)用。程序插裝(ProgramInstrumentation)是1.程序插裝定義:是借助向被測程序中插入操作來實(shí)現(xiàn)測試目的的方法。好處:能夠按用戶的要求,獲取程序的各種信息,成為測試工作的有效手段。所帶來的負(fù)面影響: 插裝過的代碼比原先的代碼大且運(yùn)行得慢。可能會掩蓋時(shí)間、規(guī)模和位置,尤其對實(shí)時(shí)系統(tǒng)。1.程序插裝定義:是借助向被測程序中插入操作來實(shí)現(xiàn)測試目的的程序插裝的應(yīng)用測試覆蓋率度量;測試用例有效性度量;斷言檢測;數(shù)據(jù)流異常檢測;路徑智能分解。程序插裝的應(yīng)用測試覆蓋率度量;1)用于測試覆蓋率度量的程序插裝具體實(shí)施步驟:在控制流中確定一個(gè)點(diǎn)集;在程序中的這些點(diǎn)上插入軟件計(jì)數(shù)器;用一組測試用例測試這個(gè)程序;檢查計(jì)數(shù)器的值以確定獲得的覆蓋率的范圍。凡經(jīng)歷的計(jì)數(shù)語句都能記錄下該程序點(diǎn)的實(shí)際執(zhí)行次數(shù)1)用于測試覆蓋率度量的程序插裝具體實(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)+插裝程序中插入的語句插裝程序中插入的語句設(shè)計(jì)插裝程序時(shí)需考慮的問題探測哪些信息;在程序的什么部位設(shè)置探測點(diǎn);需要設(shè)置多少個(gè)探測點(diǎn)。 在一般情況,在沒有分支的程序段中只需一個(gè)計(jì)數(shù)語句。為了在程序中設(shè)置最少的計(jì)數(shù)語句,需要針對程序的控制結(jié)構(gòu)具體分析。設(shè)計(jì)插裝程序時(shí)需考慮的問題探測哪些信息;至少在哪些部位設(shè)置計(jì)數(shù)語句的建議程序塊的第一個(gè)可執(zhí)行語句之前;有標(biāo)號的可執(zhí)行語句處;BLOCK-IF、ELSEIF、ELSE及ENDIF語句之后;DO、DOWHILE、DOUNTIL及DO終端語句之后;輸入/輸出語句之后;CALL語句之后;

至少在哪些部位設(shè)置計(jì)數(shù)語句的建議程序塊的第一個(gè)可執(zhí)行語句之前2)用于測試用例的有效性度量的程序插裝測試用例的有效性是指該用例揭示程序錯誤的能力;程序的測試用例的單一指數(shù):在一次特定測試執(zhí)行期間,一個(gè)測試用例唯一地關(guān)注于遇到的一個(gè)多重表達(dá)式的次數(shù)。單一指數(shù)越高,測試用例的有效性越低。2)用于測試用例的有效性度量的程序插裝測試用例的有效性是指該例一個(gè)語句包含a×(c+(d/e))一個(gè)表達(dá)式,則這個(gè)表達(dá)式存在3個(gè)需要關(guān)注的因子:a、(c+(d/e))、d。設(shè)計(jì)一個(gè)工具用來插裝該表達(dá)式:

If(a==0)si++;If((c+(d/e))==0)si++;If(d==0)si++;其中si是變量,用于存儲測試用例的單一指數(shù)例一個(gè)語句包含a×(c+(d/e))一個(gè)表達(dá)式,則這個(gè)表達(dá)式3)用于斷言檢測的程序插裝在程序的特定部位插入某些用以判斷變量特性的語句,使這些語句在程序執(zhí)行中得以證實(shí),從而使程序的運(yùn)行特性得以證實(shí);插入的這些語句稱為斷言(Assertions)。斷言是程序插裝的一個(gè)典型使用;但在實(shí)際中不是那么好用; 必須在程序的正確位置放入正確的斷言;分析到底是程序錯誤引起的還是因?yàn)椴徽_的斷言引起的違例。3)用于斷言檢測的程序插裝在程序的特定部位插入某些用以判斷變例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ì)的方法,用于評價(jià)遺留在一個(gè)程序中的故障數(shù)量和種類。計(jì)算公式:原本錯誤總數(shù)=(插入的錯誤總數(shù)/發(fā)現(xiàn)的插入錯誤數(shù))×發(fā)現(xiàn)的原本錯誤數(shù)殘留錯誤數(shù)=原本錯誤總數(shù)-發(fā)現(xiàn)的原本錯誤數(shù)2.故障插入(FaultSeeding)是一個(gè)統(tǒng)計(jì)的方法,故障插入用于軟件可靠性方面比較廣泛(尤其在硬件的測試中);通過有意插入的故障來調(diào)用系統(tǒng)的故障容錯能力,在一個(gè)可控制的環(huán)境和期望的時(shí)間段內(nèi)獲得完整的測試;與現(xiàn)有測試方法比較:現(xiàn)有的測試是從系統(tǒng)的正確狀態(tài)開始,測試系統(tǒng)如何轉(zhuǎn)入故障狀態(tài)。故障注入測試從系統(tǒng)的故障狀態(tài)開始,測試系統(tǒng)在發(fā)生故障后的運(yùn)行規(guī)律;故障插入用于軟件可靠性方面比較廣泛(尤其在硬件的測試中);故障插入用于驗(yàn)證測試用例有效性原理: 為了檢查設(shè)計(jì)的測試用例是否能發(fā)現(xiàn)某一類型的故障,人為地在被測系統(tǒng)中引入該類型的故障,如果在測試過程中能發(fā)現(xiàn)這個(gè)故障,則應(yīng)該也可以測試出系統(tǒng)原來就存在的該類故障。故障插入用于驗(yàn)證測試用例有效性原理:經(jīng)過若干年的測試?yán)碚撗芯亢蛙浖y試的實(shí)踐,人們逐漸發(fā)現(xiàn)要想找出程序中所有的錯誤幾乎是不可能的。比較現(xiàn)實(shí)的解決辦法是將錯誤的搜索范圍盡可能縮小,以利于專門測試某類錯誤是否存在。經(jīng)過若干年的測試?yán)碚撗芯亢蛙浖y試的實(shí)踐,人們逐漸發(fā)現(xiàn)要想找3.程序變異(MutationAnalysis)定義:使用故障插入來分析測試數(shù)據(jù)的屬性。變異:帶有插入錯誤的程序;產(chǎn)物:關(guān)于測試數(shù)據(jù)能夠在多大程度上殺死變體的度量;變體通過使用一個(gè)變體操作產(chǎn)生。3.程序變異(MutationAnalysis)定義:使用程序P的變異因子m(P)也是一個(gè)程序,它是對P進(jìn)行微小改動而得到的。如果程序P是正確的,m(P)是一個(gè)幾乎正確的程序。如果P不正確,則P的某一個(gè)變異因子m(P)可能是正確的。假設(shè)P有一組測試數(shù)據(jù),為D。我們現(xiàn)在關(guān)心的是P在D上無錯誤的情況。怎樣確定程序的正確程度呢?程序P的變異因子m(P)也是一個(gè)程序,它是對P進(jìn)行微小改動而程序變異思想若P在D上是正確的,可以找出P的變異因子的某一集合:m={M(P)|m(P)是P的變異因子}若m中每一元素在D上都存在錯誤,則可認(rèn)為程序的正確程度較高。若m中某些元素在D上不存在錯誤,則可能存在3種情況:這些變異因子與P在功能上是等價(jià)的;現(xiàn)有的測試數(shù)據(jù)不足以找出P與其變異因子間的差別;P可能含有錯誤,而其某些變異因子卻是正確的。程序變異思想若P在D上是正確的,可以找出P的變異因子的某一集仔細(xì)核對P及其m(P),避免的一種情況出現(xiàn);P與某些m(P)都正確時(shí),可能測試數(shù)據(jù)太少、不夠典型造成。應(yīng)該增加測試數(shù)據(jù),直到所有m(P)都出錯;第三種情況提醒我們,當(dāng)許多典型的測試數(shù)據(jù)仍然不能使某一m(P)出錯時(shí),此m(P)可能是程序的正確形式。仔細(xì)核對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)鍵:要求測試數(shù)據(jù)集D和變異因子集m(P)都需精心挑選。怎樣建立變異因子?可將其看作是變異操作符作用在被測程序上的結(jié)果。關(guān)鍵:要求測試數(shù)據(jù)集D和變異因子集m(P)都需精心挑選。變體操作的構(gòu)造與程序設(shè)計(jì)語言密切相關(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語句刪除GOTO語句替換GOTO20→GOTO30…變體操作的構(gòu)造與程序設(shè)計(jì)語言密切相關(guān); 通過變異分析構(gòu)造測試數(shù)據(jù)的過程是一個(gè)循環(huán)過程。測試人員提供被測程序以及初始數(shù)據(jù)、變異運(yùn)算符。當(dāng)P和m(P)被初始測試數(shù)據(jù)測試后,可能會有變異因子未被發(fā)現(xiàn)錯誤??梢栽黾訙y試數(shù)據(jù)。若所有的m(P)均出錯,也可以增加新的m(P)。然后進(jìn)行下一輪變異測試。 通過變異分析構(gòu)造測試數(shù)據(jù)的過程是一個(gè)循環(huán)過程。 Budd等人統(tǒng)計(jì)了他們設(shè)計(jì)的程序變異系統(tǒng)在輔助測試人員進(jìn)行測試的效果。被測程序13個(gè),共包含30個(gè)錯誤。統(tǒng)計(jì)結(jié)果如下圖: Budd等人統(tǒng)計(jì)了他們設(shè)計(jì)的程序變異系統(tǒng)在輔助測試人員進(jìn)行程序變異由于其針對性強(qiáng)、系統(tǒng)性強(qiáng),正成為軟件測試中一種相當(dāng)活躍的辦法。特別是在變異測試系統(tǒng)支持下,用戶可以更有效地測試自己的程序。程序變異由于其針對性強(qiáng)、系統(tǒng)性強(qiáng),正成為軟件測試中一種相當(dāng)活習(xí)題1、使用基本路徑測試方法,為以下程序段設(shè)計(jì)測試用例。voidDo(intX,intA,intB){1if((A>1)&&(B=0))2X=X/A;3if((A=2)||(X>1))4X=X+1;5}習(xí)題1、使用基本路徑測試方法,為以下程序段設(shè)計(jì)測試用例。2、某程序所畫出的N-S圖如右圖所示的,至少需要多少個(gè)測試用例才能對該程序?qū)崿F(xiàn)邏輯覆蓋?習(xí)題2、某程序所畫出的N-S圖如右圖所示的,至少需要多少個(gè)測試用3、判斷正誤并說明理由(可以舉例):在沒有產(chǎn)品說明書和需求文檔的條件下可以進(jìn)行動態(tài)黑盒測試;靜態(tài)白盒測試可以找出軟件的遺漏之處和問題;白盒測試的條件覆蓋標(biāo)準(zhǔn)強(qiáng)于判定覆蓋。4、試分析動態(tài)白盒子測試(dynamicwhite-boxtesting)和調(diào)試(debugging)有何異同。習(xí)題3、判斷正誤并說明理由(可以舉例):習(xí)題第3章白盒測試及其用例的設(shè)計(jì)3.1白盒測試方法3.2控制流圖3.3白盒測試覆蓋指標(biāo)3.4數(shù)據(jù)流測試3.5白盒測試方法總結(jié)第3章白盒測試及其用例的設(shè)計(jì)3.1白盒測試方法本章教學(xué)目標(biāo)理論環(huán)節(jié)學(xué)習(xí)理解白盒測試方法的基本概念學(xué)習(xí)理解白盒測試的覆蓋理論學(xué)習(xí)掌握白盒測試的路徑表達(dá)學(xué)習(xí)掌握白盒測試的基本路徑測試法學(xué)習(xí)掌握白盒測試的數(shù)據(jù)流測試法實(shí)踐環(huán)節(jié)通過案例運(yùn)用學(xué)習(xí)掌握覆蓋問題的解決方法運(yùn)用基本路徑測試方法進(jìn)行實(shí)際程序測試本章教學(xué)目標(biāo)理論環(huán)節(jié)3.1白盒測試方法為什么要進(jìn)行白盒測試?如果所有軟件錯誤的根源都可以追溯到某個(gè)唯一原因,那么問題就簡單了。然而,事實(shí)上一個(gè)bug常常是由多個(gè)因素共同導(dǎo)致的,如下圖所示。假設(shè)此時(shí)開發(fā)工作已結(jié)束,程序送交到測試組,沒有人知道代碼中有一個(gè)潛在的被0除的錯誤。若測試組采用的測試用例的執(zhí)行路徑?jīng)]有同時(shí)經(jīng)過x=0和y=5/x進(jìn)行測試,顯然測試工作似乎非常完善,測試用例覆蓋了所有執(zhí)行語句,也沒有被0除的錯誤發(fā)生。3.1白盒測試方法為什么要進(jìn)行白盒測試?假白盒測試方法(續(xù))白盒測試也稱結(jié)構(gòu)測試或邏輯驅(qū)動測試,是針對被測單元內(nèi)部是如何進(jìn)行工作的測試。它根據(jù)程序的控制結(jié)構(gòu)設(shè)計(jì)測試用例。白盒測試法檢查程序內(nèi)部邏輯結(jié)構(gòu),對所有邏輯路徑進(jìn)行測試,是一種窮舉路徑的測試方法。但即使每條路徑都測試過了,仍然可能存在錯誤。因?yàn)椋焊F舉路徑測試無法檢查出程序本身是否違反了設(shè)計(jì)規(guī)范,即程序是否是一個(gè)錯誤的程序。窮舉路徑測試不可能查出程序因?yàn)檫z漏路徑而出錯。窮舉路徑測試發(fā)現(xiàn)不了一些與數(shù)據(jù)相關(guān)的錯誤。白盒測試方法(續(xù))白盒測試也稱結(jié)構(gòu)測試或邏輯驅(qū)動測試,是針對白盒測試方法(續(xù))采用白盒測試方法必須遵循以下幾條原則,才能達(dá)到測試的目的:保證一個(gè)模塊中的所有獨(dú)立路徑至少被測試一次。所有邏輯值均需測試真(true)和假(false)兩種情況。檢查程序的內(nèi)部數(shù)據(jù)結(jié)構(gòu),保證其結(jié)構(gòu)的有效性。在上下邊界及可操作范圍內(nèi)運(yùn)行所有循環(huán)。白盒測試方法(續(xù))采用白盒測試方法必須遵循以下幾條原則,才能白盒測試常用的測試用例設(shè)計(jì)方法邏輯覆蓋以程序內(nèi)部的邏輯結(jié)構(gòu)為基礎(chǔ);根據(jù)覆蓋測試的目標(biāo),邏輯覆蓋分為:語句、判定、條件、判定/條件、組合、路徑基本路徑測試為了解決路徑龐大難題;在程序控制流程圖的基礎(chǔ)上,分析控制構(gòu)造的環(huán)路復(fù)雜性,導(dǎo)出基本可執(zhí)行路徑集合,設(shè)計(jì)測試用例的方法。白盒測試常用的測試用例設(shè)計(jì)方法邏輯覆蓋3.3控制流圖控制流圖(可簡稱流圖)是對程序流程圖進(jìn)行簡化后得到的,它可以更加突出的表示程序控制流的結(jié)構(gòu),唯一的。控制流圖中包括兩種圖形符號:節(jié)點(diǎn)和控制流線。節(jié)點(diǎn)由帶標(biāo)號的圓圈表示,可代表一個(gè)或多個(gè)語句、一個(gè)處理框序列和一個(gè)條件判定框(假設(shè)不包含復(fù)合條件)??刂屏骶€由帶箭頭的弧或線表示,可稱為邊。它代表程序中的控制流。對于復(fù)合條件,則可將其分解為多個(gè)單個(gè)條件,并映射成控制流圖。常見結(jié)構(gòu)的控制流圖3.3控制流圖控制流圖(可簡稱流圖)是對程序流程圖進(jì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é)構(gòu)的控制流圖其中,包含條件的節(jié)點(diǎn)被稱為判定節(jié)點(diǎn)(也叫謂軟件測試-3白盒測試及其用例的設(shè)計(jì)課件軟件測試-3白盒測試及其用例的設(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覆蓋測試3.4.1測試覆蓋率3.4.2邏輯覆蓋法3.4.3功能覆蓋3.4.4其他覆蓋3.4.5如何使用覆蓋率3.4.6測試覆蓋準(zhǔn)則3.3覆蓋測試3.4.1測試覆蓋率結(jié)構(gòu)測試中的一個(gè)重要問題是,測試進(jìn)行到什么地步就達(dá)到要求,可以結(jié)束測試。這需要給出結(jié)構(gòu)測試的覆蓋準(zhǔn)則。結(jié)構(gòu)測試中的一個(gè)重要問題是,測試進(jìn)行到什么地步就達(dá)到要求,可3.3.1測試覆蓋率測試覆蓋率:用于確定測試所執(zhí)行到的覆蓋項(xiàng)的百分比。其中的覆蓋項(xiàng)是指作為測試基礎(chǔ)的一個(gè)入口或?qū)傩裕热缯Z句、分支、條件等。通過覆蓋率數(shù)據(jù)可以知道測試得是否充分,測試的弱點(diǎn)在哪些方面,從而指導(dǎo)我們設(shè)計(jì)能夠增加覆蓋率的測試用例。能夠有效地提高測試質(zhì)量,避免設(shè)計(jì)無效用例。在測試分析報(bào)告中可以作為量化指標(biāo)的依據(jù),測試覆蓋率越高效果越好。但覆蓋率不是目標(biāo),只是一種手段。3.3.1測試覆蓋率測試覆蓋率:用于確定測試所執(zhí)行到的覆覆蓋率概念覆蓋率是用來度量測試完整性的一個(gè)手段。本身并不包含測試技術(shù),只是測試技術(shù)有效性的一個(gè)度量。

覆蓋率種類:邏輯覆蓋(LogicalCoverage),也叫:代碼覆蓋率(CodeCoverage)結(jié)構(gòu)化覆蓋率(StructuralCoverage)功能覆蓋(FunctionCoverage)。

覆蓋率概念覆蓋率是用來度量測試完整性的一個(gè)手段。本身3.3.2邏輯覆蓋法根據(jù)覆蓋目標(biāo)的不同,邏輯覆蓋可分為語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。語句覆蓋:選擇若干個(gè)測試用例,運(yùn)行被測程序,使得程序中的每個(gè)可執(zhí)行語句至少執(zhí)行一次。覆蓋指標(biāo)C0判定覆蓋(分支覆蓋):選擇若干個(gè)測試用例,運(yùn)行被測程序,使得程序中的每個(gè)判斷真假值均曾被滿足,也就是使程序中的每個(gè)取“真”分支和取“假”分支至少均經(jīng)歷一次。覆蓋指標(biāo)C1條件覆蓋:選擇若干個(gè)測試用例,運(yùn)行被測程序,使得程序中每個(gè)判定包含的每個(gè)條件的可能取值(真/假)都至少滿足一次。3.3.2邏輯覆蓋法根據(jù)覆蓋目標(biāo)的不同,邏輯覆蓋可分為語邏輯覆蓋法(續(xù))判定-條件覆蓋:設(shè)計(jì)足夠多的測試用例,使得程序中每個(gè)判定包含的每個(gè)條件的所有情況(真/假)至少出現(xiàn)一次,并且每個(gè)判定本身的判定結(jié)果(真/假)也至少出現(xiàn)一次。——滿足判定-條件覆蓋的測試用例一定同時(shí)滿足判定覆蓋和條件覆蓋。組合覆蓋:通過執(zhí)行足夠的測試用例,使得程序中每個(gè)判定的所有可能的條件取值組合都至少出現(xiàn)一次。覆蓋指標(biāo)CMCC

——滿足組合覆蓋的測試用例一定滿足判定覆蓋、條件覆蓋和判定-條件覆蓋。路徑覆蓋:設(shè)計(jì)足夠多的測試用例,要求覆蓋程序中所有可能的路徑。覆蓋指標(biāo)C∞邏輯覆蓋法(續(xù))判定-條件覆蓋:設(shè)計(jì)足夠多的測試用例,使得程邏輯覆蓋法(續(xù))組合覆蓋判定-條件覆蓋判定覆蓋條件覆蓋語句覆蓋邏輯覆蓋法(續(xù))組合覆蓋判定-條件覆蓋判定覆蓋條件覆蓋語句覆邏輯覆蓋法(續(xù))voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;j=sqrt(k);}//語句塊1if((x==4)||(y>5)){j=x*y+10;}//語句塊2

j=j%3;//語句塊3}邏輯覆蓋法(續(xù))voidDoWork(intx,in邏輯覆蓋法(續(xù))X>3&&z<10執(zhí)行語句塊1執(zhí)行語句塊2X==4||y>5執(zhí)行語句塊3FFTTabdce邏輯覆蓋法(續(xù))X>3&&z<10執(zhí)行語句塊1執(zhí)行語句塊語句覆蓋要實(shí)現(xiàn)DoWork函數(shù)的語句覆蓋,只需設(shè)計(jì)一個(gè)測試用例就可以覆蓋程序中的所有可執(zhí)行語句。測試用例輸入為:{x=4、y=5、z=5}程序執(zhí)行的路徑是:abd分析:語句覆蓋可以保證程序中的每個(gè)語句都得到執(zhí)行,但發(fā)現(xiàn)不了判定中邏輯運(yùn)算的錯誤,即它并不是一種充分的檢驗(yàn)方法。例如在第一個(gè)判定((x>3)&&(z<10))中把“&&”錯誤的寫成了“||”,這時(shí)仍使用該測試用例,則程序仍會按照流程圖上的路徑abd執(zhí)行。可以說語句覆蓋是最弱的邏輯覆蓋準(zhǔn)則。語句覆蓋要實(shí)現(xiàn)DoWork函數(shù)的語句覆蓋,只需設(shè)計(jì)一個(gè)測試用判定覆蓋注:教材中又稱為DD-路徑覆蓋,測試滿足DD-路徑覆蓋要求可以發(fā)現(xiàn)全部缺陷的85%要實(shí)現(xiàn)DoWork函數(shù)的判定覆蓋,需要設(shè)計(jì)兩個(gè)測試用例。測試用例的輸入為:{x=4、y=5、z=5};{x=2、y=5、z=5}程序執(zhí)行的路徑分別是:abd;ace分析:上述兩個(gè)測試用例不僅滿足了判定覆蓋,同時(shí)還做到語句覆蓋。從這點(diǎn)看似乎判定覆蓋比語句覆蓋更強(qiáng)一些,但仍然無法確定判定內(nèi)部條件的錯誤。例如把第二個(gè)判定中的條件y>5錯誤寫為y<5,使用上述測試用例,照樣能按原路徑執(zhí)行而不影響結(jié)果。因此,需要有更強(qiáng)的邏輯覆蓋準(zhǔn)則去檢驗(yàn)判定內(nèi)的條件。判定覆蓋注:教材中又稱為DD-路徑覆蓋,測試滿足DD-路徑覆判定覆蓋(續(xù))13524說明:以上僅考慮了兩出口的判斷,我們還應(yīng)把判定覆蓋準(zhǔn)則擴(kuò)充到多出口判斷(如Case語句)的情況。因此,判定覆蓋更為廣泛的含義應(yīng)該是使得每一個(gè)判定獲得每一種可能的結(jié)果至少一次。6789105’判定覆蓋(續(xù))13524說明:以上僅考慮了兩出口的判斷,我們條件覆蓋在實(shí)際程序代碼中,一個(gè)判定中通常都包含若干條件。條件覆蓋的目的是設(shè)計(jì)若干測試用例,在執(zhí)行被測程序后,要使每個(gè)判定中每個(gè)條件的可能值至少滿足一次。對DoWork函數(shù)的各個(gè)判定的各種條件取值加以標(biāo)記。對于第一個(gè)判定((x>3)&&(z<10)): 條件x>3取真值記為T1,取假值記為-T1

條件z<10取真值記為T2,取假值記為-T2對于第二個(gè)判定((x==4)||(y>5)):條件x==4取真值記為T3,取假值記為-T3條件y>5取真值記為T4,取假值記為-T4條件覆蓋在實(shí)際程序代碼中,一個(gè)判定中通常都包含若干條件。條條件覆蓋(續(xù))根據(jù)條件覆蓋的基本思想,要使上述4個(gè)條件可能產(chǎn)生的8種情況至少滿足一次,設(shè)計(jì)測試用例如下:分析:上面這組測試用例不但覆蓋了4個(gè)條件的全部8種情況,而且將兩個(gè)判定的4個(gè)分支b、c、d、e也同時(shí)覆蓋了,即同時(shí)達(dá)到了條件覆蓋和判定覆蓋。條件覆蓋(續(xù))根據(jù)條件覆蓋的基本思想,要使上述4個(gè)條件可能產(chǎn)條件覆蓋(續(xù))說明:雖然前面的一組測試用例同時(shí)達(dá)到了條件覆蓋和判定覆蓋,但是,并不是說滿足條件覆蓋就一定能滿足判定覆蓋。如果設(shè)計(jì)了下表中的這組測試用例,則雖然滿足了條件覆蓋,但只是覆蓋了程序中第一個(gè)判定的取假分支c和第二個(gè)判定的取真分支d,不滿足判定覆蓋的要求。條件覆蓋(續(xù))說明:雖然前面的一組測試用例同時(shí)達(dá)到了條件覆蓋判定-條件覆蓋判定-條件覆蓋實(shí)際上是將判定覆蓋和條件覆蓋結(jié)合起來的一種方法,即:設(shè)計(jì)足夠的測試用例,使得判定中每個(gè)條件的所有可能取值至少滿足一次,同時(shí)每個(gè)判定的可能結(jié)果也至少出現(xiàn)一次。根據(jù)判定-條件覆蓋的基本思想,只需設(shè)計(jì)以下兩個(gè)測試用例便可以覆蓋4個(gè)條件的8種取值以及4個(gè)判定分支。判定-條件覆蓋判定-條件覆蓋實(shí)際上是將判定覆蓋和條件覆蓋結(jié)合判定-條件覆蓋(續(xù))分析:從表面上看,判定-條件覆蓋測試了各個(gè)判定中的所有條件的取值,但實(shí)際上,編譯器在檢查含有多個(gè)條件的邏輯表達(dá)式時(shí),某些情況下的某些條件將會被其它條件所掩蓋。因此,判定-條件覆蓋也不一定能夠完全檢查出邏輯表達(dá)式中的錯誤。例如:對于第一個(gè)判定(x>3)&&(z<10)來說,必須x>3和z<10這兩個(gè)條件同時(shí)滿足才能確定該判定為真。如果x>3為假,則編譯器將不再檢查z<10這個(gè)條件,那么即使這個(gè)條件有錯也無法被發(fā)現(xiàn)。對于第二個(gè)判定(x==4)||(y>5)來說,若條件x==4滿足,就認(rèn)為該判定為真,這時(shí)將不會再檢查y>5,那么同樣也無法發(fā)現(xiàn)這個(gè)條件中的錯誤。判定-條件覆蓋(續(xù))分析:從表面上看,判定-條件覆蓋測試了各組合覆蓋組合覆蓋的目的是要使設(shè)計(jì)的測試用例能覆蓋每一個(gè)判定的所有可能的條件取值組合。對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ì)的測試用例能覆蓋每一個(gè)判定的組合覆蓋(續(xù))根據(jù)組合覆蓋的基本思想,設(shè)計(jì)測試用例如下:分析:上面這組測試用例覆蓋了所有8種條件取值的組合,覆蓋了所有判定的真假分支,但是卻丟失了一條路徑abe。組合覆蓋(續(xù))根據(jù)組合覆蓋的基本思想,設(shè)計(jì)測試用例如下:分析路徑覆蓋前面提到的5種邏輯覆蓋都未涉及到路徑的覆蓋。事實(shí)上,只有當(dāng)程序中的每一條路徑都受到了檢驗(yàn),才能使程序受到全面檢驗(yàn)。路徑覆蓋的目的就是要使設(shè)計(jì)的測試用例能覆蓋被測程序中所有可能的路徑。根據(jù)路徑覆蓋的基本思想,在滿足組合覆蓋的測試用例中修改其中一個(gè)測試用例,則可以實(shí)現(xiàn)路徑覆蓋:路徑覆蓋前面提到的5種邏輯覆蓋都未涉及到路徑的覆蓋。事實(shí)上,路徑覆蓋(續(xù))分析:雖然前面一組測試用例滿足了路徑覆蓋,但并沒有覆蓋程序中所有的條件組合(丟失了組合3和7),即滿足路徑覆蓋的測試用例并不一定滿足組合覆蓋。說明:對于比較簡單的小程序,實(shí)現(xiàn)路徑覆蓋是可能做到的。但如果程序中出現(xiàn)較多判斷和較多循環(huán),可能的路徑數(shù)目將會急劇增長,要在測試中覆蓋所有的路徑是無法實(shí)現(xiàn)的。為了解決這個(gè)難題,只有把覆蓋路徑數(shù)量壓縮到一定的限度內(nèi),如程序中的循環(huán)體只執(zhí)行一次。在實(shí)際測試中,即使對于路徑數(shù)很有限的程序已經(jīng)做到路徑覆蓋,仍然不能保證被測試程序的正確性。路徑覆蓋(續(xù))分析:雖然前面一組測試用例滿足了路徑覆蓋,但并邏輯覆蓋小結(jié)各種結(jié)構(gòu)測試方法都不能保證程序的正確性。測試的目的并非要證明程序的正確性,而是要盡可能找出程序中的錯誤。邏輯覆蓋率可以作為測試完整性的一個(gè)度量。即使達(dá)到100%的邏輯覆蓋率,仍然無法保證程序的正確性;確實(shí)并不存在一種十全十美的測試方法,能夠發(fā)現(xiàn)所有的錯誤。邏輯覆蓋小結(jié)各種結(jié)構(gòu)測試方法都不能保證程序的正確性。3.4.3功能覆蓋 功能覆蓋屬于黑盒測試范疇。常見的是需求覆蓋和接口覆蓋。

需求覆蓋:通過設(shè)計(jì)一定的測試用例,要求每個(gè)需求點(diǎn)都被測試到。

接口覆蓋:也叫入口點(diǎn)覆蓋,接口覆蓋要求通過設(shè)計(jì)一定的用例使系統(tǒng)的每個(gè)接口都被測試到。

3.4.3功能覆蓋 功能覆蓋屬于黑盒測試范疇。常見的是需求3.4.4其他覆蓋率函數(shù)覆蓋定義:在測試中有哪些函數(shù)被測試到了,其被測試到的頻率有多大,這些函數(shù)在系統(tǒng)所有函數(shù)中占的比例有多大。是針對系統(tǒng)或一個(gè)子系統(tǒng)而測試的;比較容易自動化(TrueCoveragePureCoverage);易于理解。指令塊覆蓋是語句覆蓋的一個(gè)變體。3.4.4其他覆蓋率函數(shù)覆蓋3.4.5如何使用覆蓋率 在選擇和使用覆蓋率時(shí),必須遵循的基本原則:覆蓋率不是目的,只是一種手段;不可能針對所有的覆蓋率指標(biāo)去進(jìn)行測試;只考慮一種覆蓋率指標(biāo)也是不恰當(dāng)?shù)?;不要追求絕對100%的覆蓋率。3.4.5如何使用覆蓋率 在選擇和使用覆蓋率時(shí),必須遵循評價(jià)標(biāo)準(zhǔn)覆蓋率度量覆蓋率評價(jià)表評價(jià)標(biāo)準(zhǔn)覆蓋覆蓋率評價(jià)表課堂練習(xí)為以下流程圖所示的程序段設(shè)計(jì)一組測試用例,要求分別滿足語句覆蓋、判定覆蓋、條件覆蓋、判定-條件覆蓋、組合覆蓋和路徑覆蓋。(A>1)and(B=0)(A=2)or(X>1)X=X/AX=X+1TTFFbdcea課堂練習(xí)為以下流程圖所示的程序段設(shè)計(jì)一組測試用例,要求分別滿A=2,B=0,X=4(沿路徑ace執(zhí)行);語句覆蓋測試用例A=2,B=0,X=4(沿路徑ace執(zhí)行);語句覆蓋測試用A=3,B=0,X=3(acd);A=2,B=1,X=1(abe);aa判定覆蓋測試用例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);條件覆蓋測試用例A=2,B=1,X=1(abe);A=1,B=0,X=3判定-條件覆蓋測試用例判定-條件覆蓋測試用例判定條件的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種組合:組合覆蓋測試用例組合覆蓋測試用例A=2,B=0,X=4(ace)A=2,B=1,X=1(abe)組合覆蓋測試用例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)組合覆蓋測試用例A=1,B=1,X=1(abd)A=1,B=0,X=3(ab路徑覆蓋測試用例路徑覆蓋測試用例3.7數(shù)據(jù)流測試數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目標(biāo)碼而出現(xiàn)的,這類方法主要用于代碼優(yōu)化。近年來在測試中也得到成功運(yùn)用,查找引用未定義變量等程序錯誤,查找對以前未曾使用的變量再次賦值等數(shù)據(jù)流異常的情況。這常常是常見程序錯誤的表現(xiàn)形式,如:錯拼名字、名字混淆或丟失了語句。3.7數(shù)據(jù)流測試數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目數(shù)據(jù)流測試關(guān)注變量定義賦值點(diǎn)(語句)和引用或使用這些值的點(diǎn)(語句)的結(jié)構(gòu)性測試。用作路徑測試的真實(shí)性檢查。程序和程序的元素通過它們的數(shù)據(jù)訪問行為關(guān)聯(lián)起來,確定了數(shù)據(jù)流關(guān)系。數(shù)據(jù)流測試形式:定義/使用測試基于程序片的測試定義/使用路徑和片的定義能夠非常準(zhǔn)確地描述要測試的程序部分?jǐn)?shù)據(jù)流測試關(guān)注變量定義賦值點(diǎn)(語句)和引用或使用這些值的點(diǎn)(常見的數(shù)據(jù)流異常包括:變量被定義,但是從來沒有使用;所使用的變量沒有被定義;變量在使用之前被定義兩次;等待一個(gè)還沒有被安排的進(jìn)程;安排一個(gè)與其自身相同的進(jìn)程;等待一個(gè)先前已經(jīng)被中止了的進(jìn)程;引用一個(gè)在并行進(jìn)程中被定義的變量;引用一個(gè)值不確定的變量。這些

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論