2013-01-25 31 views
11

聲明範圍被認爲確保代碼中的每個語句至少執行一次。
判定/分支覆蓋範圍被認爲是測試每個分支/決定的輸出被測試,即所有在假/真分支中的語句都將被執行。
但這不一樣嗎?在語句覆蓋範圍內,我需要執行所有語句,所以我猜想只能通過運行所有可能的方式來完成。我知道我失去了一些東西..聲明和決策覆蓋範圍之間的差異

+0

我想這個問題是更好的Programmers.StackExchange.com。順便說一句,決定和分支機構的報道不是一回事! –

+0

@Adriano是的,wiki這麼說,但很多其他消息來源都說它是一樣的。 – user970696

+0

不只是維基,「決定」的正式定義是進入分支的代碼路徑(然後分支是整個條件)的每個條件。想象一下,例如,C/C++中的短路。您可以_決定將它們作爲同義詞使用。 –

回答

1

你可能有這樣一種說法:

if(a || b || (c && d && !e)) { 
    test1 = true; 
} else { 
    test2 = false; 
} 

如果你的代碼覆蓋率說這兩個測試1和測試2線被擊中,那麼你有語句覆蓋,但要獲得全分支機構的覆蓋範圍,你需要測試何時a是真實的,當a是假的,但b是真的,當a和b是假的,但c和d是真的,e是假的,等等。

分支機構覆蓋涵蓋每個潛在的組合的分支選擇,因此很難實現100%的覆蓋率。

+0

不知道爲什麼這是從來沒有投票答案。很好的解釋! –

+3

這是錯誤的。分支覆蓋僅需要覆蓋控制流程圖中的所有邊。布爾評估分支到兩個邊緣。看看上面的答案是否正確的答案。 – Outlier

+1

@PaulRutland你所描述的是條件覆蓋,而不是分支覆蓋。 –

19

Paul的回答並不完全正確,至少我認爲是這樣(根據ISTQB的定義)。聲明,決策/分支和條件覆蓋率之間存在相當大的差異。 我將使用來自其他答案的示例,但修改了一下,所以我可以顯示所有三個測試覆蓋範例。這裏寫的測試爲每種類型提供了100%的測試覆蓋率。

if(a || b)) { 
    test1 = true; 
} 
else { 
    if(c) { 
     test2 = true 
    } 
} 

我們有兩種說法在這裏 - 如果(A || B),如果(C),充分說明這些覆蓋面不同的:

  1. 語句覆蓋必須至少測試每個語句一次,所以我們只需要兩個測試:
    • 一個真正= b = false - 也爲我們提供了路徑,如果(A || b)真實 - >測試1 =真
    • A =假,b =假和c = true - 這給了我們路徑: if(a || b)false - > else - > if(c) - > test2 = true。

這樣我們就執行了每一條語句。

  • 分支/判定覆蓋需要多一個測試:

    • 一個=假,B =假,C =假 - 這使我們認爲第二如果但我們正在執行該聲明中的假分支,但未在語句覆蓋範圍內執行

    這樣我們就測試了所有分支,這意味着我們經歷了所有路徑。

  • 條件覆蓋需要另一個測試:

    • A =假,B =真 - 通過爲第一個測試相同的路徑通向但在OR語句(A || B)執行其他決定通過它。
  • 我們所有條件測試的方式,這意味着我們通過所有路徑(分支)去與我們所能每個條件觸發了 - 第一個「如果」語句是因爲第一個測試真正= true觸發它並在最後一次測試中因爲b = true觸發了它。當然,有人可能會認爲a = true和b = true的情況也應該進行測試,但是當我們檢查'或'是如何工作的時候,我們可以看到它不是必需的,變量c也可以是任何值在那些測試中沒有評估。

    至少我這樣解釋它。如果有人仍有意:)

    編輯:在大多數的來源,我發現最近決定/分支覆蓋方面是等同的,我描述爲判定覆蓋術語實際上是在條件覆蓋,因此答案是更新。

    +2

    我不認爲這是正確的。根據ISTQB詞彙表(http://astqb.org/glossary/):「聲明範圍: 測試套件已執行的可執行語句的百分比。」在您的「聲明範圍」示例中,'test1 = true ;'永遠不會被執行,但它顯然是一個可執行語句。 –

    +0

    但test1不是聲明,它是可變的,在這種情況下,我們可以達到的邊緣。 '如果'是陳述(條件陳述是確切的)。也許我在這裏錯過了一些東西,但我這樣理解它。 – Faflok

    +4

    'test1 = true;'是一個變量賦值,因此是一個可執行語句。 –

    1

    我可以添加到上面,我發現缺少,如果測試有完整的分支覆蓋,那麼我們可以說它也有完整的語句覆蓋,但反之亦然。

    100%的分支覆蓋率=> 100%的語句覆蓋

    100%的語句覆蓋並不意味着100%的分支覆蓋率

    的原因是在分支覆蓋除了執行所有的語句,我們還應該驗證測試是否執行所有分支,這可以解釋爲覆蓋控制流分支中的所有邊緣

    if(a){ 
        if(b){ 
        bool statement1 = true; 
        } 
    } 
    

    A =真,B =真會付出100%的語句覆蓋,但不是分支覆蓋

    enter image description here

    在分支覆蓋,我們需要覆蓋所有的邊緣,這是我們在所示的語句覆蓋率錯過作爲紅線在上面的圖像