白盒測試方法_第1頁
白盒測試方法_第2頁
白盒測試方法_第3頁
白盒測試方法_第4頁
白盒測試方法_第5頁
已閱讀5頁,還剩110頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、4. 白盒測試方法 l程序結(jié)構(gòu)分析l邏輯覆蓋l路徑分析l程序插裝14.1程序結(jié)構(gòu)分析程序的結(jié)構(gòu)形式是白盒測試的主要依據(jù)。程序的結(jié)構(gòu)形式是白盒測試的主要依據(jù)。l控制流分析控制流分析l數(shù)據(jù)流分析數(shù)據(jù)流分析l信息流分析信息流分析程序結(jié)構(gòu)分析的目的程序結(jié)構(gòu)分析的目的就是要找到就是要找到程序中隱藏的各種錯(cuò)誤。程序中隱藏的各種錯(cuò)誤。 24.1程序結(jié)構(gòu)分析 一、控制流分析一、控制流分析l非結(jié)構(gòu)化程序會(huì)給測試、排錯(cuò)和程序的維護(hù)帶來許多不必要的困難.l70年代以來,結(jié)構(gòu)化程序的概念逐漸為人們普遍接受。體現(xiàn)這一要求對于若干新的語言,如Pascal、C等并不困難,因?yàn)樗鼈兌季哂蟹从郴究刂平Y(jié)構(gòu)的相應(yīng)控制語句。l要求

2、寫出的程序是結(jié)構(gòu)良好的。3 一、控制流分析1.1.控制流圖控制流圖程序流程圖程序流程圖(flowchart):是人們一種程序控制結(jié)構(gòu)的圖形表示方式。在程序流程圖上的框內(nèi)常常標(biāo)明了處理要求或條件,這些在做路徑分析時(shí)是不重要的。4一、控制流分析1.1.控制流圖控制流圖為了更加突出控制流的結(jié)構(gòu),需要對程序流程圖做些簡化,我們稱這種簡化了的流程圖為控制流圖。5一、控制流分析1.1.控制流圖控制流圖控制流圖中的符號:控制流圖中的符號:節(jié)點(diǎn):節(jié)點(diǎn):以標(biāo)有編號的圓圈表示。代表流程圖中矩形表示的處理、菱形表示的判斷以及兩至多條控制流線的交匯點(diǎn)??刂屏骶€:控制流線:以帶箭頭的直線或弧線表示。它與流程圖中的流線是

3、一致的,標(biāo)明了控制的順序??刂屏骶€通常標(biāo)有名字,如圖中所標(biāo)的a、b、c等。6一、控制流分析1.1.控制流圖控制流圖控制流圖矩陣控制流圖矩陣: :為便于在機(jī)器上表示和處理控制流圖,我們可以把控制流圖表示成矩陣的形式,稱為控制流圖矩陣。如圖表示的控制流圖5x5矩陣,是由該控制流圖中含有5個(gè)節(jié)點(diǎn)決定的。7一、控制流分析2對程序結(jié)構(gòu)的基本要求對程序結(jié)構(gòu)的基本要求對于程序結(jié)構(gòu)提出以下4點(diǎn)基本要求,這些要求是,寫出的程序不應(yīng)包含:轉(zhuǎn)向并不存在的標(biāo)號; 沒有用的語句標(biāo)號; 從程序入口進(jìn)入后無法達(dá)到的語句; 不能達(dá)到停機(jī)語句的語句。 8一、控制流分析2程序結(jié)構(gòu)的基本要求程序結(jié)構(gòu)的基本要求如何對程序進(jìn)行檢測,把

4、以上如何對程序進(jìn)行檢測,把以上4種問題從程種問題從程序中找出來序中找出來? 轉(zhuǎn)向并不存在的標(biāo)號; 沒有用的語句標(biāo)號;這兩種情況是很容易發(fā)現(xiàn)的,在此我們不再討論。9一、控制流分析2程序結(jié)構(gòu)的基本要求程序結(jié)構(gòu)的基本要求從程序入口進(jìn)入后無法達(dá)到的語句;這種情況可以利用檢驗(yàn)不可達(dá)代碼算法加以檢驗(yàn),凡未作標(biāo)記的節(jié)點(diǎn)均為不可達(dá)代碼。 。10一、控制流分析2程序結(jié)構(gòu)的基本要求程序結(jié)構(gòu)的基本要求 不能達(dá)到停機(jī)語句的語句這種情況也可用相似的方法找出,在上述算法中,只需把“入口節(jié)點(diǎn)”改為“出口節(jié)點(diǎn),“后繼”改為“前趨”即可。 11一、控制流分析3 3程序結(jié)構(gòu)分析程序結(jié)構(gòu)分析 結(jié)構(gòu)化流程圖 :12一、控制流分析3

