版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國]-修改條件判斷覆蓋

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

修改條件/判斷覆蓋(Modified condition/decisioncoverage)簡(jiǎn)稱MC/DC,是用在飛航安全軟件文件DO-178B的白箱測(cè)試方式,可以判斷A等級(jí)的軟件是否有經(jīng)過適當(dāng)?shù)能浖y(cè)試。

簡(jiǎn)介依照修改條件/判斷覆蓋的準(zhǔn)則,測(cè)試過程中以下條件至少需成立一次。
每一個(gè)判斷的所有可能結(jié)果都出現(xiàn)過;
每一個(gè)判斷中所有條件的所有可能結(jié)果都出現(xiàn)過;
每一個(gè)進(jìn)入點(diǎn)及結(jié)束點(diǎn)都執(zhí)行過;
判斷中每一個(gè)條件都可以獨(dú)立的影響判斷的結(jié)果。
DO-178B中指定會(huì)影響飛機(jī)起飛及降落安全性的軟件(A等級(jí)軟件),需滿足修改條件/判斷覆蓋的代碼覆蓋測(cè)試。1

定義條件

條件是指最小單位的邏輯運(yùn)算式,也就是無法再分解的邏輯運(yùn)算式。

判斷

判斷是指條件及零個(gè)至多個(gè)邏輯運(yùn)算子組成的邏輯運(yùn)算式,一個(gè)沒有邏輯運(yùn)算子的判斷是判斷也是條件。

條件覆蓋

程式中每一個(gè)判斷的所有條件的所有可能結(jié)果都至少出現(xiàn)一次。

判斷覆蓋

程式中每一個(gè)進(jìn)入點(diǎn)及結(jié)束點(diǎn)都執(zhí)行過一次,每一個(gè)判斷的所有可能結(jié)果都至少出現(xiàn)一次。

條件/判斷覆蓋

程式中每一個(gè)進(jìn)入點(diǎn)及結(jié)束點(diǎn)都執(zhí)行過一次,每一個(gè)判斷的所有條件的所有可能結(jié)果都至少出現(xiàn)一次,程式中判斷的所有可能結(jié)果都至少出現(xiàn)一次。

修改條件/判斷覆蓋

程式中每一個(gè)進(jìn)入點(diǎn)及結(jié)束點(diǎn)都執(zhí)行過一次,每一個(gè)判斷的所有條件的所有可能結(jié)果都至少出現(xiàn)一次,程式中判斷的所有可能結(jié)果都至少出現(xiàn)一次,而每一個(gè)條件都可以獨(dú)立的影響判斷的結(jié)果。1

說明條件/判斷覆蓋考慮以下的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)進(jìn)行測(cè)試,前者會(huì)使判斷成立,后者會(huì)使判斷不成立,因此判斷的所有可能結(jié)果都至少出現(xiàn)一次,滿足判斷覆蓋的條件。

用foo(1,1)及foo(0,0)進(jìn)行測(cè)試,條件A及B的所有結(jié)果(0和1)都至少出現(xiàn)一次,滿足條件覆蓋的條件。前者會(huì)使判斷成立,后者會(huì)使判斷不成立,因此判斷的所有可能結(jié)果都至少出現(xiàn)一次,滿足判斷覆蓋的條件。因此上述測(cè)試滿足條件/判斷覆蓋的準(zhǔn)則。2

修改條件/判斷覆蓋修改條件/判斷覆蓋的準(zhǔn)則比條件/判斷覆蓋要嚴(yán)格,除上述準(zhǔn)則外,還需要證明每一個(gè)條件都可以獨(dú)立影響判斷的結(jié)果,是指當(dāng)一判斷中固定其他條件,只改變一條件時(shí),結(jié)果會(huì)隨之改變。

考慮以下的C++程式

int foo (int x, int y, int z){ int a = 0; if (((x>0) || (y>0)) && (z>0)) { a = x; } return a;}使用以下的測(cè)試,第一個(gè)測(cè)試會(huì)使判斷成立,第二個(gè)測(cè)試會(huì)使判斷不成立,判斷的所有可能結(jié)果都至少出現(xiàn)一次,判斷的每一個(gè)條件的所有可能結(jié)果也至少出現(xiàn)一次,滿足條件/判斷覆蓋的準(zhǔn)則。

foo(1,1,1)

foo(0,0,0)

上述的第一個(gè)測(cè)試中,若將第三個(gè)數(shù)值由1改為0,判斷由成立改為不成立,因此第三個(gè)數(shù)值的1可以獨(dú)立影響判斷的結(jié)果,但若將第一個(gè)數(shù)值改為0,判斷仍然成立,因此第一個(gè)引數(shù)無法獨(dú)立影響判斷的結(jié)果,同理可證第二個(gè)數(shù)值也無法獨(dú)立影響判斷的結(jié)果。

而第二個(gè)測(cè)試中,無論哪一個(gè)數(shù)值由0改為1,判斷都不成立,因此三個(gè)數(shù)值的0都無法獨(dú)立影響判斷的結(jié)果。上述的測(cè)試無法滿足修改條件/判斷覆蓋的準(zhǔn)則。

若要滿足修改條件/判斷覆蓋的準(zhǔn)則,需使用以下的測(cè)試:

foo(0,0,1)

foo(1,0,1)

foo(0,1,1)

foo(1,1,0)

測(cè)試中的粗體數(shù)值表示此數(shù)值會(huì)影響輸出的結(jié)果,每一個(gè)數(shù)值(對(duì)應(yīng)程式中的條件)都至少有二次機(jī)會(huì)影響輸出的結(jié)果,而且其中至少有一次使條件成立,至少也有一次使條件不成立。

修改條件/判斷覆蓋的準(zhǔn)則需證明每個(gè)條件都可以獨(dú)立影響判斷的結(jié)果,此測(cè)試方式會(huì)比條件/判斷覆蓋要嚴(yán)格,也可以找到較多的錯(cuò)誤。但考慮測(cè)試數(shù)量,條件/判斷覆蓋只需二項(xiàng)測(cè)試,而修改條件/判斷覆蓋需要四項(xiàng)測(cè)試,后者的測(cè)試成本也比前者要高。2

本詞條內(nèi)容貢獻(xiàn)者為:

王沛 - 副教授、副研究員 - 中國科學(xué)院工程熱物理研究所