白盒測試及其用例的設計課件_第1頁
白盒測試及其用例的設計課件_第2頁
白盒測試及其用例的設計課件_第3頁
白盒測試及其用例的設計課件_第4頁
白盒測試及其用例的設計課件_第5頁
已閱讀5頁,還剩157頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

教學目標理論環節學習理解白盒測試方法的基本概念學習理解白盒測試的覆蓋理論學習掌握白盒測試的路徑表達學習掌握白盒測試的基本路徑測試法實踐環節通過案例運用學習掌握覆蓋問題的解決方法運用基本路徑測試方法進行實際程序測試教學目標理論環節1

白盒測試也稱結構測試或邏輯驅動測試,是針對被測單元內部是如何進行工作的測試。白盒法把測試對象看做是一個打開的盒子,允許測試人員利用程序內部的邏輯結構及有關信息,設計或選擇測試用例,對程序所有邏輯路徑進行測試。通過在不同點檢查程序的狀態,確定實際的狀態是否與預期的狀態一致。

白盒測試也稱結構測試或邏輯驅動測試,是針對被測單元內2白盒法也不可能進行窮舉測試,企圖遍歷所有的路徑,往往是做不到的。

左圖所示的一個小程序的控制流程,其中每個圓圈代表一段源程序(或語句塊),圖中的曲線代表執行次數不超過20的循環,循環體中共有5條通路。這樣,可能執行的路徑有520條,近似為1014條可能的路徑。如果完成一個路徑的測試需要1毫秒,那么整個測試過程需要3170年。顯然,這也是不能接受的。白盒法也不可能進行窮舉測試,企圖遍歷所有的路徑,往往3白盒法需要了解程序的內部結構和詳細的處理過程,它按照程序內部邏輯測試程序,檢驗程序中每條通路是否按預定要求正確工作。白盒法需要了解程序的內部結構和詳細的處理過程,它按照程序內部4對于白盒測試,即使每條路徑都測試了,程序仍可能有錯。再如由于疏忽漏寫了路徑,白盒測試也發現不了。所以,白盒法不能使測試達到徹底。為了用有限的測試發現更多的錯誤,需精心設計測試用例。黑盒法、白盒法是設計測試用例的基本策略,每一種方法對應著多種設計測試用例的技術,每種技術可達到一定的軟件質量標準要求。對于白盒測試,即使每條路徑都測試了,程序仍可能有錯。5測試用例的設計白盒技術在測試階段窮舉測試不可行,必須要從數量極大的可用測試用例中精心地挑選少量的測試數據,使得采用這些測試數據能夠達到最佳的測試效果,能夠高效率地把隱藏的錯誤揭露出來。下面介紹幾種白盒測試設計測試用例的方法。測試用例的設計白盒技術在測試階段窮舉測試不可6白盒測試的主要方法邏輯驅動測試基本路徑測試

主要用于軟件驗證。使用程序設計的控制結構導出測試用例。白盒測試的主要方法邏輯驅動測試7全部例子均為C語言編制六種邏輯覆蓋全部例子均為C語言編制六種邏輯覆蓋8一個顯而易見的問題:一個完整的語句,未必是一行語句

y=abs(x);if(x>=0)y=sqrt(x);if(x>=0)y=x; elsey=abs(x);if((x>=0)&&(z>=0))y=x*z;簡單的賦值語句單分支語句雙分支語句判斷條件較復雜的單分支語句一個顯而易見的問題:一個完整的語句,未必是一行語句y=ab9一些更復雜的語句

if((x<0)or(x>100))printf("ERROR!"); else if(x>=60)printf("OK!"); else printf("FAIL!");for(i=0;i<10;i++) s=s+a[i];判斷條件較復雜的多分支語句簡單的循環語句對以上語句,請思考:如何讓它們都被執行?一些更復雜的語句if((x<0)or(x>100))p10簡單的賦值語句使賦值號左側的變量得到一個值分支語句使各個分支語句中至少一個被執行循環語句使循環體被執行至少一次Q:什么叫做“語句被執行”?簡單的賦值語句Q:什么叫做“語句被執行”?11給出測試數據,使各語句均被執行

y=abs(x);if(x>=0)y=sqrt(x);if(x>=0)y=x; elsey=abs(x);令x任取一值即可使本語句被執行令x任取一非負數值即可保證判斷條件成立,語句被執行令x任取一值因為此二分支覆蓋了全部的取值范圍,x無論取什么值,都能使其中的一個分支被執行給出測試數據,使各語句均被執行y=abs(x);令x任取一12

if((x>=0)||(z>=0))y=x*z;不管z,令x任取一非負數值不管x,令z任取一非負數值令x、z同時任取一非負數值這三種取值均能使判斷條件成立令判斷條件成立,語句即被執行if((x>=0)||(z>=0))y=x*z;不管13