5、3程序結(jié)構(gòu)分析程序結(jié)構(gòu)分析 結(jié)構(gòu)化流程圖 :13一、控制流分析3 3程序結(jié)構(gòu)分析程序結(jié)構(gòu)分析 結(jié)構(gòu)化流程圖 :14一、控制流分析3 3程序結(jié)構(gòu)分析程序結(jié)構(gòu)分析 l通過利用流程圖語法的產(chǎn)生式規(guī)則進(jìn)行流程圖的自底向上分析,能夠驗(yàn)證上述結(jié)構(gòu)規(guī)則在程序編寫中是否得到遵循,如果確已遵循,便可得到有關(guān)其構(gòu)成成分的語法樹。l此外,利用流程圖語法還能揭示控制結(jié)構(gòu)的缺限。15一、控制流分析3 3程序結(jié)構(gòu)分析程序結(jié)構(gòu)分析 l我們給出的結(jié)構(gòu)程序規(guī)則是很有限的,通常還可作進(jìn)一步擴(kuò)充。例如,可以允許使用具有多出口的循環(huán)構(gòu)造,提高程序的清晰性,也不會(huì)使程序正確性證明的工作更加困難。l盡管允許這樣的結(jié)構(gòu)會(huì)使檢查流程圖結(jié)構(gòu)是

6、否良好更為復(fù)雜,但作其它的流程分析還是可行的。16二、數(shù)據(jù)流分析什么是數(shù)據(jù)流分析?什么是數(shù)據(jù)流分析?l數(shù)據(jù)流分析最初是隨著編譯系統(tǒng)要生成有效的目標(biāo)碼而出現(xiàn)的,這類方法主要用于代碼優(yōu)化。l數(shù)據(jù)流分析方法在確認(rèn)系統(tǒng)中也得到成功的運(yùn)用,用以查找如引用未定義變量等程序錯(cuò)誤,以及用來查找對未曾使用的變量再次賦值等數(shù)據(jù)流異常的情況。17二、數(shù)據(jù)流分析數(shù)據(jù)流分析重要性:數(shù)據(jù)流分析重要性:在程序測試中,找出這些錯(cuò)誤是很重要的。因?yàn)檫@常常以一些常見程序錯(cuò)誤為表現(xiàn)形式,如錯(cuò)拼名字、名字混淆或是丟失了語句。18二、數(shù)據(jù)流分析(1 1)數(shù)據(jù)流問題)數(shù)據(jù)流問題l如果程序中某一語句執(zhí)行時(shí)能改變某個(gè)程序變量V的值,則稱V是

7、被該語句定義的。l如果一語句的執(zhí)行引用了內(nèi)存中變量V的值,則說該語句引用變量V。 19二、數(shù)據(jù)流分析(1 1)數(shù)據(jù)流問題)數(shù)據(jù)流問題20例如例如:1.語句 X:Y十Z定義了X,引用了Y和Z;2.語句 if YZ then goto exit引用了Y和Z。3. 輸入語句 READ X定義了X。4. 輸出語句 WRITE X 引用了X。 二、數(shù)據(jù)流分析這是一個(gè)程序控制流圖,同時(shí)給出了每一語句定義和這是一個(gè)程序控制流圖,同時(shí)給出了每一語句定義和引用的變量的列表。引用的變量的列表。21二、數(shù)據(jù)流分析 該程序中合有兩個(gè)錯(cuò)誤:該程序中合有兩個(gè)錯(cuò)誤: 語句2使用了變量W,而在此之前并末對其定義。 語句5、6

8、使用變量V,這在第一次執(zhí)行循環(huán)時(shí)也未對其定義過。 此外,該程序還包含兩個(gè)異常:此外,該程序還包含兩個(gè)異常: (3)語句6對Z的定義與使用有誤。 (4)語句8對W的定義也從未使用過。 22二、數(shù)據(jù)流分析l程序中包含有些異常,如、也許不會(huì)引起執(zhí)行的錯(cuò)誤。l但是這一情況表明,也許程序中含有錯(cuò)誤;l另外,我們也許可以把程序?qū)懙酶菀桌斫?,更?yōu)化,從而能夠簡化驗(yàn)證工作,以及隨后的維護(hù)工作。23二、數(shù)據(jù)流分析(2)可達(dá)性定義)可達(dá)性定義l變量V的定義是修改V值的一個(gè)程序語句。l如果語句i是V的一個(gè)定義,我們可以用Vi來表示這一定義。24二、數(shù)據(jù)流分析(2)可達(dá)性定義)可達(dá)性定義l如果從節(jié)點(diǎn)i到節(jié)點(diǎn)j的入口

