白盒測(cè)試中的六種覆蓋方法
?
?
?
??? 白盒測(cè)試作為測(cè)試人員常用的一種測(cè)試方法,越來(lái)越受到測(cè)試工程師的重視。白盒測(cè)試并不是簡(jiǎn)單的按照代碼設(shè)計(jì)用例,而是需要根據(jù)不同的測(cè)試需求,結(jié)合不同的測(cè)試對(duì)象,使用適合的方法進(jìn)行測(cè)試。因?yàn)閷?duì)于不同復(fù)雜度的代碼邏輯,可以衍生出許多種執(zhí)行路徑,只有適當(dāng)?shù)臏y(cè)試方法,才能幫助我們從代碼的迷霧森林中找到正確的方向。本文介紹六種白盒子測(cè)試方法:語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定條件覆蓋、條件組合覆蓋、路徑覆蓋。
?
白盒測(cè)試的概述
?
??? 由于邏輯錯(cuò)誤和不正確假設(shè)與一條程序路徑被運(yùn)行的可能性成反比。由于我們經(jīng)常相信某邏輯路徑不可能被執(zhí)行, 而事實(shí)上,它可能在正常的情況下被執(zhí)行。由于代碼中的筆誤是隨機(jī)且無(wú)法杜絕的,因此我們要進(jìn)行白盒測(cè)試。
?
??? 白盒測(cè)試又稱(chēng)結(jié)構(gòu)測(cè)試,透明盒測(cè)試、邏輯驅(qū)動(dòng)測(cè)試或基于代碼的測(cè)試。白盒測(cè)試是一種測(cè)試用例設(shè)計(jì)方法,盒子指的是被測(cè)試的軟件,白盒指的是盒子是可視的,你清楚盒子內(nèi)部的東西以及里面是如何運(yùn)作的。
?
白盒的測(cè)試用例需要做到:
?
1、保證一個(gè)模塊中的所有獨(dú)立路徑至少被使用一次
2、對(duì)所有邏輯值均需測(cè)試 true 和 false
3、在上下邊界及可操作范圍內(nèi)運(yùn)行所有循環(huán)
4、檢查內(nèi)部數(shù)據(jù)結(jié)構(gòu)以確保其有效性
?
白盒測(cè)試的目的:通過(guò)檢查軟件內(nèi)部的邏輯結(jié)構(gòu),對(duì)軟件中的邏輯路徑進(jìn)行覆蓋測(cè)試;在程序不同地方設(shè)立檢查點(diǎn),檢查程序的狀態(tài),以確定實(shí)際運(yùn)行狀態(tài)與預(yù)期狀態(tài)是否一致。
?
白盒測(cè)試的特點(diǎn):依據(jù)軟件設(shè)計(jì)說(shuō)明書(shū)進(jìn)行測(cè)試、對(duì)程序內(nèi)部細(xì)節(jié)的嚴(yán)密檢驗(yàn)、針對(duì)特定條件設(shè)計(jì)測(cè)試用例、對(duì)軟件的邏輯路徑進(jìn)行覆蓋測(cè)試。
?
白盒測(cè)試的實(shí)施步驟:
?
1、測(cè)試計(jì)劃階段:根據(jù)需求說(shuō)明書(shū),制定測(cè)試進(jìn)度。
2、測(cè)試設(shè)計(jì)階段:依據(jù)程序設(shè)計(jì)說(shuō)明書(shū),按照一定規(guī)范化的方法進(jìn)行軟件結(jié)構(gòu)劃分和設(shè)計(jì)測(cè)試用例。
3、測(cè)試執(zhí)行階段:輸入測(cè)試用例,得到測(cè)試結(jié)果。
4、測(cè)試總結(jié)階段:對(duì)比測(cè)試的結(jié)果和代碼的預(yù)期結(jié)果,分析錯(cuò)誤原因,找到并解決錯(cuò)誤。
?
白盒測(cè)試的方法:總體上分為靜態(tài)方法和動(dòng)態(tài)方法兩大類(lèi)。
?
靜態(tài)分析:是一種不通過(guò)執(zhí)行程序而進(jìn)行測(cè)試的技術(shù)。靜態(tài)分析的關(guān)鍵功能是檢查軟件的表示和描述是否一致,沒(méi)有沖突或者沒(méi)有歧義。
?
動(dòng)態(tài)分析:主要特點(diǎn)是當(dāng)軟件系統(tǒng)在模擬的或真實(shí)的環(huán)境中執(zhí)行之前、之中和之后,對(duì)軟件系統(tǒng)行為的分析。動(dòng)態(tài)分析包含了程序在受控的環(huán)境下使用特定的期望結(jié)果進(jìn)行正式的運(yùn)行。它顯示了一個(gè)系統(tǒng)在檢查狀態(tài)下是正確還是不正確。在動(dòng)態(tài)分析技術(shù)中,最重要的技術(shù)是路徑和分支測(cè)試。下面要介紹的六種覆蓋測(cè)試方法屬于動(dòng)態(tài)分析方法。
?
白盒測(cè)試的優(yōu)缺點(diǎn)
?
??? 1、優(yōu)點(diǎn)
??? ◆迫使測(cè)試人員去仔細(xì)思考軟件的實(shí)現(xiàn)
??? ◆可以檢測(cè)代碼中的每條分支和路徑
??? ◆
揭示隱藏在代碼中的錯(cuò)誤
??? ◆對(duì)代碼的測(cè)試比較徹底
??? ◆最優(yōu)化
?
??? 2、缺點(diǎn)
??? ◆昂貴
??? ◆無(wú)法檢測(cè)代碼中遺漏的路徑和數(shù)據(jù)敏感性錯(cuò)誤
??? ◆不驗(yàn)證規(guī)格的正確性
?
六種覆蓋方法
?
首先為了下文的舉例描述方便,這里先給出一張程序流程圖。(本文以1995年軟件設(shè)計(jì)師考試的一道考試題目為例,圖中紅色字母代表程序執(zhí)行路徑)
???