if((x<0)or(x>100))printf("ERROR!"); else if(x>=60)printf("OK!"); else printf("FAIL!");令判斷條件A成立,分支之一被執行令判斷條件A不成立,但B成立,那么分支之二被執行令判斷條件AB均不成立,則分支之三被執行AB以上三種取值,均能使這個分支語句得以執行if((x<0)or(x>100))printf("E14

for(i=0;i<10;i++) s=s+a[i];令i取零到9閉區間內的任意值,循環體就會被執行可見:越復雜、影響最終結果的變量的可能值越多的語句,只要取其任一個分支或任一種可能,整條語句就算被執行最徹底的測試,是考慮到每一種可能最粗略的測試,是僅僅考慮到其中的一種可能for(i=0;i<10;i++)令i取零到9閉區間內15邏輯驅動測試

是以程序內在邏輯結構為基礎的測試,即測試覆蓋率。共包括以下6種類型(強弱程度逐漸遞增):語句覆蓋判定覆蓋條件覆蓋判定-條件覆蓋條件組合覆蓋路徑覆蓋考慮到每一種可能,最徹底僅考慮一種可能,最粗略邏輯驅動測試 是以程序內在邏輯結構為基礎的測試,即測試覆蓋率16

voidDoWork1(intx)1{2intk=0,j=0;3

if(x>3) //語句14

k=x^3-1;

5

j=sqrt(k);

//語句26

printf("%d,%5.2d\n",k,j);7}如下的C函數:Q1:本函數中起作用的變量有哪幾個?xQ2:用最簡單的輸入,使函數中的每個語句都得到執行:令x為4單分支語句voidDoWork1(intx)如下的C函數:17

voidDoWork(intx,inty,intz)1{2intk=0,j=0;3

if((x>3)&&(z<10))

//語句14

{5

k=x*y-1;

6j=sqrt(k);7

}8

j=j%3;//語句29}如下的C函數:Q1:本函數中起作用的變量有哪幾個?x、y、zQ2:用最簡單的輸入,使函數中的每個語句都得到執行x=4同時z=9判斷條件較復雜的單分支語句voidDoWork(intx,inty,in18

voidDoWork2(intx)1{2intk=0,j=0;3

if(x>3)

//語句14

k=x-1;5

else

6k=sqrt(x);

}如下的C函數:Q1:本函數中起作用的變量有哪幾個?Q2:用最簡單的輸入,使函數中的每個語句都得到執行 x為4Q3:使函數中的每個語句都得到最充分的執行 用例1:x為4

用例2:x為3雙分支語句voidDoWork2(intx)如下的C函數:19概念語句覆蓋:使得每一條可執行語句至少執行一次判定覆蓋(也稱為分支覆蓋):使程序中每個判斷的取真分支和取假分支至少執行一次條件覆蓋:使程序中每個判斷的每個條件的每個可能取值至少執行一次判定-條件覆蓋:使程序中每個判斷的每個條件的所有可能取值至少執行一次,并且每個可能的判斷結果也至少執行一次,換言之,即是要求各個判斷的所有可能的條件取值組合至少執行一次條件組合覆蓋:使程序中每個判斷的所有可能的條件取值組合至少執行一次路徑覆蓋:要覆蓋程序中所有可能的路徑設計若干個測試用例,運行被測試程序……概念設計若干個測試用例,運行被測試程序……20各種邏輯覆蓋的概念介紹語句覆蓋:設計若干個測試用例,運行被測試程序,使得每一條可執行語句至少執行一次;但其覆蓋標準無法發現判定中邏輯運算的錯誤;此方法是把程序中的所有的語句都覆蓋到;if(x>=0)y=x; elsey=abs(x);x=abs(x);if(x>=0)y=x;

elsey=abs(x);一個用例即可:x為0一個用例即可:x為0各種邏輯覆蓋的概念介紹但其覆蓋標準無法發現判定中邏輯運算的錯21判定覆蓋(也稱為分支覆蓋):設計若干個測試用例,運行所測程序,使程序中每個判斷的取真分支和取假分支各至少執行一次;((x>3)&&(z<10))為真和為假各取一次(但并不管是怎么取到的)判定覆蓋是把程序中每個分支都覆蓋到;但當判斷條件較為復雜時,它未必能發現每個條件的錯誤:if(x>=0)y=x; elsey=abs(x);if(x>=0)y=x;

elsey=abs(x);對程序中的雙分支語句,相當于覆蓋了兩次第1個用例:x為0第2個用例:x為-1((x>3)&&(z<10))為真和為假各取一次(但并不管是22這個分支語句中,判斷就是條件,條件就是判斷if((x>3)||(z<10))......中,((x>3)||(z<10))是一個判斷,其中的(x>3)和(z<10)分別是構成這個判斷的兩個條件,判斷的結果真假取決于這兩個條件的值分別是真還是假何謂判斷?何謂條件?if(x>=0)y=x; elsey=abs(x);if((x>3)||(z<10))...... else......這個分支語句中,判斷取決于兩個條件,這兩個條件的真假和判斷的真假未必一致這個分支語句中,判斷就是條件,條件就是判斷if((x>3)|23條件覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每個判斷的每個條件的每個可能取值至少執行一次;(x>3)為真和假各取一次;(z<10)為真和為假各取一次(但至于它們分別取了真假后怎么組合以及((x>3)||(z<10))這個整體的真假就沒有提及)條件覆蓋是把判斷中所有的條件都覆蓋到;但它未必能覆蓋全部分支;if((x>3)||(z<10))......中,((x>3)||(z<10))是一個判斷,其中的(x>3)和(z<10)分別是構成這個判斷的兩個條件,判斷的結果真假取決于這兩個條件的值分別是真還是假何謂判斷?何謂條件?(x>3)為真和假各取一次;(z<10)為真和為假各取一次條24也只有在判斷條件較復雜時,2和3才有區別if((x>3)||(z<10))...... else......第3個用例:z為9第4個用例:z為112.判定覆蓋3.條件覆蓋第1個用例:x為4第2個用例:x為2同時z為11第1個用例:x為4第2個用例:x為2if((x>3)||(z<10))...... else......也只有在判斷條件較復雜時,2和3才有區別if((x>3)||25判定-條件覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每個判斷的每個條件的所有可能取值至少執行一次,并且每個可能的判斷結果也至少執行一次;(x>3)為真和假各取一次;(z<10)為真和為假各取一次并把((x>3)||(z<10))為真和為假各取一次即: (x>3)和(z<10)同時為真取一次;

(x>3)和(z<10)同時為假取一次;就可以滿足if((x>3)||(z<10))...... else......(x>3)為真和假各取一次;(z<10)為真和為假各取一次即26繼續對比2、3、4的區別第3個用例:z為9第4個用例:z為112.判定覆蓋4.判斷-條件覆蓋第1個用例:x為4第2個用例:x為2同時z為11第1個用例:x為4第2個用例:x為2if((x>3)||(z<10))...... else......第3個用例:z為9第4個用例:z為113.條件覆蓋第1個用例:x為4第2個用例:x為2第6個用例:x為2同時z為11第5個用例:x為4(以上用例可以縮減)繼續對比2、3、4的區別第3個用例:z為9第4個用例:z為127條件組合覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每個判斷的所有可能的條件取值組合至少執行一次;把((x>3)和(z<10))為真和為假的各種可能組合各執行一次即: (x>3)和(z<10)同時為真取一次;

(x>3)和(z<10)同時為假取一次;

(x>3)和(z<10)分別為真假取一次;

(x>3)和(z<10)分別為假真取一次;才能滿足if((x>3)||(z<10))......中,((x>3)||(z<10))是一個判斷,其中的(x>3)和(z<10)分別是構成這個判斷的兩個條件,判斷的結果真假取決于這兩個條件的值分別是真還是假何謂判斷?何謂條件?條件組合覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每28繼續對比4、5的區別第3個用例:x為4同時z為11第4個用例:x為2同時z為95.條件組合覆蓋第1個用例:x為4同時z為9第2個用例:x為2同時z為11if((x>3)||(z<10))...... else......第3個用例:z為9第4個用例:z為114.判定-條件覆蓋第1個用例:x為4第2個用例:x為2第5個用例:x為2同時z為11真真、假假、真假、假真繼續對比4、5的區別第3個用例:x為4同時z為11第4個用例29路徑覆蓋:設計足夠多的測試用例,運行所測程序,要覆蓋程序中所有可能的路徑 它是最強的覆蓋準則,但只有在程序中有多個復雜分支時,才能看出和之前幾種覆蓋的區別白盒測試及其用例的設計課件30voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;//語句塊1j=sqrt(k);}if((x==4)||(y>5)){j=x*y+10;//語句塊2}j=j%3;//語句塊3}函數的流程圖voidDoWork(intx,inty,intz31語句覆蓋為了說明簡略,分別對各個判斷的取真、取假分支編號為b、c、d、e。為了測試語句覆蓋率只要設計一個測試用例就可以把三個執行語句塊中的語句覆蓋了。 測試用例輸入為:{x=4、y=5、z=5} 程序執行的路徑是:abd

該測試用例雖然覆蓋了每條可執行語句,但并不能檢查判斷邏輯是否有問題,例如在第一個判斷中把&&錯誤的寫成了||,則上面的測試用例仍可以覆蓋所有的執行語句(即查不出寫錯了這個事實)可以說語句覆蓋率是最弱的邏輯覆蓋準則使程序中每個語句至少執行一次語句覆蓋為了說明簡略,分別對各個判斷的取真、取假分支 該測試32判定覆蓋對于上面的程序,如果設計兩個測試用例則可以滿足分支覆蓋的要求。測試用例的輸入為:{x=4、y=5、z=5} abd{x=2、y=5、z=5} ace上面的兩個測試用例雖然能夠滿足分支覆蓋的要求,但是也不能實現對判斷條件的檢查效果,如果把第二個條件y>5錯誤地寫成y<5,上面的測試用例同樣滿足了分支覆蓋(即查不出寫錯了這個事實)使程序中每個判斷的取真分支和取假分支至少執行一次判定覆蓋對于上面的程序,如果設計兩個測試用例則可以滿足分33條件覆蓋就是設計若干個測試用例,運行被測試對象,使得程序中每個判斷的每個條件的所有可能取值至少執行一次。對例子中的所有條件取值加以標記。例如: 對于第一個判斷: 條件1:x>3取真值為T1,取假值為-T1 條件2:z<10取真值為T2,取假值為-T2 對于第二個判斷: 條件1:x=4取真值為T3,取假值為-T3 條件2:y>5取真值為T4,取假值為-T4使程序中每個判斷每個條件分別取真和取假各一次條件覆蓋就是設計若干個測試用例,運行被測試對象,使得程序中每34可以設計測試用例如下:測試用例通過路徑條件取值覆蓋分支x=4、y=6、z=5abdT1、T2、T3、T4bdx=2、y=5、z=5ace-T1、-T2、-T3、-T4ce上面的測試用例不但覆蓋了所有分支的真假兩個分支,而且覆蓋了判斷中的所有條件的可能值可以設計測試用例如下:測試用例通過路徑條件取值覆蓋分支35如果設計了下面的測試用例,則雖然滿足了條件覆蓋,但只覆蓋了第一個條件的取假分支和第二個條件的取真分支,又不滿足分支覆蓋的要求(be線路未執行)測試用例通過路徑條件取值覆蓋分支x=2、y=6、z=5acd-T1、T2、-T3、T4cdx=4、y=5、z=5acdT1、-T2、T3、-T4cd使程序中每個判斷的取真分支和取假分支至少執行一次需要改進:即判定-條件覆蓋如果設計了下面的測試用例,則雖然滿足了條件覆蓋,但只覆蓋36判定-條件覆蓋

判定-條件覆蓋就是設計足夠的測試用例,使得判斷中每個條件的所有可能取值至少執行一次,同時每個判斷的所有可能判斷結果至少執行。根據定義只需設計以下兩個測試用例便可以覆蓋8個條件值以及4個判斷分支。測試用例通過路徑條件取值覆蓋分支x=4、y=6、z=5abdT1、T2、T3、T4bdx=2、y=5、z=11ace-T1、-T2、-T3、-T4ce判定-條件覆蓋判定-條件覆蓋就是設計足夠的測試用例,37

判定-條件覆蓋從表面來看,測試了所有條件的取值,但實際上,某些條件掩蓋了另一些條件,即仍然有遺漏。例如:對于條件表達式(x>3)&&(z<10)來說,必須兩個條件都滿足才能確定表達式為真。如果(x>3)為假,則一般的編譯器將不再判斷是否(z<10)是否為真。對于第二個表達式(x==4)||(y>5)來說,若x==4測試結果為真,就認為表達式的結果為真,這時不再檢查(y>5)是否為真??梢?,采用判定-條件覆蓋,邏輯表達式中的錯誤不一定都能查出來。 判定-條件覆蓋從表面來看,測試了所有條件的取值,但實際上,38條件組合覆蓋: 條件組合覆蓋就是設計足夠的測試用例,運行被測試對象,使得每一個判斷的所有可能的條件取值組合至少執行一次。 現在對例子中的各個判斷的條件取值組合加以標記如下:x>3,z<10記做T1T2,第一個判斷的取真分支x>3,z>=10記做T1-T2,第一個判斷的取假分支x<=3,z<10記做-T1T2,第一個判斷的取假分支x<=3,z>=10記做-T1-T2,第一個判斷的取假分支x=4,y>5記做T3T4,第二個判斷的取真分支x=4,y<=5記做T3-T4,第二個判斷的取真分支x!=4,y>5記做-T3T4,第二個判斷的取真分支x!=4,y<=5記做-T3-T4,第二個判斷的取假分支判定-條件覆蓋使得判斷中每個條件的所有可能取值至少執行一次,同時每個判斷的所有可能判斷結果至少執行一次if((x>3)&&(z<10))if((x==4)||(y>5))條件組合覆蓋: 條件組合覆蓋就是設計足夠的測試用例,運行被測39根據定義取4個測試用例,就可以覆蓋上面8種條件取值的組合測試用例。如下表:測試用例通過路徑條件取值覆蓋組合號x=4、y=6、z=5abdT1、T2、T3、T41和5x=4、y=5、z=15acdT1、-T2、T3、-T42和6x=2、y=6、z=5acd-T1、T2、-T3、T43和7x=2、y=5、z=15ace-T1、-T2、-T3、-T44和8上面的測試用例覆蓋了所有條件的可能取值的組合,覆蓋了所有判斷的可取分支,但卻丟失了路徑abe根據定義取4個測試用例,就可以覆蓋上面8種條件取值的組合測試40路徑覆蓋路徑覆蓋就是設計足夠多的測試用例,覆蓋被測試對象中的所有可能路徑在上面的測試用例中再添加一個測試用例,則可對程序進行全部的路徑覆蓋測試用例通過路徑覆蓋條件x=4、y=6、z=5abdT1、T2、T3、T4x=4、y=5、z=15acdT1、-T2、T3、-T4x=2、y=6、z=15ace-T1、-T2、-T3、-T4x=5、y=6、z=5abeT1、T2、-T3、T4路徑覆蓋路徑覆蓋就是設計足夠多的測試用例,覆蓋被測試對象中的41路徑覆蓋分析: 雖然前面一組測試用例滿足了路徑覆蓋,但并沒有覆蓋程序中所有的條件組合,即滿足路徑覆蓋的測試用例并不一定滿足組合覆蓋。路徑覆蓋分析:42路徑覆蓋說明:對于比較簡單的小程序,實現路徑覆蓋是可能做到的。但如果程序中出現較多判斷和較多循環,可能的路徑數目將會急劇增長,要在測試中覆蓋所有的路徑是無法實現的。為了解決這個難題,只有把覆蓋路徑數量壓縮到一定的限度內,如程序中的循環體只執行一次。路徑覆蓋說明:43路徑覆蓋在實際測試中,即使對于路徑數很有限的程序已經做到路徑覆蓋,仍然不能保證被測試程序的正確性,還需要采用其他測試方法進行補充。路徑覆蓋在實際測試中,即使對于路徑數很有限的程44對這個C函數分別作六種覆蓋Main(){inta,b;

floatc;if((a>0)&&(b>0)){

c=c/a;//語句塊1}if((a>1)||(c>1)){

c=c+1;//語句塊2}

c=b+c;//語句塊3}對這個C函數分別作六種覆蓋Main()456種覆蓋標準的對比6種覆蓋標準的對比46

語句覆蓋發現錯誤能力最弱。判定覆蓋包含了語句覆蓋,但它可能會使一些條件得不到測試。條件覆蓋對每一條件進行單獨檢查,一般情況下它的檢錯能力較判定覆蓋強,但有時達不到判定覆蓋的要求。判定/條件覆蓋包含了判定覆蓋和條件覆蓋的要求,但由于計算機系統軟件實現方式的限制,實際上不一定達到條件覆蓋的標準。條件組合覆蓋發現錯誤能力較強,凡滿足其標準的測試用例,也必然滿足前4種覆蓋標準。 語句覆蓋發現錯誤能力最弱。判定覆蓋包含了語句覆蓋,但它47

前5種覆蓋標準把注意力集中在單個判定或判定的各個條件上,可能會使程序某些路徑沒有執行到。路徑測試根據各判定表達式取值的組合,使程序沿著不同的路徑執行,查錯能力強。但由于它是從各判定的整體組合出發設計測試用例的,可能使測試用例達不到條件組合覆蓋的要求。在實際的邏輯覆蓋測試中,一般以條件組合覆蓋為主設計測試用例,然后再補充部分用例,以達到路徑覆蓋測試標準。 前5種覆蓋標準把注意力集中在單個判定或判定的各個條件上48

練習題:為以下流程圖所示的程序段設計一組測試用例,要求分別滿足語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。一個被測試程序的流程圖練習題:為以下流程圖所示的程序段設計一組測試用例,要求分49作業題作業題50作業題試做出左邊三角形問題的語句覆蓋,條件覆蓋,判定覆蓋,判定-條件覆蓋、組合條件覆蓋的測試用例.并注明滿足覆蓋的條件.eg:abc345T1T2T3F4F5F6作業題試做出左邊三角形問題的語句覆蓋,條件覆蓋,判定覆蓋,判51基本路徑測試基本路徑測試52基本路徑測試基本路徑測試法是在程序控制流圖的基礎上,通過分析控制構造的環路復雜性,導出基本可行路徑的集合,從而設計測試用例的方法。設計出的測試用例要保證被測試程序的每個可執行語句至少執行一次。完成路徑測試的理想情況是做到路徑覆蓋,但對于復雜性大的程序要做到所有路徑覆蓋是不可能的。基本路徑測試基本路徑測試法是在程序控制流圖的基礎上,53基本路徑測試在不能做到所有路徑覆蓋的前提下,如果某一程序的每一個獨立路徑都被測試過,那么可以認為程序中的每個語句都已經檢驗過了,即達到了語句覆蓋。這種測試方法就是通常所說的基本路徑測試方法。基本路徑測試在不能做到所有路徑覆蓋的前提下,如54voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;//語句塊1j=sqrt(k);}if((x==4)||(y>5)){j=x*y+10;//語句塊2}j=j%3;//語句塊3}函數的流程圖voidDoWork(intx,inty,intz55基本路徑測試 這個例子是一個很簡單的程序函數,只有四條路徑。但在實踐中,一個不太復雜的程序,其路徑都是一個龐大的數字,要在測試中覆蓋所有的路徑是不現實的?;韭窂綔y試 這個例子是一個很簡單的程序函數,只有四條路徑56

為了解決這一難題,只得把覆蓋的路徑數壓縮到一定限度內,例如,程序中的循環體只執行一次。

基本路徑測試就是這樣一種測試方法,它在程序控制圖的基礎上,通過分析控制構造的環行復雜性,導出基本可執行路徑集合,從而設計測試用例的方法。 設計出的測試用例要保證在測試中程序的每一個可執行語句至少執行一次。 為了解決這一難題,只得把覆蓋的路徑數壓縮到一定限度內57在介紹基本路徑方法之前,必須先介紹一種簡單的控制流表示方法,即流圖??刂屏鲌D(可簡稱流圖)是對程序流程圖進行簡化后得到的,它可以更加突出的表示程序控制流的結構。控制流圖中包括兩種圖形符號:節點和控制流線。節點由帶標號的圓圈表示,可代表一個或多個語句、一個處理框序列和一個條件判定框(假設不包含復合條件)。控制流線由帶箭頭的弧或線表示,可稱為邊。它代表程序中的控制流。對于復合條件,則可將其分解為多個單個條件,并映射成控制流圖。常見結構的控制流圖在介紹基本路徑方法之前,必須先介紹一種簡單的控制流表示方法,58常見結構的控制流圖其中,包含條件的節點被稱為判定節點(也叫謂詞節點),由判定節點發出的邊必須終止于某一個節點,由邊和節點所限定的范圍被稱為區域。常見結構的控制流圖其中,包含條件的節點被稱為判定節點(也叫謂591.程序的控制流圖1.程序的控制流圖601.程序的控制流圖1.程序的控制流圖61區域區域62程序的控制流圖如果判斷中的條件表達式是由一個或多個邏輯運算符(||,&&,...)

連接的復合條件表達式,則需改為一系列只有單個條件的嵌套的判斷。程序的控制流圖如果判斷中的條件表達式是由一個或多63白盒測試及其用例的設計課件64程序的控制流圖if(a||b)執行x;else執行y;程序的控制流圖if(a||b)651.程序的控制流圖1.程序的控制流圖66

復合條件下的控制流圖

(a)程序;(b)控制流圖復合條件下的控制流圖67基本路徑測試基本路徑測試方法是在控制流圖的基礎上,通過分析控制結構的環形復雜度,導出執行路徑的基本集合,再從該基本集設計測試用例?;韭窂綔y試方法包括4個步驟:基本路徑測試基本路徑測試方法是在控制流圖的基礎上,通過分析控68基本路徑測試(1)畫出程序的控制流圖。(2)計算程序的環形復雜度,導出程序基本路徑集中的獨立路徑條數,這是確定程序中每個可執行語句至少執行一次所必須的測試用例數目的上界?;韭窂綔y試(1)畫出程序的控制流圖。69基本路徑測試(3)導出基本路徑集,確定程序的獨立路徑。(4)根據(3)中的獨立路徑,設計測試用例的輸入數據和預期輸出。基本路徑測試(3)導出基本路徑集,確定程序的獨立路徑。70第一步:畫出控制流圖 c/c++語句中的控制語句表示含義如下: 圖中的每一個圓稱為流圖的結點,代表一條或多條語句。流圖中的箭頭稱為邊或連接,代表控制流。 為了說明流圖的用法,我們采用過程設計表示法,此處,流程圖用來描述程序控制結構。可將流程圖映射到一個相應的流圖(假設流程圖的菱形決定框中不包含復合條件)。在流圖中,每一個圓,稱為流圖的結點,代表一個或多個語句。一個處理方框序列和一個菱形決測框可被映射為一個結點,流圖中的箭頭,稱為邊或連接,代表控制流,類似于流程圖中的箭頭。一條邊必須終止于一個結點,即使該結點并不代表任何語句(例如:參見if-else-then結構的符號)。由邊和結點限定的范圍稱為區域。計算區域時應包括圖外部的范圍。 任何過程設計都要被翻譯成控制流圖。第一步:畫出控制流圖 c/c++語句中的控制語句表示含義如71

voidSort(intiRecordNum,intiType)1{2intx=0;3inty=0;4while(iRecordNum-->0)5{6 if(iType==0)7

x=y+2;8

else9 if(iType==1)10 x=y+10;11

else12

x=y+20;13}14}如下面的C函數:voidSort(intiRecordNum,72 在將程序流程圖簡化成控制流圖時,應注意: 在選擇或多分支結構中,分支的匯聚處應有一個匯聚結點。 邊和結點圈定的區域叫做區域。 當對區域計數時,圖形外的區域也應記為一個區域。如何根據程序流程圖畫出控制流程圖?

voidSort(intiRecordNum,intiType)1{2intx=0;3inty=0;4while(iRecordNum-->0)5{6 if(iType==0)7

x=y+2;8

else9 if(iType==1)10 x=y+10;11

else12

x=y+20;13}14} 在將程序流程圖簡化成控制流圖時,應注意:如何根據程序流程73畫出其程序流程圖如下:

voidSort(intiRecordNum,intiType)1{2intx=0;3inty=0;4while(iRecordNum-->0)5{6 if(iType==0)7

x=y+2;8

else9 if(iType==1)10 x=y+10;11

else12

x=y+20;13}14}畫出其程序流程圖如下:voidSort(intiRe74第二步:計算環形復雜度環形復雜度是一種為程序邏輯復雜性提供定量測度的軟件度量,將該度量用于計算程序的基本的獨立路徑數目,為確保所有語句至少執行一次的測試數量的上界。獨立路徑必須包含一條在定義之前不曾用到的邊。有以下三種方法計算環形復雜度:流圖中區域的數量對應于環型的復雜性;給定流圖G的環形復雜度:V(G),定義為V(G)=E-N+2,E是流圖中邊的數量,N是流圖中結點的數量;給定流圖G的環形復雜度:V(G),定義為V(G)=P+1,P是流圖G中判定結點的數量。第二步:計算環形復雜度環形復雜度是一種為程序邏輯復雜性提75程序流程圖和對應的控制流圖如下:程序流程圖和對應的控制流圖如下:76 對應上面圖中的環形復雜度,計算如下:流圖中有四個區域;V(G)=10條邊-8結點+2=4;V(G)=3個判定結點+1=4。 對應上面圖中的環形復雜度,計算如下:77第三步:導出測試用例

根據上面的計算方法,可得出四個獨立的路徑:路徑1:4-14路徑2:4-6-7-13-4-14路徑3:4-6-8-10-13-4-14路徑4:4-6-8-11-13-4-14

根據上面的獨立路徑,去設計輸入數據,使程序分別執行到上面四條路徑,即完成了測試用例的設計第三步:導出測試用例 根據上面的計算方法,可得出四個獨立的78第四步:準備測試用例

為確保基本路徑集中的每一條路徑的執行,根據判斷結點給出的條件,選擇適當的數據以保證某一條路徑可以被測試到,滿足上面例子基本路徑集的測試用例是:路徑1:4-14輸入數據:iRecordNum=0,或者取iRecordNum<0的某一個值預期結果:x=0路徑2:4-6-7-13-4-14輸入數據:iRecordNum=1,iType=0預期結果:x=2路徑3:4-6-8-10-13-4-14輸入數據:iRecordNum=1,iType=1預期結果:x=10路徑4:4-6-8-11-13-4-14輸入數據:iRecordNum=1,iType=2預期結果:x=20第四步:準備測試用例 為確?;韭窂郊械拿恳粭l路徑的執行,79習題1、使用基本路徑測試方法,為以下程序段設計測試用例。voidDo(intX,intA,intB){1if((A>1)&&(B=0))2X=X/A;3if((A=2)||(X>1))4X=X+1;5}習題1、使用基本路徑測試方法,為以下程序段設計測試用例。80復合判定的例子復合判定的例子81改為單個條件判定的嵌套結構的例子改為單個條件判定的嵌套結構的例子82教學目標理論環節學習理解白盒測試方法的基本概念學習理解白盒測試的覆蓋理論學習掌握白盒測試的路徑表達學習掌握白盒測試的基本路徑測試法實踐環節通過案例運用學習掌握覆蓋問題的解決方法運用基本路徑測試方法進行實際程序測試教學目標理論環節83

白盒測試也稱結構測試或邏輯驅動測試,是針對被測單元內部是如何進行工作的測試。白盒法把測試對象看做是一個打開的盒子,允許測試人員利用程序內部的邏輯結構及有關信息,設計或選擇測試用例,對程序所有邏輯路徑進行測試。通過在不同點檢查程序的狀態,確定實際的狀態是否與預期的狀態一致。

白盒測試也稱結構測試或邏輯驅動測試,是針對被測單元內84白盒法也不可能進行窮舉測試,企圖遍歷所有的路徑,往往是做不到的。

左圖所示的一個小程序的控制流程,其中每個圓圈代表一段源程序(或語句塊),圖中的曲線代表執行次數不超過20的循環,循環體中共有5條通路。這樣,可能執行的路徑有520條,近似為1014條可能的路徑。如果完成一個路徑的測試需要1毫秒,那么整個測試過程需要3170年。顯然,這也是不能接受的。白盒法也不可能進行窮舉測試,企圖遍歷所有的路徑,往往85白盒法需要了解程序的內部結構和詳細的處理過程,它按照程序內部邏輯測試程序,檢驗程序中每條通路是否按預定要求正確工作。白盒法需要了解程序的內部結構和詳細的處理過程,它按照程序內部86對于白盒測試,即使每條路徑都測試了,程序仍可能有錯。再如由于疏忽漏寫了路徑,白盒測試也發現不了。所以,白盒法不能使測試達到徹底。為了用有限的測試發現更多的錯誤,需精心設計測試用例。黑盒法、白盒法是設計測試用例的基本策略,每一種方法對應著多種設計測試用例的技術,每種技術可達到一定的軟件質量標準要求。對于白盒測試,即使每條路徑都測試了,程序仍可能有錯。87測試用例的設計白盒技術在測試階段窮舉測試不可行,必須要從數量極大的可用測試用例中精心地挑選少量的測試數據,使得采用這些測試數據能夠達到最佳的測試效果,能夠高效率地把隱藏的錯誤揭露出來。下面介紹幾種白盒測試設計測試用例的方法。測試用例的設計白盒技術在測試階段窮舉測試不可88白盒測試的主要方法邏輯驅動測試基本路徑測試

主要用于軟件驗證。使用程序設計的控制結構導出測試用例。白盒測試的主要方法邏輯驅動測試89全部例子均為C語言編制六種邏輯覆蓋全部例子均為C語言編制六種邏輯覆蓋90一個顯而易見的問題:一個完整的語句,未必是一行語句

y=abs(x);if(x>=0)y=sqrt(x);if(x>=0)y=x; elsey=abs(x);if((x>=0)&&(z>=0))y=x*z;簡單的賦值語句單分支語句雙分支語句判斷條件較復雜的單分支語句一個顯而易見的問題:一個完整的語句,未必是一行語句y=ab91一些更復雜的語句

if((x<0)or(x>100))printf("ERROR!"); else if(x>=60)printf("OK!"); else printf("FAIL!");for(i=0;i<10;i++) s=s+a[i];判斷條件較復雜的多分支語句簡單的循環語句對以上語句,請思考:如何讓它們都被執行?一些更復雜的語句if((x<0)or(x>100))p92簡單的賦值語句使賦值號左側的變量得到一個值分支語句使各個分支語句中至少一個被執行循環語句使循環體被執行至少一次Q:什么叫做“語句被執行”?簡單的賦值語句Q:什么叫做“語句被執行”?93給出測試數據,使各語句均被執行

y=abs(x);if(x>=0)y=sqrt(x);if(x>=0)y=x; elsey=abs(x);令x任取一值即可使本語句被執行令x任取一非負數值即可保證判斷條件成立,語句被執行令x任取一值因為此二分支覆蓋了全部的取值范圍,x無論取什么值,都能使其中的一個分支被執行給出測試數據,使各語句均被執行y=abs(x);令x任取一94

if((x>=0)||(z>=0))y=x*z;不管z,令x任取一非負數值不管x,令z任取一非負數值令x、z同時任取一非負數值這三種取值均能使判斷條件成立令判斷條件成立,語句即被執行if((x>=0)||(z>=0))y=x*z;不管95

if((x<0)or(x>100))printf("ERROR!"); else if(x>=60)printf("OK!"); else printf("FAIL!");令判斷條件A成立,分支之一被執行令判斷條件A不成立,但B成立,那么分支之二被執行令判斷條件AB均不成立,則分支之三被執行AB以上三種取值,均能使這個分支語句得以執行if((x<0)or(x>100))printf("E96

for(i=0;i<10;i++) s=s+a[i];令i取零到9閉區間內的任意值,循環體就會被執行可見:越復雜、影響最終結果的變量的可能值越多的語句,只要取其任一個分支或任一種可能,整條語句就算被執行最徹底的測試,是考慮到每一種可能最粗略的測試,是僅僅考慮到其中的一種可能for(i=0;i<10;i++)令i取零到9閉區間內97邏輯驅動測試

是以程序內在邏輯結構為基礎的測試,即測試覆蓋率。共包括以下6種類型(強弱程度逐漸遞增):語句覆蓋判定覆蓋條件覆蓋判定-條件覆蓋條件組合覆蓋路徑覆蓋考慮到每一種可能,最徹底僅考慮一種可能,最粗略邏輯驅動測試 是以程序內在邏輯結構為基礎的測試,即測試覆蓋率98

voidDoWork1(intx)1{2intk=0,j=0;3

if(x>3) //語句14

k=x^3-1;

5

j=sqrt(k);

//語句26

printf("%d,%5.2d\n",k,j);7}如下的C函數:Q1:本函數中起作用的變量有哪幾個?xQ2:用最簡單的輸入,使函數中的每個語句都得到執行:令x為4單分支語句voidDoWork1(intx)如下的C函數:99

voidDoWork(intx,inty,intz)1{2intk=0,j=0;3

if((x>3)&&(z<10))

//語句14

{5

k=x*y-1;

6j=sqrt(k);7

}8

j=j%3;//語句29}如下的C函數:Q1:本函數中起作用的變量有哪幾個?x、y、zQ2:用最簡單的輸入,使函數中的每個語句都得到執行x=4同時z=9判斷條件較復雜的單分支語句voidDoWork(intx,inty,in100

voidDoWork2(intx)1{2intk=0,j=0;3

if(x>3)

//語句14

k=x-1;5

else

6k=sqrt(x);

}如下的C函數:Q1:本函數中起作用的變量有哪幾個?Q2:用最簡單的輸入,使函數中的每個語句都得到執行 x為4Q3:使函數中的每個語句都得到最充分的執行 用例1:x為4

用例2:x為3雙分支語句voidDoWork2(intx)如下的C函數:101概念語句覆蓋:使得每一條可執行語句至少執行一次判定覆蓋(也稱為分支覆蓋):使程序中每個判斷的取真分支和取假分支至少執行一次條件覆蓋:使程序中每個判斷的每個條件的每個可能取值至少執行一次判定-條件覆蓋:使程序中每個判斷的每個條件的所有可能取值至少執行一次,并且每個可能的判斷結果也至少執行一次,換言之,即是要求各個判斷的所有可能的條件取值組合至少執行一次條件組合覆蓋:使程序中每個判斷的所有可能的條件取值組合至少執行一次路徑覆蓋:要覆蓋程序中所有可能的路徑設計若干個測試用例,運行被測試程序……概念設計若干個測試用例,運行被測試程序……102各種邏輯覆蓋的概念介紹語句覆蓋:設計若干個測試用例,運行被測試程序,使得每一條可執行語句至少執行一次;但其覆蓋標準無法發現判定中邏輯運算的錯誤;此方法是把程序中的所有的語句都覆蓋到;if(x>=0)y=x; elsey=abs(x);x=abs(x);if(x>=0)y=x;

elsey=abs(x);一個用例即可:x為0一個用例即可:x為0各種邏輯覆蓋的概念介紹但其覆蓋標準無法發現判定中邏輯運算的錯103判定覆蓋(也稱為分支覆蓋):設計若干個測試用例,運行所測程序,使程序中每個判斷的取真分支和取假分支各至少執行一次;((x>3)&&(z<10))為真和為假各取一次(但并不管是怎么取到的)判定覆蓋是把程序中每個分支都覆蓋到;但當判斷條件較為復雜時,它未必能發現每個條件的錯誤:if(x>=0)y=x; elsey=abs(x);if(x>=0)y=x;

elsey=abs(x);對程序中的雙分支語句,相當于覆蓋了兩次第1個用例:x為0第2個用例:x為-1((x>3)&&(z<10))為真和為假各取一次(但并不管是104這個分支語句中,判斷就是條件,條件就是判斷if((x>3)||(z<10))......中,((x>3)||(z<10))是一個判斷,其中的(x>3)和(z<10)分別是構成這個判斷的兩個條件,判斷的結果真假取決于這兩個條件的值分別是真還是假何謂判斷?何謂條件?if(x>=0)y=x; elsey=abs(x);if((x>3)||(z<10))...... else......這個分支語句中,判斷取決于兩個條件,這兩個條件的真假和判斷的真假未必一致這個分支語句中,判斷就是條件,條件就是判斷if((x>3)|105條件覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每個判斷的每個條件的每個可能取值至少執行一次;(x>3)為真和假各取一次;(z<10)為真和為假各取一次(但至于它們分別取了真假后怎么組合以及((x>3)||(z<10))這個整體的真假就沒有提及)條件覆蓋是把判斷中所有的條件都覆蓋到;但它未必能覆蓋全部分支;if((x>3)||(z<10))......中,((x>3)||(z<10))是一個判斷,其中的(x>3)和(z<10)分別是構成這個判斷的兩個條件,判斷的結果真假取決于這兩個條件的值分別是真還是假何謂判斷?何謂條件?(x>3)為真和假各取一次;(z<10)為真和為假各取一次條106也只有在判斷條件較復雜時,2和3才有區別if((x>3)||(z<10))...... else......第3個用例:z為9第4個用例:z為112.判定覆蓋3.條件覆蓋第1個用例:x為4第2個用例:x為2同時z為11第1個用例:x為4第2個用例:x為2if((x>3)||(z<10))...... else......也只有在判斷條件較復雜時,2和3才有區別if((x>3)||107判定-條件覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每個判斷的每個條件的所有可能取值至少執行一次,并且每個可能的判斷結果也至少執行一次;(x>3)為真和假各取一次;(z<10)為真和為假各取一次并把((x>3)||(z<10))為真和為假各取一次即: (x>3)和(z<10)同時為真取一次;

(x>3)和(z<10)同時為假取一次;就可以滿足if((x>3)||(z<10))...... else......(x>3)為真和假各取一次;(z<10)為真和為假各取一次即108繼續對比2、3、4的區別第3個用例:z為9第4個用例:z為112.判定覆蓋4.判斷-條件覆蓋第1個用例:x為4第2個用例:x為2同時z為11第1個用例:x為4第2個用例:x為2if((x>3)||(z<10))...... else......第3個用例:z為9第4個用例:z為113.條件覆蓋第1個用例:x為4第2個用例:x為2第6個用例:x為2同時z為11第5個用例:x為4(以上用例可以縮減)繼續對比2、3、4的區別第3個用例:z為9第4個用例:z為1109條件組合覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每個判斷的所有可能的條件取值組合至少執行一次;把((x>3)和(z<10))為真和為假的各種可能組合各執行一次即: (x>3)和(z<10)同時為真取一次;

(x>3)和(z<10)同時為假取一次;

(x>3)和(z<10)分別為真假取一次;

(x>3)和(z<10)分別為假真取一次;才能滿足if((x>3)||(z<10))......中,((x>3)||(z<10))是一個判斷,其中的(x>3)和(z<10)分別是構成這個判斷的兩個條件,判斷的結果真假取決于這兩個條件的值分別是真還是假何謂判斷?何謂條件?條件組合覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每110繼續對比4、5的區別第3個用例:x為4同時z為11第4個用例:x為2同時z為95.條件組合覆蓋第1個用例:x為4同時z為9第2個用例:x為2同時z為11if((x>3)||(z<10))...... else......第3個用例:z為9第4個用例:z為114.判定-條件覆蓋第1個用例:x為4第2個用例:x為2第5個用例:x為2同時z為11真真、假假、真假、假真繼續對比4、5的區別第3個用例:x為4同時z為11第4個用例111路徑覆蓋:設計足夠多的測試用例,運行所測程序,要覆蓋程序中所有可能的路徑 它是最強的覆蓋準則,但只有在程序中有多個復雜分支時,才能看出和之前幾種覆蓋的區別白盒測試及其用例的設計課件112voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;//語句塊1j=sqrt(k);}if((x==4)||(y>5)){j=x*y+10;//語句塊2}j=j%3;//語句塊3}函數的流程圖voidDoWork(intx,inty,intz113語句覆蓋為了說明簡略,分別對各個判斷的取真、取假分支編號為b、c、d、e。為了測試語句覆蓋率只要設計一個測試用例就可以把三個執行語句塊中的語句覆蓋了。 測試用例輸入為:{x=4、y=5、z=5} 程序執行的路徑是:abd

該測試用例雖然覆蓋了每條可執行語句,但并不能檢查判斷邏輯是否有問題,例如在第一個判斷中把&&錯誤的寫成了||,則上面的測試用例仍可以覆蓋所有的執行語句(即查不出寫錯了這個事實)可以說語句覆蓋率是最弱的邏輯覆蓋準則使程序中每個語句至少執行一次語句覆蓋為了說明簡略,分別對各個判斷的取真、取假分支 該測試114判定覆蓋對于上面的程序,如果設計兩個測試用例則可以滿足分支覆蓋的要求。測試用例的輸入為:{x=4、y=5、z=5} abd{x=2、y=5、z=5} ace上面的兩個測試用例雖然能夠滿足分支覆蓋的要求,但是也不能實現對判斷條件的檢查效果,如果把第二個條件y>5錯誤地寫成y<5,上面的測試用例同樣滿足了分支覆蓋(即查不出寫錯了這個事實)使程序中每個判斷的取真分支和取假分支至少執行一次判定覆蓋對于上面的程序,如果設計兩個測試用例則可以滿足分115條件覆蓋就是設計若干個測試用例,運行被測試對象,使得程序中每個判斷的每個條件的所有可能取值至少執行一次。對例子中的所有條件取值加以標記。例如: 對于第一個判斷: 條件1:x>3取真值為T1,取假值為-T1 條件2:z<10取真值為T2,取假值為-T2 對于第二個判斷: 條件1:x=4取真值為T3,取假值為-T3 條件2:y>5取真值為T4,取假值為-T4使程序中每個判斷每個條件分別取真和取假各一次條件覆蓋就是設計若干個測試用例,運行被測試對象,使得程序中每116可以設計測試用例如下:測試用例通過路徑條件取值覆蓋分支x=4、y=6、z=5abdT1、T2、T3、T4bdx=2、y=5、z=5ace-T1、-T2、-T3、-T4ce上面的測試用例不但覆蓋了所有分支的真假兩個分支,而且覆蓋了判斷中的所有條件的可能值可以設計測試用例如下:測試用例通過路徑條件取值覆蓋分支117如果設計了下面的測試用例,則雖然滿足了條件覆蓋,但只覆蓋了第一個條件的取假分支和第二個條件的取真分支,又不滿足分支覆蓋的要求(be線路未執行)測試用例通過路徑條件取值覆蓋分支x=2、y=6、z=5acd-T1、T2、-T3、T4cdx=4、y=5、z=5acdT1、-T2、T3、-T4cd使程序中每個判斷的取真分支和取假分支至少執行一次需要改進:即判定-條件覆蓋如果設計了下面的測試用例,則雖然滿足了條件覆蓋,但只覆蓋118判定-條件覆蓋

判定-條件覆蓋就是設計足夠的測試用例,使得判斷中每個條件的所有可能取值至少執行一次,同時每個判斷的所有可能判斷結果至少執行。根據定義只需設計以下兩個測試用例便可以覆蓋8個條件值以及4個判斷分支。測試用例通過路徑條件取值覆蓋分支x=4、y=6、z=5abdT1、T2、T3、T4bdx=2、y=5、z=11ace-T1、-T2、-T3、-T4ce判定-條件覆蓋判定-條件覆蓋就是設計足夠的測試用例,119

判定-條件覆蓋從表面來看,測試了所有條件的取值,但實際上,某些條件掩蓋了另一些條件,即仍然有遺漏。例如:對于條件表達式(x>3)&&(z<10)來說,必須兩個條件都滿足才能確定表達式為真。如果(x>3)為假,則一般的編譯器將不再判斷是否(z<10)是否為真。對于第二個表達式(x==4)||(y>5)來說,若x==4測試結果為真,就認為表達式的結果為真,這時不再檢查(y>5)是否為真。可見,采用判定-條件覆蓋,邏輯表達式中的錯誤不一定都能查出來。 判定-條件覆蓋從表面來看,測試了所有條件的取值,但實際上,120條件組合覆蓋: 條件組合覆蓋就是設計足夠的測試用例,運行被測試對象,使得每一個判斷的所有可能的條件取值組合至少執行一次。 現在對例子中的各個判斷的條件取值組合加以標記如下:x>3,z<10記做T1T2,第一個判斷的取真分支x>3,z>=10記做T1-T2,第一個判斷的取假分支x<=3,z<10記做-T1T2,第一個判斷的取假分支x<=3,z>=10記做-T1-T2,第一個判斷的取假分支x=4,y>5記做T3T4,第二個判斷的取真分支x=4,y<=5記做T3-T4,第二個判斷的取真分支x!=4,y>5記做-T3T4,第二個判斷的取真分支x!=4,y<=5記做-T3-T4,第二個判斷的取假分支判定-條件覆蓋使得判斷中每個條件的所有可能取值至少執行一次,同時每個判斷的所有可能判斷結果至少執行一次if((x>3)&&(z<10))if((x==4)||(y>5))條件組合覆蓋: 條件組合覆蓋就是設計足夠的測試用例,運行被測121根據定義取4個測試用例,就可以覆蓋上面8種條件取值的組合測試用例。如下表:測試用例通過路徑條件取值覆蓋組合號x=4、y=6、z=5abdT1、T2、T3、T41和5x=4、y=5、z=15acdT1、-T2、T3、-T42和6x=2、y=6、z=5acd-T1、T2、-T3、T43和7x=2、y=5、z=15ace-T1、-T2、-T3、-T44和8上面的測試用例覆蓋了所有條件的可能取值的組合,覆蓋了所有判斷的可取分支,但卻丟失了路徑abe根據定義取4個測試用例,就可以覆蓋上面8種條件取值的組合測試122路徑覆蓋路徑覆蓋就是設計足夠多的測試用例,覆蓋被測試對象中的所有可能路徑在上面的測試用例中再添加一個測試用例,則可對程序進行全部的路徑覆蓋測試用例通過路徑覆蓋條件x=4、y=6、z=5abdT1、T2、T3、T4x=4、y=5、z=15acdT1、-T2、T3、-T4x=2、y=6、z=15ace-T1、-T2、-T3、-T4x=5、y=6、z=5abeT1、T2、-T3、T4路徑覆蓋路徑覆蓋就是設計足夠多的測試用例,覆蓋被測試對象中的123路徑覆蓋分析: 雖然前面一組測試用例滿足了路徑覆蓋,但并沒有覆蓋程序中所有的條件組合,即滿足路徑覆蓋的測試用例并不一定滿足組合覆蓋。路徑覆蓋分析:124路徑覆蓋說明:對于比較簡單的小程序,實現路徑覆蓋是可能做到的。但如果程序中出現較多判斷和較多循環,可能的路徑數目將會急劇增長,要在測試中覆蓋所有的路徑是無法實現的。為了解決這個難題,只有把覆蓋路徑數量壓縮到一定的限度內,如程序中的循環體只執行一次。路徑覆蓋說明:125路徑覆蓋在實際測試中,即使對于路徑數很有限的程序已經做到路徑覆蓋,仍然不能保證被測試程序的正確性,還需要采用其他測試方法進行補充。路徑覆蓋在實際測試中,即使對于路徑數很有限的程126對這個C函數分別作六種覆蓋Main(){inta,b;

floatc;if((a>0)&&(b>0)){

c=c/a;//語句塊1}if((a>1)||(c>1)){

c=c+1;//語句塊2}

c=b+c;//語句塊3}對這個C函數分別作六種覆蓋Main()1276種覆蓋標準的對比6種覆蓋標準的對比128

語句覆蓋發現錯誤能力最弱。判定覆蓋包含了語句覆蓋,但它可能會使一些條件得不到測試。條件覆蓋對每一條件進行單獨檢查,一般情況下它的檢錯能力較判定覆蓋強,但有時達不到判定覆蓋的要求。判定/條件覆蓋包含了判定覆蓋和條件覆蓋的要求,但由于計算機系統軟件實現方式的限制,實際上不一定達到條件覆蓋的標準。條件組合覆蓋發現錯誤能力較強,凡滿足其標準的測試用例,也必然滿足前4種覆蓋標準。 語句覆蓋發現錯誤能力最弱。判定覆蓋包含了語句覆蓋,但它129

前5種覆蓋標準把注意力集中在單個判定或判定的各個條件上,可能會使程序某些路徑沒有執行到。路徑測試根據各判定表達式取值的組合,使程序沿著不同的路徑執行,查錯能力強。但由于它是從各判定的整體組合出發設計測試用例的,可能使測試用例達不到條件組合覆蓋的要求。在實際的邏輯覆蓋測試中,一般以條件組合覆蓋為主設計測試用例,然后再補充部分用例,以達到路徑覆蓋測試標準。 前5種覆蓋標準把注意力集中在單個判定或判定的各個條件上130

練習題:為以下流程圖所示的程序段設計一組測試用例,要求分別滿足語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。一個被測試程序的流程圖練習題:為以下流程圖所示的程序段設計一組測試用例,要求分131作業題作業題132作業題試做出左邊三角形問題的語句覆蓋,條件覆蓋,判定覆蓋,判定-條件覆蓋、組合條件覆蓋的測試用例.并注明滿足覆蓋的條件.eg:abc345T1T2T3F4F5F6作業題試做出左邊三角形問題的語句覆蓋,條件覆蓋,判定覆蓋,判133基本路徑測試基本路徑測試134基本路徑測試基本路徑測試法是在程序控制流圖的基礎上,通過分析控制構造的環路復雜性,導出基本可行路徑的集合,從而設計測試用例的方法。設計出的測試用例要保證被測試程序的每個可執行語句至少執行一次。完成路徑測試的理想情況是做到路徑覆蓋,但對于復雜性大的程序要做到所有路徑覆蓋是不可能的?;韭窂綔y試基本路徑測試法是在程序控制流圖的基礎上,135基本路徑測試在不能做到所有路徑覆蓋的前提下,如果某一程序的每一個獨立路徑都被測試過,那么可以認為程序中的每個語句都已經檢驗過了,即達到了語句覆蓋。這種測試方法就是通常所說的基本路徑測試方法。基本路徑測試在不能做到所有路徑覆蓋的前提下,如136voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;//語句塊1j=sqrt(k);}if((x==4)||(y>5)){j=x*y+10;//語句塊2}j=j%3;//語句塊3}函數的流程圖voidDoWork(intx,inty,intz137基本路徑測試 這個例子是一個很簡單的程序函數,只有四條路徑。但在實踐中,一個不太復雜的程序,其路徑都是一個龐大的數字,要在測試中覆蓋所有的路徑是不現實的?;韭窂綔y試 這個例子是一個很簡單的程序函數,只有四條路徑138

為了解決這一難題,只得把覆蓋的路徑數壓縮到一定限度內,例如,程序中的循環體只執行一次。

基本路徑測試就是這樣一種測試方法,它在程序控制圖的基礎上,通過分析控制構造的環行復雜性,導出基本可執行路徑集合,從而設計測試用例的方法。 設計出的測試用例要保證在測試中程序的每一個可執行語句至少執行一次。 為了解決這一難題,只得把覆蓋的路徑數壓縮到一定限度內139在介紹基本路徑方法之前,必須先介紹一種簡單的控制流表示方法,即流圖??刂屏鲌D(可簡稱流圖)是對程序流程圖進行簡

溫馨提示

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

評論

0/150

提交評論