9、(或出口)變量V有一明確定義路徑,定義Vi便說成是達(dá)到了節(jié)點(diǎn)j的入口(或出口)。如果控制流圖中一路徑并未對變量如果控制流圖中一路徑并未對變量V定定義,那么該路徑就是變量義,那么該路徑就是變量V的明確定義。的明確定義。l定義Vi被說成是“殺掉”了那些達(dá)到節(jié)點(diǎn)i的變量V的所有其它定義(但保留了其它變量的所有定義)。25二、數(shù)據(jù)流分析(2)可達(dá)性定義)可達(dá)性定義現(xiàn)在讓我們來看哪些定義達(dá)到了程序的每一節(jié)點(diǎn)。l對于任一節(jié)點(diǎn),我們用Si和ti分別表示達(dá)到i的入口和出口的定義集合。l設(shè) pi是節(jié)點(diǎn)i保存的所有定義的集合,Ci是節(jié)點(diǎn)i中生成的定義集合。則對于每個(gè)節(jié)點(diǎn)i,這些集合滿足關(guān)系:ti=(SiPi)Ci

10、26二、數(shù)據(jù)流分析(2)可達(dá)性定義)可達(dá)性定義很明顯,達(dá)到節(jié)點(diǎn)i頂點(diǎn)的定義集合是達(dá)到其前趨出口的定義集合的并。l若用xi表示節(jié)點(diǎn)i前趨的集合,則可將此條件表示為:Si=(SiPi)di)j Xi 其中,其中,di=Cij Xi27二、數(shù)據(jù)流分析(2)可達(dá)性定義)可達(dá)性定義l若是一個(gè)具有n個(gè)節(jié)點(diǎn)的圖,我們便有這樣的一個(gè)聯(lián)立方程組(i取值1,2,n)。l這樣的方程組不只有一組解。但總有一個(gè)最小解,它給出要求達(dá)到的定義。l這一方程組可用循環(huán)迭代算法求解。28二、數(shù)據(jù)流分析(2)可達(dá)性定義)可達(dá)性定義在該算法中,一開始規(guī)定Si=d;(i=1,2,n)。然后依次對Sl,S2,Sn求解方程Si=(SiPi

11、)di)j Xi每次令等號左端的Si總?cè)⌒轮?,?dāng)Si的值不再改變時(shí),就得到了所求的解。29二、數(shù)據(jù)流分析30程序每一個(gè)節(jié)點(diǎn)的可達(dá)定義表:程序每一個(gè)節(jié)點(diǎn)的可達(dá)定義表:二、數(shù)據(jù)流分析(3)引用未定義變量)引用未定義變量根據(jù)可達(dá)定義表,可按下述方法找出對未定義變量的引用。l對每一節(jié)點(diǎn)i,依次考慮語句i引用的每一變量;l如果對任何這樣的變量V,并沒有V的定義達(dá)到i,那么程序含有一個(gè)錯(cuò)誤。 31二、數(shù)據(jù)流分析(3)引用未定義變量)引用未定義變量l在上面的例子中,考慮節(jié)點(diǎn)2,根據(jù)引用變量表看出,這個(gè)語句引用變量W。l從可達(dá)定義表發(fā)現(xiàn),W的定義不可能達(dá)到節(jié)點(diǎn)2。l因而程序中必定含有一個(gè)錯(cuò)誤。這屬于前述第一類

12、錯(cuò)誤(轉(zhuǎn)向并不存在的標(biāo)號)。32二、數(shù)據(jù)流分析33(4)未曾使用的定義)未曾使用的定義l可以用下面的方法找出未曾使用的定義。l對于每一變量定義Vi,依次考慮由Vi達(dá)到的每個(gè)程序節(jié)點(diǎn)I;l如果沒有引用變量V的相應(yīng)語句,則程序中含有一個(gè)異常。二、數(shù)據(jù)流分析(4)未曾使用的定義)未曾使用的定義l例如,在上例中,考慮定義Z6時(shí),根據(jù)可達(dá)定義表發(fā)現(xiàn),這一定義達(dá)到節(jié)點(diǎn)7,8和9。l然而,由引用變量表我們看出,并沒有對應(yīng)的語句引用變量Z,這屬于第三類錯(cuò)誤-從程序入口進(jìn)入后無法達(dá)到的語句。344.2邏輯覆蓋邏輯覆蓋 結(jié)構(gòu)測試是依據(jù)被測程序的邏輯結(jié)構(gòu)設(shè)計(jì)測試用例,驅(qū)動(dòng)被測程序運(yùn)行完成的測試。結(jié)構(gòu)測試中的一個(gè)重要

