
修正判定條件覆蓋(Modified Condition/Decision Coverage即MC/DC)
通過參照上圖,我們首先從宏觀的角度上理解MCDC在軟件測試中的分支。軟件測試軟件工程開發中中必不可少且非常重要的一部分,軟件測試從是否執行代碼來看可分為兩種測試方法:靜態測試和動態測試.靜態測試是指不用執行程序的測試,它主要采取方案——代碼走查、技術評審、代碼審查的方法對軟件產品進行測試,通俗來說就是“看”代碼;而動態測試是指實際運行程序,並通過觀察程序運行的實際結果來發現錯誤的軟件測試技術,從是否關心內部結構來看它分為黑盒測試和白盒測試.黑盒測試是在不知道程序內部結構,只知道程序規格的情況下采用的測試技術或策略;白盒測試是一種在知道程序內部結構的情況下采用的測試技術或策略,就是要選取足夠的測試用例,對源代碼實現比較充分的覆蓋,以便盡可能多地發現程序中的錯誤.它包括邏輯覆蓋法、路徑測試法、循環覆蓋.MC/DC就是白盒測試方法中的邏輯覆蓋中的方法.MC/DC是歐美的航空/航天制造廠商和使用單位聯合制定的“航空運輸和裝備系統軟件認證標准”,目前在國防和航空航天領域應用廣泛。
MC/DC是DO-178B Level A認證標准中規定的,歐美民用航空器強制要求遵守該標准。
MC/DC定義如下:
Condition —— a Boolean expression containing no Boolean operators:
Decision —— a Boolean expression composed of conditions and zero or more Boolean operators:
Modified Condition/Decision Coverage —— every point of entry and exit in the program has been invoked at least once,every condition in the program has taken all possible outcomes at least once,and each condition in a decision has been shown to independently affect a decision S outcome by varying just that condition while holding fixed all other possible conditions.
條件表示不含有布爾操作符號的布爾表達式;
判定表示由條件和零或者很多布爾操作符號所組成的一個布爾表達式;
修正條件判定覆蓋要求在一個程序中每一種輸入輸出至少得出現一次,在程序中的每一個條件必須產生所有可能的輸出結果至少一次,並且每一個判定中的每一個條件必須能夠獨立影響一個判定的輸出,即在其他條件不變的前提下僅改變這個條件的值,而使判定結果改變。
定義顯得有些晦澀難懂的,我們可以換一個角度來解讀這句話:
MC/DC首先要求實現條件覆蓋、判定覆蓋,在此基礎上,對於每一個條件C,要求存在符合以下條件的兩次計算:
1)條件C所在判定內的所有條件,除條件C外,其他條件的取值完全相同;
類似於控制變量;
2)條件C的取值相反;
3)判定的計算結果相反。
核心意思是每個條件都要獨立影響判定結果。為什么說“兩次計算”,而不是“兩個用例”呢?當循環中有判定時,一個用例下同一判定可能被計算多次,每次的條件值和判定值也可能不同,因此,一個用例就可能完成循環中判定的MC/DC。
MC/DC是條件組合覆蓋的子集。條件組合覆蓋要求覆蓋判定中所有條件取值的所有可能組合,需要大量的測試用例,實用性較差。MC/DC具有條件組合覆蓋的優勢,同時大幅減少用例數。滿足MC/DC的用例數下界為條件數+1,上界為條件數的兩倍,例如,判定中有兩個條件,條件組合需要4個用圖表1,
表1
| 用例 |
A |
B |
A&&B |
| 1 |
T |
T |
T |
| 2 |
T |
F |
F |
| 3 |
F |
T |
F |
| 4 |
F |
F |
F |
而MC/DC只需要3個圖表2。
表2
| 用例 |
A |
B |
A&&B |
| 1 |
T |
T |
T |
| 2 |
T |
F |
F |
| 3 |
F |
T |
F |
對於條件A,用例1和用例3,A取值相反,B相同,判定結果分別為1和0;
對於條件B,用例1和用例2,B取值相反,A相同,判定結果分別為1和0;
判定中有三個條件,條件組合覆蓋需要8個用例,而MC/DC需要的用例數為4至6個。如果判定中條件很多,用例數的差別將非常大,例如,判定中有10個條件,條件組合覆蓋需要1024個用例,而MC/DC只需要11至20個用例。
那么我們該如何寫出測試集
思路:邏輯與表達式測試所有條件為真的的情況,然后分別測試每個條件為假,其他條件都為真的情況。邏輯或表達式測試所有條件為假的情況。然后分別測試每個條件為真的情況。
MC/DC效果與多重條件覆蓋效果相同,但是用例數確明顯減少。
MCDC實例
A||(B&&C)
首先第一層:對於邏輯或表達式,所有條件為假,然后測試每個條件為真
即A為F,(B&&C)為F
A為T,(B&&C)為F
A為F,(B&&C)為T
第二層:邏輯與表達式測試所有條件為真的的情況,然后分別測試每個條件為假,其他條件都為真的情況
即B為T,C為T
B為F,C為T
B為T,C為F
| 用例 |
A |
B |
C |
(B&&C) |
A||(B&&C) |
| 1 |
F |
F |
T |
F |
F |
| 2 |
T |
F |
T |
F |
T |
| 3 |
F |
T |
T |
T |
T |
| 4 |
F |
T |
F |
F |
F |
對於條件A用例1和2,A取反,B、C相同,結果取反
對於條件A用例1和3,B取反,A、C相同,結果取反
此時我們會發現還差一個C取反,A、B相同的案例,由於前三個案例C全為T,故此時C為F,於是B只能為T即,3、4做對比,A為F。由此我們便寫出MC\DC的測試用例
依照上述我們再進行一個測試用例
(A||B)&&(C||D)
首先第一層:
| 用例 |
(A||B) |
(C||D) |
(A||B)&&(C||D) |
| 1 |
T |
T |
T |
| 2 |
T |
F |
F |
| 3 |
F |
T |
F |
A||B為F
| 用例 |
A |
B |
A||B |
| 1 |
F |
F |
F |
| 2 |
F |
T |
T |
| 3 |
T |
F |
T |
C||D為F
| 用例 |
C |
D |
C||D |
| 1 |
F |
F |
F |
| 2 |
F |
T |
T |
| 3 |
T |
F |
T |

