修改條件判斷覆蓋

修改條件/判斷覆蓋（）簡稱MC/DC，在软件测试中有關代碼覆蓋率的準則。

依照修改條件/判斷覆蓋的準則，測試過程中需要滿足以下所有條件。

每一個判斷的所有可能結果都出現過
每一個判斷中所有條件的所有可能結果都出現過
每一個進入點及結束點都執行過
判斷中每一個條件都可以獨立影響判斷的結果

各條件的獨立影響可以用每一次只改變一個條件來證明。

飛航軟體開發指南及中指定會影響飛機起飛及降落安全性的軟體（A等級軟體），需滿足修改條件/判斷覆蓋的代碼覆蓋測試。在功能安全標準IEC 61508 part 3 的附錄B中，有關SIL 4的說明，以及汽車安全標準ISO 26262第6章的ASIL D，都高度建議使用MC/DC。

定義
條件（Condition） 條件是指最小單位的邏輯，也就是無法再分解的邏輯運算式。

判斷（Decision） 判斷是指條件及零個至多個邏輯運算子組成的邏輯運算式，一個沒有邏輯運算子的判斷是判斷也是條件。

條件覆蓋（Condition coverage） 程式中每一個判斷的所有條件的所有可能結果都至少出現一次。

判斷覆蓋（Decision coverage） 程式中每一個進入點及結束點都執行過一次，每一個判斷的所有可能結果都至少出現一次。

條件/判斷覆蓋（Condition/decision coverage） 程式中每一個進入點及結束點都執行過一次，每一個判斷的所有條件的所有可能結果都至少出現一次，程式中判斷的所有可能結果都至少出現一次。

修改條件/判斷覆蓋（Modified condition/decision coverage） 程式中每一個進入點及結束點都執行過一次，每一個判斷的所有條件的所有可能結果都至少出現一次，程式中判斷的所有可能結果都至少出現一次，而每一個條件都可以獨立的影響判斷的結果。

說明

條件/判斷覆蓋
考慮以下的C++程式

int foo (int x, int y)
{    int z = 0;
    if ((x>0) && (y>0)) 
    {
        z = x;
    }
    return z;
}

用foo(1,1)及foo(0,1)進行測試，前者會使判斷成立，後者會使判斷不成立，因此判斷的所有可能結果都至少出現一次，滿足判斷覆蓋的條件。
用foo(1,1)及foo(0,0)進行測試，條件A及B的所有結果（0和1）都至少出現一次，滿足條件覆蓋的條件。前者會使判斷成立，後者會使判斷不成立，因此判斷的所有可能結果都至少出現一次，滿足判斷覆蓋的條件。因此上述測試滿足條件/判斷覆蓋的準則。

修改條件/判斷覆蓋
修改條件/判斷覆蓋的準則比條件/判斷覆蓋要嚴格，除上述準則外，還需要證明每一個條件都可以獨立影響判斷的結果，是指當一判斷中固定其他條件，只改變一條件時，結果會隨之改變。

考慮以下的C++程式

int foo (int x, int y, int z)
{
    int a = 0;
    if (((x>0) || (y>0)) && (z>0)) {
        a = x;
    }
    return a;
}

使用以下的測試，第一個測試會使判斷成立，第二個測試會使判斷不成立，判斷的所有可能結果都至少出現一次，判斷的每一個條件的所有可能結果也至少出現一次，滿足條件/判斷覆蓋的準則。

 foo(1,1,1)
 foo(0,0,0)

上述的第一個測試中，若將第三個數值由1改為0，判斷由成立改為不成立，因此第三個數值的1可以獨立影響判斷的結果，但若將第一個數值改為0，判斷仍然成立，因此第一個引數無法獨立影響判斷的結果，同理可證第二個數值也無法獨立影響判斷的結果。

而第二個測試中，無論哪一個數值由0改為1，判斷都不成立，因此三個數值的0都無法獨立影響判斷的結果。上述的測試無法滿足修改條件/判斷覆蓋的準則。

若要滿足修改條件/判斷覆蓋的準則，需使用以下的測試：

 foo(0,0,1)
 foo(1,0,1)
 foo(0,1,1)
 foo(1,1,0)

測試中的粗體數值表示此數值會影響輸出的結果，每一個數值（對應程式中的條件）都至少有二次機會影響輸出的結果，而且其中至少有一次使條件成立，至少也有一次使條件不成立。

修改條件/判斷覆蓋的準則需證明每個條件都可以獨立影響判斷的結果，此測試方式會比條件/判斷覆蓋要嚴格，也可以找到較多的錯誤。但考慮測試數量，條件/判斷覆蓋只需二項測試，而修改條件/判斷覆蓋需要四項測試，後者的測試成本也比前者要高。

外部連結 
 What is a "Decision" in Application of Modified Condition/Decision Coverage (MC/DC) and Decision Coverage (DC)?
 An Investigation of Three Forms of the Modified Condition Decision Coverage (MCDC) Criterion

參考資料

软件测试