13、問題是,測試進(jìn)行到什么程度就達(dá)到要求,可以結(jié)束測試了,這也就是說我們需要給出結(jié)構(gòu)測試的覆蓋準(zhǔn)則。354.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 36w 1.語句覆蓋 w 2.判定覆蓋w 3.條件覆蓋w 4.判定-條件覆蓋w 5.路徑覆蓋4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 37w 1.語句覆蓋 程序例子:IF(A1)AND(BO)IHEN XXAIF(A2)OR(X1)THEN xx十14.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 38w 1.語句覆蓋 什么是語句覆蓋?什么是語句覆蓋?w 在測試時(shí),首先設(shè)計(jì)若干個(gè)測試用例。w 然后運(yùn)行被測程序,使程序中的每個(gè)可

14、執(zhí)行語句至少執(zhí)行一次。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 39w 1.語句覆蓋 如果選用的測試用例是: A2 B0 CASEl X3則程序按路徑ace執(zhí)行。這樣該程序段的4個(gè)語句均得到執(zhí)行,從而做到了語句覆蓋。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 40w 1.語句覆蓋 如果選用的測試用例是: A2 B1 CASE2 X3則程序按路徑bce執(zhí)行。此時(shí)該程序段只執(zhí)行了其中的3個(gè)語句,所以未達(dá)到語句覆蓋。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 41w 1.語句覆蓋 w 從程序中每個(gè)語句都得到執(zhí)行這一點(diǎn)來看,語句覆蓋的方法似乎能夠比較全面地檢驗(yàn)每一個(gè)語句

15、。w 但即使程序中每個(gè)語句都得到執(zhí)行,也不能保證程序完全正確。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 42w 1.語句覆蓋 假如這一程序段中兩個(gè)判斷的邏輯運(yùn)算有問題:(1)第一個(gè)判斷的運(yùn)算符“AND”錯(cuò)成運(yùn)算符“OR”(2)或是第二個(gè)判斷中的運(yùn)算符“OR”錯(cuò)成了運(yùn)算符 “AND”。 這時(shí)仍使用測試用例CASEl,程序仍將按路徑ace執(zhí)行。這時(shí)雖然也作到了語句覆蓋,卻發(fā)現(xiàn)不了判斷中邏輯運(yùn)算的錯(cuò)誤。 4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 43w 1.語句覆蓋 w 與其它幾種邏輯覆蓋比較起來,語句覆蓋是比較弱的覆蓋原則。w 作到了語句覆蓋可能給人門一種心理的滿足,以為每

16、個(gè)語句都經(jīng)歷過,似乎可以放心了。其實(shí)這仍然是不十分可靠的。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 44w 1.語句覆蓋 w 語句覆蓋在測試被測程序中,除去對檢查不可執(zhí)行語句有一定作用外,并沒有排除被測程序包含錯(cuò)誤的風(fēng)險(xiǎn)。w 其原因是,被測程序并非語句的無序堆積,語句之間存在著許多有機(jī)的聯(lián)系。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 45w 2.判定覆蓋什么是判定覆蓋?什么是判定覆蓋?w 按判定覆蓋準(zhǔn)則進(jìn)行測試是指,設(shè)計(jì)若干測試用例,運(yùn)行被測程序,使得程序中每個(gè)判斷的取真分支和取假分支的情況至少經(jīng)歷一次,即判斷的真假值均曾被滿足。w 所以,判定覆蓋又稱為分支覆蓋。4.2

17、邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 46w 2.判定覆蓋仍以上述程序段為例,若選用的兩組測試用例是:CASEl: CASE3 A2 A1 B0 B0 X3 X1則可分別執(zhí)行路徑ace和abd。從而使兩個(gè)判斷的4個(gè)分支c、e和b、d分別得到覆蓋。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 47w 2.判定覆蓋若選用另外兩組測試用例:CASE4: CASE5 A3 A2 B0 B1 X3 X1則可分別執(zhí)行路徑acd和abe。同樣使兩個(gè)判斷的4個(gè)分支c、e和b、d分別得到覆蓋。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 48w 2.判定覆蓋w 上述兩組測試用例不僅滿足