當我們寫完1、2、3案例,自然就可以寫出A和C,而且這個用例組不唯一

第二種方法
(1)我們已經知道就最簡布爾表達式:邏輯與表達式測試所有條件為真的的情況,然后分別測試每個條件為假,其他條件都為真的情況。邏輯或表達式測試所有條件為假的情況。然后分別測試每個條件為真的情況。
(A||B)&&(C&&D)可以等價看成X&&Y,其中X為(A||B)Y為(C&&D)
(2)針對第一個條件,設計直接作用到結果的第一組測試用例,再對其他條件取值的時候不斷使用關於“AND”和“OR”最簡布爾表達式的測試用例設計思路;
(3)每個條件應取到所有可能的值;
(4)針對每個條件,在前邊已經測試好的測試用例中,選取該條件直接作用到結果的測試用例為參照對象,改變該條件的取值,同時保持其他條件的的值不變。
(5)按照這種方式的獲得的最小測試用例組不是唯一的。
| 用例 |
(A||B) |
(C||D) |
(A||B)&&(C||D) |
| 1 |
T |
T |
T |
| 2 |
T |
F |
F |
| 3 |
F |
T |
F |
A||B為F
| 用例 |
A |
B |
A||B |
| 1 |
F |
F |
F |
| 2 |
F |
T |
T |
| 3 |
T |
F |
T |
C||D為F
| 用例 |
C |
D |
C||D |
| 1 |
F |
F |
F |
| 2 |
F |
T |
T |
| 3 |
T |
F |
T |

這樣我們也可以找到最小測試用例,而且更加條理。
以上便是我通過借鑒網絡各個博主以及我自己的一些理解與總結,可能難免出現錯誤,歡迎私信批評指正,如有侵占,聯系后我會及時刪除。
2022-04-12 22:24:21
