白盒測試的六種覆蓋準則
白盒測試作為測試人員常用的一種測試方法,越來越受到測試工程師的重視。白盒測試並不是簡單的按照程式碼設計用例,而是需要根據不同的測試需求,結合不同的測試物件,使用適合的方法進行測試。因為對於不同複雜度的程式碼邏輯,可以衍生出許多種執行路徑,只有適當的測試方法,才能幫助我們從程式碼的迷霧森林中找到正確的方向。本文介紹六種白盒子測試方法:語句覆蓋、判定覆蓋、條件覆蓋、判定條件覆蓋、條件組合覆蓋、路徑覆蓋。
白盒測試的概述
由於邏輯錯誤和不正確假設與一條程式路徑被執行的可能性成反比。由於我們經常相信某邏輯路徑不可能被執行, 而事實上,它可能在正常的情況下被執行。由於程式碼中的筆誤是隨機且無法杜絕的,因此我們要進行白盒測試。
白盒測試又稱結構測試,透明盒測試、邏輯驅動測試或基於程式碼的測試。白盒測試是一種測試用例設計方法,盒子指的是被測試的軟體,白盒指的是盒子是可視的,你清楚盒子內部的東西以及裡面是如何運作的。
白盒的測試用例需要做到:
·保證一個模組中的所有獨立路徑至少 被使用一次
·對所有邏輯值均需測試 true 和 false
·在上下邊界及可操作範圍內執行所有迴圈
·檢查內部資料結構以確保其有效性
白盒測試的目的:通過檢查軟體內部的邏輯結構,對軟體中的邏輯路徑進行覆蓋測試;在程式不同地方設立檢查點,檢查程式的狀態,以確定實際執行狀態與預期狀態是否一致。
白盒測試的特點:依據軟體設計說明書進行測試、對程式內部細節的嚴密檢驗、針對特定條件設計測試用例、對軟體的邏輯路徑進行覆蓋測試。
白盒測試的實施步驟:
1.測試計劃階段:根據需求說明書,制定測試進度。
2.測試設計階段:依據程式設計說明書,按照一定規範化的方法進行軟體結構劃分和設計測試用例。
3.測試執行階段:輸入測試用例,得到測試結果。
4.測試總結階段:對比測試的結果和程式碼的預期結果,分析錯誤原因,找到並解決錯誤。
白盒測試的方法:總體上分為靜態方法和動態方法兩大類。
靜態分析是一種不通過執行程式而進行測試的技術。靜態分析的關鍵功能是檢查軟體的表示和描述是否一致,沒有衝突或者沒有歧義。
動態分析的主要特點是當軟體系統在模擬的或真實的環境中執行之前、之中和之後 , 對軟體系統行為的分析。動態分析包含了程式在受控的環境下使用特定的期望結果進行正式的執行。它顯示了一個系統在檢查狀態下是正確還是不正確。在動態分析技術中,最重要的技術是路徑和分支測試。下面要介紹的六種覆蓋測試方法屬於動態分析方法。
白盒測試的優缺點
1. 優點
·迫使測試人員去仔細思考軟體的實現
·可以檢測程式碼中的每條分支和路徑
·揭示隱藏在程式碼中的錯誤
·對程式碼的測試比較徹底
·最優化
2. 缺點
·昂貴
·無法檢測程式碼中遺漏的路徑和資料敏感性錯誤
·不驗證規格的正確性
六種覆蓋方法
首先為了下文的舉例描述方便,這裡先給出一張程式流程圖。(本文以1995年軟體設計師考試的一道考試題目為例,圖中紅色字母代表程式執行路徑)。
1、語句覆蓋
1)主要特點:語句覆蓋是最起碼的結構覆蓋要求,語句覆蓋要求設計足夠多的測試用例,使得程式中每條語句至少被執行一次。
2)用例設計:(如果此時將A路徑上的語句1—〉T去掉,那麼用例如下)
X Y 路徑
1 50 50 OBDE
2 90 70 OBCE
3)優點:可以很直觀地從原始碼得到測試用例,無須細分每條判定表示式。
4)缺點:由於這種測試方法僅僅針對程式邏輯中顯式存在的語句,但對於隱藏的條件和可能到達的隱式邏輯分支,是無法測試的。在本例中去掉了語句1—〉T去掉,那麼就少了一條測試路徑。在if結構中若原始碼沒有給出else後面的執行分支,那麼語句覆蓋測試就不會考慮這種情況。但是我們不能排除這種以外的分支不會被執行,而往往這種錯誤會經常出現。再如,在Do-While結構中,語句覆蓋執行其中某一個條件分支。那麼顯然,語句覆蓋對於多分支的邏輯運算是無法全面反映的,它只在乎執行一次,而不考慮其他情況。
2、判定覆蓋
1)主要特點:判定覆蓋又稱為分支覆蓋,它要求設計足夠多的測試用例,使得程式中每個判定至少有一次為真值,有一次為假值,即:程式中的每個分支至少執行一次。每個判斷的取真、取假至少執行一次。
2)用例設計:
X Y 路徑
1 90 90 OAE
2 50 50 OBDE
3 90 70 OBCE
3)優點:判定覆蓋比語句覆蓋要多幾乎一倍的測試路徑,當然也就具有比語句覆蓋更強的測試能力。同樣判定覆蓋也具有和語句覆蓋一樣的簡單性,無須細分每個判定就可以得到測試用例。
4)缺點:往往大部分的判定語句是由多個邏輯條件組合而成(如,判定語句中包含AND、OR、CASE),若僅僅判斷其整個最終結果,而忽略每個條件的取值情況,必然會遺漏部分測試路徑。
3、條件覆蓋
1)主要特點:條件覆蓋要求設計足夠多的測試用例,使得判定中的每個條件獲得各種可能的結果,即每個條件至少有一次為真值,有一次為假值。
2)用例設計:
X Y 路徑
1 90 70 OBC
2 40 OBD
3)優點:顯然條件覆蓋比判定覆蓋,增加了對符合判定情況的測試,增加了測試路徑。
4)缺點:要達到條件覆蓋,需要足夠多的測試用例,但條件覆蓋並不能保證判定覆蓋。條件覆蓋只能保證每個條件至少有一次為真,而不考慮所有的判定結果。
4、判定/條件覆蓋
1)主要特點:設計足夠多的測試用例,使得判定中每個條件的所有可能結果至少出現一次,每個判定本身所有可能結果也至少出現一次。
2)用例設計:
X Y 路徑
1 90 90 OAE
2 50 50 OBDE
3 90 70 OBCE
4 70 90 OBCE
3)優點:判定/條件覆蓋滿足判定覆蓋準則和條件覆蓋準則,彌補了二者的不足。
4)缺點:判定/條件覆蓋準則的缺點是未考慮條件的組合情況。
5、組合覆蓋
1)主要特點:要求設計足夠多的測試用例,使得每個判定中條件結果的所有可能組合至少出現一次。
2)用例設計:
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
3)優點:多重條件覆蓋準則滿足判定覆蓋、條件覆蓋和判定/條件覆蓋準則。更改的判定/條件覆蓋要求設計足夠多的測試用例,使得判定中每個條件的所有可能結果至少出現一次,每個判定本身的所有可能結果也至少出現一次。並且每個條件都顯示能單獨影響判定結果。
4)缺點:線性地增加了測試用例的數量。
6、路徑覆蓋
1)主要特點:設計足夠的測試用例,覆蓋程式中所有可能的路徑。
2)用例設計:
X Y 路徑
1 90 90 OAE
2 50 50 OBDE
3 90 70 OBCE
4 70 90 OBCE
3)優點:這種測試方法可以對程式進行徹底的測試,比前面五種的覆蓋面都廣。
4)缺點:由於路徑覆蓋需要對所有可能的路徑進行測試(包括迴圈、條件組合、分支選擇等),那麼需要設計大量、複雜的測試用例,使得工作量呈指數級增長。而在有些情況下,一些執行路徑是不可能被執行的,如:
If (!A)B++;
If (!A)D--;
這兩個語句實際只包括了2條執行路徑,即A為真或假時候對B和D的處理,真或假不可能都存在,而路徑覆蓋測試則認為是包含了真與假的4條執行路徑。這樣不僅降低了測試效率,而且大量的測試結果的累積,也為排錯帶來麻煩。
總結
白盒測試是一種被廣泛使用的邏輯測試方法,是由程式內部邏輯驅動的一種單元測試方法。只有對程式內部十分了解才能進行適度有效的白盒測試。但是貫穿在程式內部的邏輯存在著不確定性和無窮性,尤其對於大規模複雜軟體。因此我們不能窮舉所有的邏輯路徑,即使窮舉也未必會帶來好運(窮舉不能查出程式邏輯規則錯誤,不能查出資料相關錯誤,不能查出程式遺漏的路徑)。
那麼正確使用白盒測試,就要先從程式碼分析入手,根據不同的程式碼邏輯規則、語句執行情況,選用適合的覆蓋方法。任何一個高效的測試用例,都是針對具體測試場景的。邏輯測試不是片面的測試正確的結果或是測試錯誤的結果,而是儘可能全面地覆蓋每一個邏輯路徑。
轉自:希賽網 作者:谷劍芳
相關推薦
白盒測試—六種覆蓋方法
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/write6/article/details/78702977 定義: 白盒測試又稱結構測試,透明盒測試、邏輯驅動測試或基於程式碼的測試。白盒測試是一種測試用例設計方法,
白盒測試的六種覆蓋準則
白盒測試作為測試人員常用的一種測試方法,越來越受到測試工程師的重視。白盒測試並不是簡單的按照程式碼設計用例,而是需要根據不同的測試需求,結合不同的測試物件,使用適合的方法進行測試。因為對於不同複雜度的程式碼邏輯,可以衍生出許多種執行路徑,只有適當的測試方法,才能幫助我們從程
白盒測試中邏輯覆蓋的六種方法
1.語句覆蓋。這個是起碼要做到的覆蓋了,程式裡的每條可執行的語句都要至少執行一次。這個設計起來比較簡單,用例資料很直觀的就能看出來。但是語句裡的判定,分支等就沒什麼意義了。可以說這樣的測試是最低的要求了。 2.判定覆蓋。每個判斷的真假分支至少執行一次,就是真要至少取一次,假要至少取一次。這個設計起來也
白盒測試---邏輯路徑覆蓋的五種方法和物理路徑覆蓋(一)
一、語句路徑覆蓋:是一個比較弱的邏輯路徑覆蓋標準。是指通過選擇足夠的測試用例,使得執行這些用例時,被測程式的每一個語句至少被執行一次。 舉例: 測試用例 輸入 預期輸出 被測路徑
白盒測試之邏輯覆蓋---軟考
白盒測試也稱為結構測試,根據程式的內部結構和邏輯來設計測試用例,對程式的路徑和過程進行測試,檢查是否滿足設計的需要。 白盒測試常用的技術是邏輯覆蓋、迴圈覆蓋和基本路徑測試。 本次,小
白盒測試:語句覆蓋、條件覆蓋、判定覆蓋、條件-判定覆蓋、組合覆蓋、路徑覆蓋
語句覆蓋:所有的“語句”都要覆蓋一遍判定覆蓋:包含語句覆蓋,每個判斷T、F各一次條件覆蓋:包含語句覆蓋,每個條件T、F各一次判定條件覆蓋:包含判定覆蓋、條件覆蓋條件組合覆蓋:每個條件的每種組合路徑覆蓋:
【軟體測試】白盒測試的條件覆蓋標準強於判定覆蓋(錯)
白盒測試的條件覆蓋標準強於判定覆蓋(錯) 條件覆蓋:每個複合判定表示式的每個簡單判定條件的取真和取假情況至少執行一次; 判定覆蓋:又稱為分支覆蓋,其含義是保證程式中每個判定節點的取真和取假分支至
白盒測試之邏輯覆蓋
語句覆蓋是指選擇足夠的測試用例,使得執行這些測試用例時,被測程式的每個可執行語句都至少執行一次 欲使每個語句都執行一次,只需執行路徑L1(sabcde)即可。 L1=(y=2) and (z=0) or (y>1) and (z=0) and (x>y) 測試用例如下:
白盒測試方法--邏輯覆蓋法
本文目的主要為軟考準備的複習內容。 例項程式碼: int method(bool a, bool b, bool c) { 1 int x; 2 x=0; 3 if(a && (b || c)) 4 x=1; 5 return x; } 1
軟考總計之白盒測試中的覆蓋
白盒測試 中的邏輯覆蓋有分為很多種,在此對其中比較有代表性的幾種覆蓋簡單總結如下: 覆蓋標準 概念 特點 語句覆蓋 選擇足夠多的測試資料,使得被測試程式中每一條
白盒測試之語句覆蓋
定義: 語句覆蓋旨在讓程式中每個可執行語句至少被執行一次。語句覆蓋一般不會根據原始碼來設計測試用例,而是根據流程圖。 示例: 只要測試用例能讓可執行程式碼塊2和4執行到,則達到了語句覆蓋的目的,為
Junit白盒測試條件組合覆蓋
語句 技術分享 img 覆蓋 table 白盒 最大 題目 print 題目介紹 給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,
白盒測試的六種覆蓋方式
找了半天的資料,覺得這個比較好。 一、語句覆蓋(Statement coverage) “語句覆蓋”是一個比較弱的測試標準,它的含義是:選擇足夠的測試用例,使得程式中每個語句至少都能被執行一次。 圖6.4是一個被測試的程式,它的源程式是: PROCEDUREM(VA
談談白盒測試中的幾種覆蓋方法
談談白盒測試中的幾種覆蓋方法 白盒測試用例設計的一個很重要的評估標準就是對程式碼的覆蓋度。一說到覆蓋,大家都感覺非常熟悉,但是常見的覆蓋都有哪些?各自有什麼優缺點?在白盒測試的用例設計中我們應該如何自如地運用呢?今天小編就為大家總結了一下幾種常見的覆蓋以及各自的優缺點。 白盒測試中常見的覆蓋有六種:語句
六種白盒測試(1)
常用的軟體測試方法有兩大類:靜態測試方法和動態測試方法。其中軟體的靜態測試不要求在計算機上實際執行所測程式,主要以一些人工的模擬技術對軟體進行分析和測試;而軟體的動態測試是通過輸入一組預先按照一定的測試準則構造的例項資料來動態執行程式,而達到發現程式錯誤的過程。
[5]白盒測試方法2—圖覆蓋準則
學習圖覆蓋準則需要了解一些其他基本概念。 可達:從某一個結點開始存在一條路徑可達子圖。 可達包括兩個方面:語法可達和語義可達。 語法可達:通過語法構建某種子圖結構當中,存在一條路徑可達到這個子圖。 語義可達:指在實際的程式當中存在這麼一個測試,可到到這個
白盒測試中幾種覆蓋的區別
比較常用的邏輯覆蓋測試方法有:語句覆蓋、判定覆蓋、條件覆蓋、判定-條件覆蓋、條件組合覆蓋、路徑覆蓋。基本路徑測試:在程式控制圖的基礎上,通過分析控制構造的環行復雜性,匯出基本可執行路徑集合,從而設計測試用例的方法。設計出的測試用例要保證在測試中程式的每一個可執行語句至少執行
白盒測試:覆蓋方式
語句覆蓋(statement coverage):語句覆蓋是指程式的每一行程式碼是否都被覆蓋到;語句覆蓋是最常用的一種程式碼覆蓋率指標,也非常簡單。但是對一些控制結構的程式碼而言,它不能真正表示是否完全覆蓋到。 決策覆蓋(decision coverage):又叫分支覆蓋
白盒測試的中邏輯覆蓋的強弱
常用的軟體測試方法有兩大類:靜態測試方法和動態測試方法。其中軟體的靜態測試不要求在計算機上實際執行所測程式,主要以一些人工的模擬技術對軟體進行分析和測試;而軟體的動態測試是通過輸入一組預先按照一定的測試準則構造的例項資料來動態執行程式,而達到發現程式錯誤的過程。 白
整理白盒測試中的邏輯覆蓋
舉例public class Coverage{public void Main(){1 System.out.println("start main function:path a...");2 int A,B,X;3 if(A>1 and B==0){4 X=X/