18、了判定覆蓋,同時(shí)還做到了語句覆蓋。w 但是,在此程序段中的第2個(gè)判斷條件x1如果錯(cuò)寫成x1,使用上述測試用例CASE5,照樣能按原路徑執(zhí)行(abe),而不影響結(jié)果。w 所以,判定覆蓋只能作到判定覆蓋仍無法確定判斷內(nèi)部條件的錯(cuò)誤。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 49w 3.條件覆蓋w 什么是條件覆蓋?條件覆蓋是指,設(shè)計(jì)若干測試用例,執(zhí)行被測程序以后,要使每個(gè)判斷中每個(gè)條件的可能取值至少滿足一次。 4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 504.2邏輯覆蓋邏輯覆蓋514.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 52w 4.判定-條件覆蓋w 什么是判定-

19、條件覆蓋? 判定條件覆蓋要求設(shè)計(jì)足夠的測試用例,使得判斷中每個(gè)條件的所有可能至少出現(xiàn)一次,并且每個(gè)判斷本身的判定結(jié)果也至少出現(xiàn)一次。 4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 53w 4.判定-條件覆蓋4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 54w 4.判定-條件覆蓋4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 55w 4.路徑覆蓋w 什么是路徑覆蓋?按路徑覆蓋要求進(jìn)行測試是指,設(shè)計(jì)足夠多的測試用例,要求覆蓋程序中所有可能的路徑。 4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 56w 5.路徑覆蓋針對例中的4條可能路徑 ace記為L1 abd記為L2

20、abe記為L3 acd記為L44.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 57w 5.路徑覆蓋4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 58w 5.路徑覆蓋4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 59w 5.路徑覆蓋這里所用的程序段非常簡短。也只有4條路徑。在實(shí)際問題中。一個(gè)不太復(fù)雜的程序,其路徑數(shù)都是一個(gè)龐大的數(shù)字,要在測試中覆蓋這樣多的路徑是無法實(shí)現(xiàn)的。為解決這一難題只得把覆蓋的路徑數(shù)壓縮到一定限度內(nèi),例如,程序中的循環(huán)體只執(zhí)行了一次。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 60w 5.路徑覆蓋其實(shí),即使對于路徑數(shù)很有限的程序已經(jīng)作到了路徑

21、覆蓋,仍然不能保證被測程序的正確性。例如,在上述語句覆蓋一段最后給出的程序段中出現(xiàn)的錯(cuò)誤也不是路徑覆蓋可以發(fā)現(xiàn)的(“or”與“and”的錯(cuò)寫)。 由此看出,各種結(jié)構(gòu)測試方法都不能保證程序的正確性。4.2邏輯覆蓋邏輯覆蓋一.幾種常用的邏輯覆蓋測試方法 61w 5.路徑覆蓋測試的目的并非要證明程序的正確性,而是要盡可能找出程序中的錯(cuò)誤。確實(shí)并不存在一種十全十美的測試方法,能夠發(fā)現(xiàn)所有的錯(cuò)誤。想要在有限的時(shí)間內(nèi)用有限的方法來發(fā)現(xiàn)所有的程序錯(cuò)誤做不到的,這又涉及到了有關(guān)軟件測試局限性的問題。 4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 62為實(shí)現(xiàn)測試的邏輯覆蓋。必須設(shè)計(jì)足夠多的測試用例,并使用這些測

22、試用例執(zhí)行被測程序,實(shí)施測試。我們關(guān)心的是,對某個(gè)具體程序來說,至少要設(shè)計(jì)多少測試用例。這里提供一種估算最少測試用例數(shù)的方法。 4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 63結(jié)構(gòu)化程序是由3種基本控制結(jié)構(gòu)組成:順序型構(gòu)成串行操作;選擇型構(gòu)成分支操作;重復(fù)型構(gòu)成循環(huán)操作。為了把問題簡化,避免出現(xiàn)測試用例極多的組合爆炸,把構(gòu)成循環(huán)操作的重復(fù)型結(jié)構(gòu)用選擇結(jié)構(gòu)代替。4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 64例如,圖512表達(dá)了兩個(gè)順序執(zhí)行的分支結(jié)構(gòu)。兩個(gè)分支謂詞P1和P2取不同值時(shí),將分別執(zhí)行a或b及c或d操作。顯然,要測試這個(gè)小程序,需要至少提供4個(gè)測試用例才能作到邏輯覆蓋,使得ac、a

