白盒測試時軟件測試中必不可少的環(huán)節(jié),它是檢測一家軟件開發(fā)公司團(tuán)隊實(shí)力的重要指標(biāo)。
白盒測試又稱結(jié)構(gòu)測試,透明盒測試、邏輯驅(qū)動測試或基于代碼的測試。白盒測試是一種測試用例設(shè)計方法,盒子指的是被測試的軟件,白盒指的是盒子是可視的,你清楚盒子內(nèi)部的東西以及里面是如何運(yùn)作的。 "白盒"法全面了解程序內(nèi)部邏輯結(jié)構(gòu)、對所有邏輯進(jìn)行測試。"白盒"法是窮舉路徑測試。在使用這一方案時,測試者必須檢查程序的內(nèi)部結(jié)構(gòu),從檢查程序的邏輯著手,得出測試數(shù)據(jù)。貫穿程序的獨(dú)立路徑數(shù)是天文數(shù)字。
采用什么方法對軟件進(jìn)行測試呢?常用的軟件測試方法有兩大類:靜態(tài)測試方法和動態(tài)測試方法。其中軟件的靜態(tài)測試不要求在計算機(jī)上實(shí)際執(zhí)行所測程序,主要以一些人工的模擬技術(shù)對軟件進(jìn)行分析和測試;而軟件的動態(tài)測試是通過輸入一組預(yù)先按照一定的測試準(zhǔn)則構(gòu)造的實(shí)例數(shù)據(jù)來動態(tài)運(yùn)行程序,而達(dá)到發(fā)現(xiàn)程序錯誤的過程。在動態(tài)分析技術(shù)中,重要的技術(shù)是路徑和分支測試。下面要介紹的六種覆蓋測試方法屬于動態(tài)分析方法。
測試方法
白盒測試的測試方法有代碼檢查法、靜態(tài)結(jié)構(gòu)分析法、靜態(tài)質(zhì)量度量法、邏輯覆蓋法、基本路徑測試法、域測試、符號測試、Z路徑覆蓋程序變異。
白盒測試法的覆蓋標(biāo)準(zhǔn)有邏輯覆蓋、循環(huán)覆蓋和基本路徑測試。其中邏輯覆蓋包括語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、條件組合覆蓋和路徑覆蓋。
六種覆蓋標(biāo)準(zhǔn):語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、條件組合覆蓋和路徑覆蓋發(fā)現(xiàn)錯誤的能力呈由弱至強(qiáng)的變化。語句覆蓋每條語句至少執(zhí)行一次。判定覆蓋每個判定的每個分支至少執(zhí)行一次。條件覆蓋每個判定的每個條件應(yīng)取到各種可能的值。判定/條件覆蓋同時滿足判定覆蓋條件覆蓋。條件組合覆蓋每個判定中各條件的每一種組合至少出現(xiàn)一次。路徑覆蓋使程序中每一條可能的路徑至少執(zhí)行一次。
要求
1.保證一個模塊中的所有獨(dú)立路徑至少 被使用一次
2.對所有邏輯值均需測試 true 和 false
3.在上下邊界及可操作范圍內(nèi)運(yùn)行所有循環(huán)
4.檢查內(nèi)部數(shù)據(jù)結(jié)構(gòu)以確保其有效性
目的
通過檢查軟件內(nèi)部的邏輯結(jié)構(gòu),對軟件中的邏輯進(jìn)行覆蓋測試;在程序不同地方設(shè)立檢查點(diǎn),檢查程序的狀態(tài),以確定實(shí)際運(yùn)行狀態(tài)與預(yù)期狀態(tài)是否一致。
特點(diǎn)
依據(jù)說明書進(jìn)行測試、對內(nèi)部細(xì)節(jié)的嚴(yán)密檢驗(yàn)、針對特定條件設(shè)計測試用例、對軟件的邏輯路徑進(jìn)行覆蓋測試。
實(shí)施步驟
1.測試計劃階段:根據(jù)需求說明書,制定測試進(jìn)度。
2.測試設(shè)計階段:依據(jù)程序設(shè)計說明書,按照一定規(guī)范化的方法進(jìn)行軟件結(jié)構(gòu)劃分和設(shè)計測試用例
3.測試執(zhí)行階段:輸入測試用例,得到測試結(jié)果。
4.測試總結(jié)階段:對比測試的結(jié)果和的預(yù)期結(jié)果,分析錯誤原因,找到并解決錯誤。
優(yōu)缺點(diǎn)
1. 優(yōu)點(diǎn):迫使測試人員去仔細(xì)思考軟件;可以檢測代碼中的每條分支和路徑;揭示隱藏在代碼中的錯誤;對代碼的測試比較徹底;最優(yōu)化。
2. 缺點(diǎn):昂貴。無法檢測代碼中遺漏的路徑和數(shù)據(jù)敏感性錯誤。不驗(yàn)證規(guī)格的正確性。
局限
但即使每條路徑都測試了仍然可能有錯誤。第一,窮舉路徑測試程序違反了設(shè)計規(guī)范,即程序本身是個錯誤的程序。第二,窮舉路徑測試不可能查出程序中因遺漏路徑而出錯。第三,窮舉路徑測試可能發(fā)現(xiàn)不了一些與數(shù)據(jù)相關(guān)的錯誤。
如何挑選工具
白盒測試目前主要用在具有高可靠性要求的軟件領(lǐng)域,例如:軍工軟件、航天航空軟件、工業(yè)控制軟件等等。白盒測試工具在選購時應(yīng)當(dāng)主要是對開發(fā)語言的支持、覆蓋的深度、嵌入式軟件的測試、測試的可視化等。
代碼的覆蓋深度
從覆蓋源程序語句的詳盡程度分析,邏輯覆蓋標(biāo)準(zhǔn)包括以下不同的覆蓋標(biāo)準(zhǔn):語句覆蓋、判定覆蓋、條件覆蓋、條件判定組合覆蓋、多條件覆蓋和修正判定條件覆蓋。
1.語句覆蓋 為了暴露程序中的錯誤,程序中的每條語句至少應(yīng)該執(zhí)行一次。因此語句覆蓋(Statement Coverage)的含義是:選擇足夠多的測試數(shù)據(jù),使被測程序中每條語句至少執(zhí)行一次。語句覆蓋是很弱的邏輯覆蓋。
2.判定覆蓋語句覆蓋稍強(qiáng)的覆蓋標(biāo)準(zhǔn)是判定覆蓋(Decision Coverage)。判定覆蓋的含義是:設(shè)計足夠的測試用例,使得程序中的每個判定至少都獲得一次“真值”或“假值”,或者說使得程序中的每一個取“真”分支和取“假”分支至少經(jīng)歷一次,因此判定覆蓋又稱為分支覆蓋
3.條件覆蓋 在設(shè)計程序中,一個判定語句是由多個條件組合而成的復(fù)合判定。為了更徹底地實(shí)現(xiàn)邏輯覆蓋,可以采用條件覆蓋(Condition Coverage)的標(biāo)準(zhǔn)。條件覆蓋的含義是:構(gòu)造一組測試用例,使得每一判定語句中每個邏輯條件的可能值至少滿足一次。
4.多條件覆蓋 多條件覆蓋也稱條件組合覆蓋,它的含義是:設(shè)計足夠的測試用例,使得每個判定中條件的各種可能組合都至少出現(xiàn)一次。顯然滿足多條件覆蓋的測試用例是一定滿足判定覆蓋、條件覆蓋和條件判定組合覆蓋的。
5.修正條件判定覆蓋修正條件判定覆蓋是由歐美的航空/航天制造廠商和使用單位聯(lián)合制定的“航空運(yùn)輸和裝備系統(tǒng)認(rèn)證標(biāo)準(zhǔn)”,目前在國外的國防、航空航天領(lǐng)域應(yīng)用廣泛。這個覆蓋度量需要足夠的測試用例來確定各個條件能夠影響到包含的判定的結(jié)果。它要求滿足兩個條件:首先,每一個程序模塊的入口和出口點(diǎn)都要考慮至少要被調(diào)用一次,每個程序的判定到所有可能的結(jié)果值要至少轉(zhuǎn)換一次;其次,程序的判定被分解為通過邏輯操作符(and、or)連接的布爾條件,每個條件對于判定的結(jié)果值是獨(dú)立的。
不同的測試工具對于代碼的覆蓋能力也是不同的,通常能夠支持修正條件判定覆蓋的測試工具價格是極其昂貴的。
基本路徑測試法
白盒測試的測試方法中運(yùn)用最為廣泛的是基本路徑測試法。
基本法是在程序控制流圖的基礎(chǔ)上,通過分析控制構(gòu)造的環(huán)路復(fù)雜性,導(dǎo)出基本可執(zhí)行路徑集合,從而設(shè)計測試用例。設(shè)計出的測試用例要保證在測試中程序的每個可執(zhí)行語句至少執(zhí)行一次。
在程序控制流圖的基礎(chǔ)上,通過分析控制構(gòu)造的環(huán)路復(fù)雜性,導(dǎo)出基本可執(zhí)行路徑集合,從而設(shè)計測試用例。包括以下4個步驟和一個工具方法:
1. 程序的控制流圖:描述程序控制流的一種圖示方法。
2. 程序圈復(fù)雜度:McCabe復(fù)雜性度量。從程序的環(huán)路復(fù)雜性可導(dǎo)出程序基本路徑集合中的獨(dú)立路徑條數(shù),這是確定程序中每個可執(zhí)行語句至少執(zhí)行一次所必須的測試用例數(shù)目的上界
3. 導(dǎo)出測試用例:根據(jù)圈復(fù)雜度和程序結(jié)構(gòu)設(shè)計用例數(shù)據(jù)輸入和預(yù)期結(jié)果。
4. 準(zhǔn)備測試用例:確?;韭窂郊械拿恳粭l路徑的執(zhí)行。
工具方法
圖形矩陣:是在基本路徑測試軟件工具,利用它可以實(shí)現(xiàn)自動地確定一個基本路徑集。
程序的控制流圖:描述程序控制流的一種圖示方法。
圓圈稱為控制流圖的一個結(jié)點(diǎn),表示一個或多個無分支的語句或源程序語句
流圖只有二種圖形符號:圖中的每一個圓稱為流圖的結(jié)點(diǎn),代表一條或多條語句。
流圖中的箭頭稱為邊或連接,代表控制流
任何過程設(shè)計都要被翻譯成控制流圖。
如何根據(jù)程序流程圖畫出控制流程圖?
在將程序流程圖簡化成控制流圖時,應(yīng)注意:
在選擇或多分支結(jié)構(gòu)中,分支的匯聚處應(yīng)有一個匯聚結(jié)點(diǎn)。
邊和結(jié)點(diǎn)圈定的區(qū)域叫做區(qū)域,當(dāng)對區(qū)域計數(shù)時,圖形外的區(qū)域也應(yīng)記為一個區(qū)域。
步驟
基本路徑測試法的步驟:
第一步:畫出控制流圖
流程圖用來描述程序控制結(jié)構(gòu)??蓪⒘鞒虉D映射到一個相應(yīng)的流圖(假設(shè)流程圖的菱形決定框中不包含復(fù)合條件)。在流圖中,每一個圓,稱為流圖的結(jié)點(diǎn),代表一個或多個語句。一個處理方框序列和一個菱形決測框可被映射為一個結(jié)點(diǎn),流圖中的箭頭,稱為邊或連接,代表控制流,類似于流程圖中的箭頭。一條邊必須終止于一個結(jié)點(diǎn),即使該結(jié)點(diǎn)并不代表任何語句(例如:if-else-then結(jié)構(gòu))。由邊和結(jié)點(diǎn)限定的范圍稱為區(qū)域。計算區(qū)域時應(yīng)包括圖外部的范圍。
第二步:計算圈復(fù)雜度
圈復(fù)雜度是一種為程序邏輯復(fù)雜性提供定量測度的,將該度量用于計算程序的基本的獨(dú)立路徑數(shù)目,為確保所有語句至少執(zhí)行一次的測試數(shù)量的上界。獨(dú)立路徑必須包含一條在定義之前不曾用到的邊。
有以下三種方法計算圈復(fù)雜度:
流圖中區(qū)域的數(shù)量對應(yīng)于環(huán)型的復(fù)雜性;
給定流圖G的圈復(fù)雜度V(G),定義為V(G)=E-N+2,E是流圖中邊的數(shù)量,N是流圖中結(jié)點(diǎn)的數(shù)量;
給定流圖G的圈復(fù)雜度V(G),定義為V(G)=P+1,P是流圖G中判定結(jié)點(diǎn)的數(shù)量。
第三步:導(dǎo)出
根據(jù)上面的計算方法,可得出四個獨(dú)立的路徑。(一條獨(dú)立路徑是指,和其他的獨(dú)立路徑相比,至少引入一個新處理語句或一個新判斷的程序通路。V(G)值正好等于該程序的獨(dú)立路徑的條數(shù)。)
路徑1:4-14
路徑2:4-6-7-14
路徑3:4-6-8-10-13-4-14
路徑4:4-6-8-11-13-4-14
根據(jù)上面的獨(dú)立,去設(shè)計輸入數(shù)據(jù),使程序分別執(zhí)行到上面四條路徑。
三步法
1. 根據(jù)代碼的功能,人工設(shè)計測試用例進(jìn)行基本功能測試
2. 統(tǒng)計白盒覆蓋率,為未覆蓋的白盒單位設(shè)計測試用例,實(shí)現(xiàn)完整的白盒覆蓋,比較理想的覆蓋率是實(shí)現(xiàn)100%語句、條件、分支、路徑覆蓋
3. 自動生成大量的測試用例,捕捉"程序員未處理某些特殊輸入"形成的錯誤。
第1步的測試用例通常是現(xiàn)成的,因?yàn)樵敿?xì)設(shè)計文檔會規(guī)定程序的基本功能,沒有文檔的,程序員在編程時也要想清楚程序的功能,這些基本功能就是基本測試用例;
第2步是在第1步的基礎(chǔ)上,檢查未覆蓋的白盒單位,由于未覆蓋的邏輯單位通常對應(yīng)未測試的等價類,因此第2步可以找出第1步所遺漏的測試用例;
第3步用自動彌補(bǔ)第2步的固有缺陷
“三步法”盡量避免重復(fù)工作,白盒方法和黑盒方法相結(jié)合,人工方法和自動方法相補(bǔ)充,如果第2步的覆蓋率比較理想,那么基本上可以保證找出所有等價類。在開發(fā)過程允許的限度內(nèi),"三步法"已接近極限,當(dāng)?shù)闷?quot;徹底測試"四個字。