覆蓋率##
一、覆蓋率的概念###
覆蓋率是用來度量測試完整性的一個手段,現在有越來越多的測試工具能夠支持覆蓋率測試,但是它們本身並不包含測試技術,只是測試技術有效性的一個度量。白盒測試中經常用到的覆蓋率是邏輯覆蓋率。
二、覆蓋率的目的###
覆蓋率對於軟件測試有着非常重要的作用,通過覆蓋率我們可以知道我們的測試是否充分,我們測試的弱點在哪些方面,進而指導我們設計能夠增加覆蓋率的測試用例,有效的提高測試質量。
一方面覆蓋率技術可以指導測試用例的設計;另一方面,可以通過覆蓋率來衡量白盒測試的力度。
三、邏輯覆蓋率主要有以下六種:###
(1)語句覆蓋;
(2)判定覆蓋;
(3)條件覆蓋;
(4)判定條件覆蓋;
(5)條件組合覆蓋;
(6)路徑覆蓋。
1、語句覆蓋(Statement Coverage)
語句覆蓋的含義是,在測試時,運行被測程序后,程序中被執行到的可執行語句的比率。
語句覆蓋=(至少被執行一次的語句數量)/可執行的語句總數。
*語句覆蓋是最弱的一種覆蓋方式。
2、判定覆蓋(Decision Coverage)
判定覆蓋也叫分支覆蓋(Branch Coverage),含義是:在測試時,運行被測程序后,程序中所有判斷語句的取真分支和取假分支被執行到的比率。
判定覆蓋=(判定結果被評價的次數)/判定結果的總數。
3、條件覆蓋(Condition Coverage)
條件覆蓋的含義是:在測試時,運行被測程序后,所有判斷語句中每個條件的可能取值(真值和假值)出現過的比率。
條件覆蓋=(條件操作數值至少被評價一次的數量)/(條件操作數值得總數)
4、判定條件覆蓋(Decision Condition Coverage)
判定條件覆蓋也叫分支條件覆蓋(Branch Condition Coverage)它的含義是:在測試時,運行被測程序后,所有判斷語句中每個條件的所有可能值(為真為假)和每個判斷本身的判定結果(為真為假)出現的比率。
判定條件覆蓋=(條件操作數值或判定結果至少被評價一次的數量)/(條件操作數值總數+判定結果總數)
*判定條件覆蓋率實際上就是判定覆蓋率和條件覆蓋率的組合。
5、條件組合覆蓋(Condition combination coverage)
條件組合覆蓋的含義是,在測試時,運行被測程序后,所有語句中子條件所有可能的取值結果組合出現過的比率。
條件組合覆蓋=(至少被執行到一次的條件組合)/總的可能的條件組合數。
*條件組合覆蓋是除路徑覆蓋以外,最強的一種覆蓋方式。
6、路徑覆蓋(Path Coverage)
路徑覆蓋的含義是:在測試時,運行被測程序后,程序中所有可能的路徑被執行過的比率。
路徑覆蓋=(至少被執行到一次的路徑數)/總的路徑數。
四、總結五種邏輯覆蓋率。###
1、語句覆蓋是最弱的一種覆蓋方式。
2、條件組合覆蓋是除路徑覆蓋以外,最強的一種覆蓋方式。
3、百分百的條件組合覆蓋一定包含:百分百的語句覆蓋、百分百的判定覆蓋、百分百的條件覆蓋以及百分百的判定條件覆蓋;但不一定包含百分百的路徑覆蓋。
4、百分百的判定覆蓋(分支覆蓋)一定包含:百分百的語句覆蓋。
5、百分百的條件覆蓋不一定包含:百分百的語句覆蓋。
五、舉例說明。###
圖1
<img src="https://images0.cnblogs.com/blog2015/706704/201504/291739062409387.jpg" width="400" height=400" align=center/>
范例一:
1、分析圖1(被測程序流程圖)
(1)語句:有兩條語句,分別為,X=X/A 和 X=X+1。
(2)判定:有兩個判定,分別為(A>1)AND(B=0) 和 (A=2)OR(X>1);這兩個判定,分別都有兩種可能,true或者false,圖中我們用F或者T來表示,所以說這個流程中判定結果的總數為四。
(3)條件:每個判定里面都包含了兩個子條件,每個子條件都有兩種可能性,true或者false,圖中我們分別用T1 F1;T2 F2...來表示,每個判定里面就有四種可能,這樣,這個流程圖中的條件操作數值的總數為八。
(4)判定條件:判定條件覆蓋率實際上就是判定覆蓋率和條件覆蓋率的組合。
(5)條件組合:上面我們在條件里面提到過的,每個判定里面都包含了兩個子條件,每個子條件都有兩種可能性,true或者false,圖中我們分別用T1、F1、T2、F2...來表示,但是和條件覆蓋不一樣的是,每個子條件里面的兩種可能性(T或者F)都要進行兩兩組合,即進行排列組合,那么,條件組合的總數為八種組合。分別為:T1T2,F1F2,T1F2,F1T2;T3T4,F3F4,T3F4,F3T4.
**【 這個時候大家不能混淆這兩個概念,只是因為2個判定比較特殊而已,因為2乘以2和2的2次方是相等的,條件里面是八種條件,而條件組合里面是八種組合。如果一個判定里面有三個子條件的話,這一個判定里面的條件總值就成為2乘以3;而條件組合就是2的3次方。】
(6)路徑:圖1中路徑共有四條,即:abd,ace,abe,acd。
2、給出用例,計算以上六種覆蓋率的值
執行CASE:A=2;B=1;X=3。
在計算覆蓋率之前,我們首先要看判定中的子條件在做什么運算,第一個判定中,這兩個子條件在做與運算,(一個假即為假)。第二個判定中,這兩個子條件在做或預算,(一個真即為真)。
(1)語句覆蓋率:1/2 (50%)
分析:第一個判定中子條件的值為T1、F2(一真一假),所以我們走F這條分支,此時X=X/A這條語句沒有被執行到;接下來,我們看第二個判定,它的子條件的值為T3、T4(都為真),所以我們走T這條分支,這時,語句X=X+1這條語句被執行到了。也就是說,我們只執行到一條語句,所以語句覆蓋率位1/2。
(2)判定覆蓋率:2/4 (50%)
分析:我們剛才在分析語句覆蓋的時候,我們提到第一個判定語句走的是F分支,第二個判定語句也的是T分支,所以我們共走了兩條分支,分支總數為4,所以判定覆蓋率為:2/4。
(3)條件覆蓋率:4/8 (50%)
第一個判定中子條件的值為T1、F2;第二個判定的子條件的值為T3、T4。也就是說我們執行到的條件總數為4;總共的條件操作總值為8,所以條件覆蓋率為:4/8。
(4)判定條件覆蓋率:6/12 (50%)
前面我們已經分析過了,判定條件覆蓋率實際上就是判定覆蓋率和條件覆蓋率的組合,所以判定條件覆蓋率就等與,2/4 (判定覆蓋率)+ 4/8(條件覆蓋率)=6/12(注意,這里的“+”代表的是組合,而不是算數相加,所以是分子分母分別相加即可)。
(5)條件組合覆蓋率:2/8 (25%)
同樣的,在條件覆蓋率分析中我們已經提到過了,第一個判定中子條件的組合為T1F2;第二個判定的子條件的組合為T3T4,也就是說我們執行到了兩種組合;我們在分析流程圖的時候已經提到過,總的可能的條件總數為八種組合,所以說條件組合覆蓋率為:2/8。
(6)路徑覆蓋率:1/4 (25%)
在流程圖分析中我們已經提到,路徑共有四條,而我們走到的路徑為只有abe一條,所以路徑覆蓋率為:1/4。
范例二:
被測程序流程圖還是上面范例一的圖1。
執行case1:A=2,B=0,X=3;
執行case2:A=1,B=0,X=1。
計算這兩種情況下的6種覆蓋率。
(1)語句覆蓋率:2/2 (100%)
case1:第一個判定中子條件的值為T1、T2(都為真),所以我們走T這條分支,執行到X=X/A這條語句;接下來,第二個判定,它的子條件的值為T3、T4(都為真),所以我們走T這條分支,這時,語句X=X+1這條語句被執行到了。也就是說,我們把兩條語句都執行到了,所以語句覆蓋率位2/2。
所以說case1這一條用例就可以到達100%的語句覆蓋,我們就不用再去執行case2了。
(2)判定覆蓋率:4/4 (100%)
case1:我們剛才在分析語句覆蓋的時候,我們提到第一個判定語句走的是T分支,第二個判定語句走的也是T分支;
case2:第一個判定語句中子條件的值為F1、T2,所以我們走F分支;第二個判定語句中子條件的值為F3、F4,所以我們依然走F分支;
上面兩個用例把我們兩個判定中的4個分支都執行到了,所以判定覆蓋率為4/4(100%)。
(3)條件覆蓋率:7/8(100%)
case1:第一個判定語句中子條件的值為T1、T2,第二個判定條件中子條件的值為T3、T4;
case2:第一個判定語句中子條件的值為F1、T2,第二個判定條件中子條件的值為F3、F4;
這兩個用例執行了七種條件,F2沒有執行到,所以條件覆蓋率為:7/8(100%)。
(4)判定條件覆蓋率:11/12。
判定條件覆蓋率=判定覆蓋率和條件覆蓋率的組合 = 4/4 + 7/8 = 11/12。
(5)條件組合覆蓋率:4/8 (50%)
case1:第一個判定語句中子條件的組合為T1T2,第二個判定條件中子條件的組合為T3T4;
case2:第一個判定語句中子條件的組合為F1T2,第二個判定條件中子條件的組合為F3F4;
我們可以看出:這兩個用例只執行到八種組合中的四種組合,所以條件組合覆蓋率為4/8(50%)。
(6)路徑覆蓋率:2/4(50%)
case1:在這條用例中我們所執行到的路徑為:ace。
case2:在這條用例中我們所執行到的路徑為:abd。
這兩條用例執行到兩條路徑(ace和abd),還有兩條路徑(abe和acd)沒有執行到,所以路徑覆蓋率為2/4(50%)。