23、d、bc及bd操作均得到檢驗(yàn)。4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 65這里的4是圖中第1個(gè)分支謂詞引出的兩個(gè)操作,及第2個(gè)分支謂詞引出的兩個(gè)操作組合起來而得到的,即224。其中的2是由于兩個(gè)并列的操作,1十12而得到的。 4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 66對于一般的、更為復(fù)雜的問題,估算最少測試用例數(shù)的原則也是同樣的。該程序中共有9個(gè)分支謂詞。 4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 67盡管這些分支結(jié)構(gòu)交錯(cuò)起來似乎十分復(fù)雜,很難一眼看出應(yīng)至少需要多少個(gè)測試用例,但如果仍用上面的方法,也是很容易解決的。注意到該圖可分上下兩層:分支謂詞1的操作域是上層;分支謂詞8

24、的操作域是下層。4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 68這兩層正像前面簡單例中的P1和P2的關(guān)系一樣。只要分別得到兩層的測試用例個(gè)數(shù),再將其相乘即得總的測試用例數(shù)。4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 69(a)所需測試用例個(gè)數(shù)分別為1十1十1十1十15(b)所需測試用例個(gè)數(shù)分別為及1十1十13。因而兩層組合,得到5315。整個(gè)程序的上層所需測試用例數(shù)為l十1516。而下層十分顯然為3。故最后得到整個(gè)程序所需測試用例數(shù)至少為16348。4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 70這里需要首先考慮較為復(fù)雜的上層結(jié)構(gòu)。當(dāng)謂詞l不滿足時(shí)要作的操作又可進(jìn)一步分解為兩層(a),(

25、b)。4.2邏輯覆蓋邏輯覆蓋二.最少測試用例數(shù)計(jì)算 71整個(gè)程序的下層所需測試用例數(shù)為3。所以最后得到整個(gè)程序所需測試用例數(shù)至少為16348。4.2邏輯覆蓋邏輯覆蓋三.測試覆蓋準(zhǔn)則72前面介紹的邏輯覆蓋其出發(fā)點(diǎn)似乎是合理的。所謂“覆蓋”,就是想要作到全面,而無遺漏。但事實(shí)表明,它并不能真的作到無遺漏。甚至右圖程序段這樣的小問題都無能為力。出現(xiàn)這一情況的原因在于,錯(cuò)誤區(qū)域僅僅在I0這個(gè)點(diǎn)上,即僅當(dāng)I取0時(shí),測試才能發(fā)現(xiàn)錯(cuò)誤。 4.2邏輯覆蓋邏輯覆蓋三.測試覆蓋準(zhǔn)則73KAFoster從測試工作實(shí)踐的教訓(xùn)出發(fā),吸收了計(jì)算機(jī)硬件的測試原理,提出了一種經(jīng)驗(yàn)型的測試覆蓋準(zhǔn)則,較好地解決了上述問題。Fos

26、rer的經(jīng)驗(yàn)型覆蓋準(zhǔn)則是從硬件的早期測試方法中得到啟發(fā)的。我們知道,硬件測試中,對每一個(gè)門電路的輸入、輸出測試都是有額定標(biāo)準(zhǔn)的。通常,電路中一個(gè)門的錯(cuò)誤常常是“輸出總是0”,或是“輸出總是1”。4.2邏輯覆蓋邏輯覆蓋三.測試覆蓋準(zhǔn)則74與硬件測試中的這一情況類似,我們常常要重視程序中謂詞的取值,但實(shí)際上它可能比硬件測試更加復(fù)雜。Foster通過大量的實(shí)驗(yàn)確定了程序中謂詞最容易出錯(cuò)的部分,得出了一套錯(cuò)誤敏感測試用例分析ESTCA(ErrorSensitiveTestCasesAnalysis)規(guī)則。4.2邏輯覆蓋邏輯覆蓋三.測試覆蓋準(zhǔn)則75規(guī)則1對于A rel B(rel可以是,和)型的分支謂詞