?
?
?
???
1、語(yǔ)句覆蓋
?
1) 主要特點(diǎn):語(yǔ)句覆蓋是最起碼的結(jié)構(gòu)覆蓋要求,語(yǔ)句覆蓋要求設(shè)計(jì)足夠多的測(cè)試用例,使得程序中每條語(yǔ)句至少被執(zhí)行一次。
?
2) 用例設(shè)計(jì):(如果此時(shí)將A路徑上的語(yǔ)句1—〉T去掉,那么用例如下)
?????? X?Y??路徑
??? --?-- -- -----
??? 1.50 50 OBDE?
??? 2.90 70 OBCE
??? 1.50 50 OBDE?
??? 2.90 70 OBCE
?
3) 優(yōu)點(diǎn):可以很直觀地從源代碼得到測(cè)試用例,無(wú)須細(xì)分每條判定表達(dá)式。
?
4) 缺點(diǎn):由于這種測(cè)試方法僅僅針對(duì)程序邏輯中顯式存在的語(yǔ)句,但對(duì)于隱藏的條件和可能到達(dá)的隱式邏輯分支,是無(wú)法測(cè)試的。在本例中去掉了語(yǔ)句1—〉T去掉,那么就少了一條測(cè)試路徑。在if結(jié)構(gòu)中若源代碼沒(méi)有給出else后面的執(zhí)行分支,那么語(yǔ)句覆蓋測(cè)試就不會(huì)考慮這種情況。但是我們不能排除這種以外的分支不會(huì)被執(zhí)行,而往往這種錯(cuò)誤會(huì)經(jīng)常出現(xiàn)。再如,在Do-While結(jié)構(gòu)中,語(yǔ)句覆蓋執(zhí)行其中某一個(gè)條件分支。那么顯然,語(yǔ)句覆蓋對(duì)于多分支的邏輯運(yùn)算是無(wú)法全面反映的,它只在乎運(yùn)行一次,而不考慮其他情況。
?
??? 注:要把語(yǔ)句和判定條件區(qū)分清楚,語(yǔ)句是指每一次判定之后的處理,而<>中的是判定條件。
?
?
???
2、判定覆蓋
?
1) 主要特點(diǎn):判定覆蓋又稱(chēng)為分支覆蓋,它要求設(shè)計(jì)足夠多的測(cè)試用例,使得程序中每個(gè)判定至少有一次為真值,有一次為假值,即:程序中的每個(gè)分支至少執(zhí)行一次。每個(gè)判斷的取真、取假至少執(zhí)行一次。
?
2) 用例設(shè)計(jì):
?????? X?Y??路徑
??? --?-- -- -----
??? 1.?90?90 OAE?
??? 2.?50?50 OBDE?
??? 3. 90 70 OBCE
??? 1.?90?90 OAE?
??? 2.?50?50 OBDE?
??? 3. 90 70 OBCE
3) 優(yōu)點(diǎn):判定覆蓋比語(yǔ)句覆蓋要多幾乎一倍的測(cè)試路徑,當(dāng)然也就具有比語(yǔ)句覆蓋更強(qiáng)的測(cè)試能力。同樣判定覆蓋也具有和語(yǔ)句覆蓋一樣的簡(jiǎn)單性,無(wú)須細(xì)分每個(gè)判定就可以得到測(cè)試用例。
?
4) 缺點(diǎn):往往大部分的判定語(yǔ)句是由多個(gè)邏輯條件組合而成(如,判定語(yǔ)句中包含AND、OR、CASE),若僅僅判斷其整個(gè)最終結(jié)果,而忽略每個(gè)條件的取值情況,必然會(huì)遺漏部分測(cè)試路徑。
?
?
3、條件覆蓋
?
1) 主要特點(diǎn):條件覆蓋要求設(shè)計(jì)足夠多的測(cè)試用例,使得判定中的每個(gè)條件獲得各種可能的結(jié)果,即每個(gè)條件至少有一次為真值,有一次為假值。
?
2) 用例設(shè)計(jì):
?????? X?Y??路徑
??? --?-- -- -----
??? 1.?90?70 OBC?
??? 2.?40?90?OBD
3) 優(yōu)點(diǎn):顯然條件覆蓋比判定覆蓋,增加了對(duì)符合判定情況的測(cè)試,增加了測(cè)試路徑。
??? 1.?90?70 OBC?
??? 2.?40?90?OBD
3) 優(yōu)點(diǎn):顯然條件覆蓋比判定覆蓋,增加了對(duì)符合判定情況的測(cè)試,增加了測(cè)試路徑。
?
4) 缺點(diǎn):要達(dá)到條件覆蓋,需要足夠多的測(cè)試用例,但條件覆蓋并不能保證判定覆蓋。條件覆蓋只能保證每個(gè)條件至少有一次為真,而不考慮所有的判定結(jié)果。
?
??? 注:條件覆蓋就是針對(duì)單獨(dú)的判定語(yǔ)句來(lái)設(shè)計(jì)的,例如本例中的判定語(yǔ)句包括以下5句:x>=80|y>=80|x>=90|y>=90|x+y>=140
?
?
???
4、判定/條件覆蓋
?
1) 主要特點(diǎn):設(shè)計(jì)足夠多的測(cè)試用例,使得判定中每個(gè)條件的所有可能結(jié)果至少出現(xiàn)一次,每個(gè)判定本身所有可能結(jié)果也至少出現(xiàn)一次。
?
2) 用例設(shè)計(jì):
?????? X?Y??路徑
??? --?-- -- -----
??? 1. 90 90 OAE?
??? 2. 50 50 OBDE?
??? 3. 90 70 OBCE?
??? 4. 70 90 OBCE
??? 1. 90 90 OAE?
??? 2. 50 50 OBDE?
??? 3. 90 70 OBCE?
??? 4. 70 90 OBCE
3) 優(yōu)點(diǎn):判定/條件覆蓋滿(mǎn)足判定覆蓋準(zhǔn)則和條件覆蓋準(zhǔn)則,彌補(bǔ)了二者的不足。
?
4) 缺點(diǎn):判定/條件覆蓋準(zhǔn)則的缺點(diǎn)是未考慮條件的組合情況。
?
?
???
5、組合覆蓋
?
1) 主要特點(diǎn):要求設(shè)計(jì)足夠多的測(cè)試用例,使得每個(gè)判定中條件結(jié)果的所有可能組合至少出現(xiàn)一次。
?
2) 用例設(shè)計(jì):
?????? X?Y??路徑
??? --?-- -- -----
??? 1. 90 90 OAE?
??? 2. 90 70 OBCE?
??? 3. 90 30 OBDE?
??? 4. 70 90 OBCE?
??? 5. 30 90 OBDE?
??? 6. 70 70 OBDE?
??? 7. 50 50 OBDE
??? 1. 90 90 OAE?
??? 2. 90 70 OBCE?
??? 3. 90 30 OBDE?
??? 4. 70 90 OBCE?
??? 5. 30 90 OBDE?
??? 6. 70 70 OBDE?
??? 7. 50 50 OBDE
3) 優(yōu)點(diǎn):多重條件覆蓋準(zhǔn)則滿(mǎn)足判定覆蓋、條件覆蓋和判定/條件覆蓋準(zhǔn)則。更改的判定/條件覆蓋要求設(shè)計(jì)足夠多的測(cè)試用例,使得判定中每個(gè)條件的所有可能結(jié)果至少出現(xiàn)一次,每個(gè)判定本身的所有可能結(jié)果也至少出現(xiàn)一次。并且每個(gè)條件都顯示能單獨(dú)影響判定結(jié)果。
?
4) 缺點(diǎn):線(xiàn)性地增加了測(cè)試用例的數(shù)量。
?
?
???
6、路徑覆蓋
?
1) 主要特點(diǎn):設(shè)計(jì)足夠的測(cè)試用例,覆蓋程序中所有可能的路徑。
?
2) 用例設(shè)計(jì):
?????? X?Y??路徑
??? --?-- -- -----
??? 1. 90 90 OAE?
??? 2. 50 50 OBDE?
??? 3. 90 70 OBCE?
??? 4. 70 90 OBCE
??? 1. 90 90 OAE?
??? 2. 50 50 OBDE?
??? 3. 90 70 OBCE?
??? 4. 70 90 OBCE
3) 優(yōu)點(diǎn):這種測(cè)試方法可以對(duì)程序進(jìn)行徹底的測(cè)試,比前面五種的覆蓋面都廣。
?
4) 缺點(diǎn):由于路徑覆蓋需要對(duì)所有可能的路徑進(jìn)行測(cè)試(包括循環(huán)、條件組合、分支選擇等),那么需要設(shè)計(jì)大量、復(fù)雜的測(cè)試用例,使得工作量呈指數(shù)級(jí)增長(zhǎng)。而在有些情況下,一些執(zhí)行路徑是不可能被執(zhí)行的,如:
?
If (!A)B++;
If (!A)D--;
?
這兩個(gè)語(yǔ)句實(shí)際只包括了2條執(zhí)行路徑,即A為真或假時(shí)候?qū)和D的處理,真或假不可能都存在,而路徑覆蓋測(cè)試則認(rèn)為是包含了真與假的4條執(zhí)行路徑。這樣不僅降低了測(cè)試效率,而且大量的測(cè)試結(jié)果的累積,也為排錯(cuò)帶來(lái)麻煩。
?
?
總結(jié)
?
??? 白盒測(cè)試是一種被廣泛使用的邏輯測(cè)試方法,是由程序內(nèi)部邏輯驅(qū)動(dòng)的一種單元測(cè)試方法。只有對(duì)程序內(nèi)部十分了解才能進(jìn)行適度有效的白盒測(cè)試。但是貫穿在程序內(nèi)部的邏輯存在著不確定性和無(wú)窮性,尤其對(duì)于大規(guī)模復(fù)雜軟件。因此我們不能窮舉所有的邏輯路徑,即使窮舉也未必會(huì)帶來(lái)好運(yùn)(窮舉不能查出程序邏輯規(guī)則錯(cuò)誤,不能查出數(shù)據(jù)相關(guān)錯(cuò)誤,不能查出程序遺漏的路徑)。
?
??? 那么正確使用白盒測(cè)試,就要先從代碼分析入手,根據(jù)不同的代碼邏輯規(guī)則、語(yǔ)句執(zhí)行情況,選用適合的覆蓋方法。任何一個(gè)高效的測(cè)試用例,都是針對(duì)具體測(cè)試場(chǎng)景的。邏輯測(cè)試不是片面的測(cè)試正確的結(jié)果或是測(cè)試錯(cuò)誤的結(jié)果,而是盡可能全面地覆蓋每一個(gè)邏輯路徑。
?
?