27、,應(yīng)適當(dāng)?shù)剡x擇A與B的值,使得測試執(zhí)行到該分支語句時(shí),AB,AB和AB的情況分別出現(xiàn)一次。4.2邏輯覆蓋邏輯覆蓋三.測試覆蓋準(zhǔn)則76規(guī)則2對于A rel1 C(rel1可以是或是,A是變量,C是常量)型的分支謂詞,當(dāng)rel1為時(shí),應(yīng)適當(dāng)?shù)剡x擇A的值,使: ACM(M是距C最小的機(jī)器容許正數(shù),若A和C均為整型時(shí),M=1)。同樣,當(dāng)rel1為時(shí),應(yīng)適當(dāng)?shù)剡x擇A,使: AC十M 4.2邏輯覆蓋邏輯覆蓋三.測試覆蓋準(zhǔn)則77規(guī)則3對外部輸入變量賦值,使其在每一測試用例中均有不同的值與符號,并與同一組測試用例中其它變量的值與符號不一致。 4.2邏輯覆蓋邏輯覆蓋三.測試覆蓋準(zhǔn)則78顯然,上述規(guī)則1是為了檢測

28、rel的錯(cuò)誤;規(guī)則2是為了檢測“差一”之類的錯(cuò)誤(如本應(yīng)是“IF A1”而錯(cuò)成“IF A0”);規(guī)則3則是為了檢測程序語句中的錯(cuò)誤(如應(yīng)引用一變量而錯(cuò)成引用一常量)。 4.2邏輯覆蓋邏輯覆蓋三.測試覆蓋準(zhǔn)則79上述三規(guī)則并不是完備的,但在普通程序的測試中確是有效的。原因在于規(guī)則本身針對著程序編寫人員容易發(fā)生的錯(cuò)誤,或是圍繞著發(fā)生錯(cuò)誤的頻繁區(qū)域,從而提高了發(fā)現(xiàn)錯(cuò)誤的命中率。 4.3路徑分析路徑分析 l什么是路徑分析什么是路徑分析?分析程序中的路徑是指:檢驗(yàn)程序從入口開始,執(zhí)行過程中經(jīng)歷的各個(gè)語句,直到出口。804.3路徑分析路徑分析 l路徑分析是白盒測試最為典型的問題。l著眼于路徑分析的測試可稱

29、為路徑測試。l完成路徑測試的理想情況是做到路徑覆蓋。814.3路徑分析路徑分析 l從上節(jié)的討論中我們已經(jīng)看出,對于比較簡單的小程序?qū)崿F(xiàn)路徑覆蓋是可能做到的。l但如果程序中出現(xiàn)多個(gè)判斷和多個(gè)循環(huán),可能的路徑數(shù)目將會(huì)急劇增長,以至實(shí)現(xiàn)路徑覆蓋不可能做到。824.3路徑分析路徑分析 一、程序路徑表達(dá)式1路徑的弧序列表示及節(jié)點(diǎn)序列表示l如果圖51(b)中的1號節(jié)點(diǎn)為程序入口,5號節(jié)點(diǎn)為程序出口,這一程序中可能的路徑就有許多個(gè)。834.3路徑分析路徑分析 1路徑的弧序列表示及節(jié)點(diǎn)序列表示l在此列舉4條路徑,分別以弧序列表示及節(jié)點(diǎn)序列表示。844.3路徑分析路徑分析 2路徑表達(dá)式(pathexpressi

30、on)l路徑表達(dá)式作為一種表達(dá)式,其運(yùn)算對象指的是控制流圖中的弧。路徑表達(dá)式中引入兩個(gè)運(yùn)算:l乘運(yùn)算l加運(yùn)算854.3路徑分析路徑分析 2路徑表達(dá)式(pathexpression)乘運(yùn)算乘運(yùn)算l弧a和弧b相乘,所得的乘積為ab,它表示先沿弧a,再沿弧b所經(jīng)歷的路段。l例如,acde是四個(gè)弧的乘積,它表示沿著a、c、d和e的順序所經(jīng)歷的路段。864.3路徑分析路徑分析 2路徑表達(dá)式(pathexpression) 加運(yùn)算加運(yùn)算l弧a與弧b相加,其和a+b表示兩弧是或的關(guān)系。l如圖中節(jié)點(diǎn)2至節(jié)點(diǎn)3有兩個(gè)弧相聯(lián),是并行的路段。874.3路徑分析路徑分析 2路徑表達(dá)式(pathexpression)l

31、 可以看出在圖所表示的控制流中,共有可以看出在圖所表示的控制流中,共有4條路徑:條路徑:eacf,eadf,ebcf和和ebdf。l這這4條路徑是并行的或的關(guān)系,可以用加運(yùn)條路徑是并行的或的關(guān)系,可以用加運(yùn)算聯(lián)接它們,從而得到完整的路徑表達(dá)式:算聯(lián)接它們,從而得到完整的路徑表達(dá)式: eacf+ +eadf+ +ebcf+ +ebdf 884.3路徑分析路徑分析 2路徑表達(dá)式(pathexpression)l還可直接從圖中看出,既然弧還可直接從圖中看出,既然弧a和弧和弧b是并是并行的,弧行的,弧c和弧和弧d也是并行的。它們的頭尾也是并行的。它們的頭尾又分別與弧又分別與弧e和弧和弧f相聯(lián)。相聯(lián)。l

32、按上述兩種運(yùn)算的定義可寫出路徑表達(dá)式:按上述兩種運(yùn)算的定義可寫出路徑表達(dá)式: e(a+ +b)(c十十d)f 894.3路徑分析路徑分析 2路徑表達(dá)式(pathexpression)l不難發(fā)現(xiàn),這一表達(dá)式正是前面不難發(fā)現(xiàn),這一表達(dá)式正是前面4項(xiàng)之和表達(dá)式的因子提出形式。項(xiàng)之和表達(dá)式的因子提出形式。Eacf+ +eadf+ +ebcf+ +ebdfe(a+ +b)(c十十d)f 904.3路徑分析路徑分析 2路徑表達(dá)式(pathexpression)914.3路徑分析路徑分析 2路徑表達(dá)式(pathexpression)924.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算程序中到底有多少路徑程序中

33、到底有多少路徑?l這個(gè)問題表面上看似乎容易回答,其實(shí)不然。程序中所表示的程序路徑數(shù)與循環(huán)的次數(shù)有關(guān)。934.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l右圖如果循環(huán)體最多執(zhí)行三次,那么路徑數(shù)為3。然而,當(dāng)程序中既有循環(huán)又有分支出現(xiàn)時(shí),其路徑數(shù)并不容易直覺地從控制流圖中看出。944.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l1.路徑表達(dá)式計(jì)算假定所討論的程序已經(jīng)得到了它的路徑表達(dá)式,則可把其中的所有弧均代以數(shù)值“1”,然后依表達(dá)式的乘法和加法運(yùn)算,所得數(shù)值即為該程序的路徑數(shù)。954.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l1.路徑表達(dá)式計(jì)算l例如,圖所給的程序,其路徑表達(dá)式為e(a十b)(

34、c十d)f。l把弧a,b,e,d,e,f均代人數(shù)值1,計(jì)算表達(dá)式的值即為路徑數(shù):N1(1十1)(1十1)1=4964.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l1.路徑表達(dá)式計(jì)算l再以右圖為例,如果暫不考慮循環(huán),那么從節(jié)點(diǎn)1到節(jié)點(diǎn)4只有兩條路徑,L=a(b十cd)el代入數(shù)值“1”,得到:Ll(1十l1)1=2974.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l1.路徑表達(dá)式計(jì)算l再看循環(huán),假定只考慮循環(huán)次數(shù)小于3的情況。l路徑表達(dá)式為:L+LfL十LfLfLL(1十fL十(fL)2)其中L表示循環(huán)體。984.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l1.路徑表達(dá)式計(jì)算l此式中f代人“1”

35、,L代入“2”,則計(jì)算出路徑數(shù)為:2(1十12十(12)2)14994.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l2.程序復(fù)雜度計(jì)算l我們知道,程序中含有的路徑數(shù)和程序的復(fù)雜性有著直接的關(guān)系。l程序越復(fù)雜,它的路徑數(shù)越多。1004.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l2.程序復(fù)雜度計(jì)算如何度量程序復(fù)雜性?l假定不考慮程序控制流圖中,聯(lián)結(jié)各節(jié)點(diǎn)之間弧的方向,控制流圖便成為由節(jié)點(diǎn)和邊構(gòu)成的無向圖。我們把無向圖中任何兩個(gè)節(jié)點(diǎn)之間至少存在一條通路的圖稱為連通圖(connectedgraph)。1014.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l2.程序復(fù)雜度計(jì)算如何度量程序復(fù)雜性?lMcCabe給出了程序結(jié)構(gòu)復(fù)雜性計(jì)算公式。lMcCabe提出,對程序控制流圖的連通圖G,其復(fù)雜度V(G)可按以下公式計(jì)算:V(G)=En+2其中,E為圖G中的邊數(shù),n為圖G中的節(jié)點(diǎn)數(shù)。1024.3路徑分析路徑分析 二、程序中路徑數(shù)的計(jì)算l2.程序復(fù)雜度計(jì)算l程序結(jié)構(gòu)復(fù)雜性計(jì)算公式。V(G)=En+21034.4 程序插裝程序插裝 程序插裝(ProgramInstrumentation)是一種基本的測試手

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論