作者 | 李偉 上??匕舶踩珳y評部總監(jiān)
來源 |鑒源實驗室
社群 | 添加微信號“TICPShanghai”加入“上海控安51fusa安全社區(qū)”
前兩篇我們介紹了白盒測試中代碼結(jié)構(gòu)覆蓋率測試的語句和分支覆蓋測試,本篇我們介紹MC/DC覆蓋測試。
01
關(guān)于定義
MC/DC的全稱是Modified Condition/Decision Coverage,修正條件判定覆蓋率。很多文章對于定義的解釋都比較專業(yè),通常也會讓人感覺理解困難,本文我們用通俗易懂的說明給大家做介紹。從字面意思看這種覆蓋率是通過對條件覆蓋和判定覆蓋組合后進行了一定的修正達成的。我們都知道窮舉測試是不可取的,所以有等價類、邊界值等測試方法來選取典型情況做測試設(shè)計。MC/DC的情況也比較類似,隨著代碼判定條件的增多,判定內(nèi)部每個條件的取值都會對判定結(jié)果產(chǎn)生作用,所有判定和所有條件的組合如果窮舉的話是不可取的,MC/DC就對組合的方式選擇進行了約束。
MC/DC涉及到了條件覆蓋和判定覆蓋,其中判定覆蓋(分支覆蓋)我們在上一篇中已經(jīng)作了比較詳細的說明。本篇我們就先對條件覆蓋測試做簡單說明。
02
條件覆蓋
條件覆蓋測試要求測試設(shè)計時涉及邏輯判定的每個條件均要考慮到真假兩種情況。覆蓋時通常不考慮每個條件測試取值對整體判定路徑覆蓋的影響,也不考慮條件間的組合,只考慮每個條件要設(shè)計真假兩種情況。理論上在一次邏輯判定的路徑選擇由兩個及以上條件組合決定時,條件覆蓋的測試用例數(shù)要多于分支覆蓋測試。
2.1 條件覆蓋測試的舉例
我們繼續(xù)使用上篇中的一段簡單代碼來舉例說明:
這段代碼有一個邏輯判定,x < 10 && y > 10的結(jié)果是否為假,對應(yīng)判定的兩個分支。這樣設(shè)計測試用例對應(yīng)判定是基于分支覆蓋來進行的,可以用如下表進行條件取值來做到分支判定100%覆蓋率。
基于條件覆蓋做測試設(shè)計時,我們測試用例應(yīng)該要保證每個條件的真假都被覆蓋到,如下表所示。
我們可以看到判定覆蓋時條件y并沒有取到假的情況,同樣滿足了判定覆蓋率100%,如果剛好此情景下存在故障,僅執(zhí)行了100%的判定覆蓋是不能發(fā)現(xiàn)這個故障的。因此通過這個例子我們可以看到當參與路徑判定的條件足夠多時,條件覆蓋的測試充分程度是高于分支覆蓋的。
2.2 條件覆蓋的不足
從定義要求中我們可以看到,條件覆蓋只關(guān)注了每個條件的真假要覆蓋到,對于條件之間的組合或組合對最終判定的影響是不關(guān)注的,如果使用僅符合于條件覆蓋需要的測試設(shè)計,在某些情況下即使每個條件都做到了真假的覆蓋,由于條件之間的組合,也可能導(dǎo)致某些路徑不會被覆蓋到。
我們將前例中的判定增加一個條件,如下表中所示。
例:if (x < 10 && y > 10 && z == 0)
如上表所示我們根據(jù)條件覆蓋的要求,測試設(shè)計時考慮到了每個條件均做了真假兩種情況的取值,但是整體的路徑判定只覆蓋到了為真的情況,分支判定為假的路徑例中的測試設(shè)計并未覆蓋到。
那我們?yōu)槭裁床粚⒚糠N組合都做設(shè)計呢,設(shè)想一下如果參與路徑判定的條件有5個時,測試用例的設(shè)計將會多達10余條。程序中的判定越多,參與判定的條件越多,這樣設(shè)計的測試用例會迅速擴大至無法實際操作。MC/DC覆蓋能夠在兩者之間進行一個很好的平衡,既考慮分支路徑的判斷覆蓋又滿足參與判定的條件取值要求。
03
MC/DC覆蓋
MC/DC的覆蓋要求源于DO 178適航符合性方法。該標準由美國航空無線電技術(shù)委員會(RTCA)編制發(fā)布,并作為民用飛機機載軟件開發(fā)和適航認證的標準指南文件。由于民航適航認證過程的強制性,MC/DC覆蓋率測試也成為民用航空電子軟件適航測試過程的必須執(zhí)行項。
DO 178標準首個版本于1982年發(fā)布,最新版本為2011年12月發(fā)布的第四版DO 178C。標準對MC/DC覆蓋的定義原文描述如下:
Modified Condition/Decision Coverage: Every point of entry and exit in the program has been invoked at least once, every condition in a decision in the program has taken all possible outcomes at least once, every decision in the program has taken all possible outcomes at least once, and each condition in a decision has been shown to independently affect that decision’s outcome. A condition is shown to independently affect a decision’s outcome by: (1) varying just that condition while holding fixed all other possible conditions, or (2) varying just that condition while holding fixed all other possible conditions that could affect the outcome.
定義要求:程序里的每一個輸入和輸出點要至少被調(diào)用一次,程序里一個判定中每個條件要至少一次考慮達到所有可能性的結(jié)果,程序里每個判定至少一次考慮達到了所有可能性結(jié)果,并且一次判定中的每個條件已體現(xiàn)獨立地影響該判定的結(jié)果。一個條件可以通過以下方式獨立地影響決策的結(jié)果:(1)只改變該條件,同時保持所有其他可能的條件不變;或(2)只改變該條件,同時保持所有其他可能影響結(jié)果的條件不變。
原文的專業(yè)定義大家可能覺得難以理解,我們繼續(xù)使用之前的例子來說明MC/DC的覆蓋設(shè)計要求。
以SIL A級要求為準,示例代碼的條件判斷組合如下:if (x < 10 && y > 10 && z == 0)
示例中有一次判定,和3個對結(jié)果有影響的條件。設(shè)計的測試用例中,查看完整的示例代碼(示例代碼沒有補充輸入變量z)所有輸入輸出都做了考慮,每個條件的可能情況均做了取值,判定的兩種結(jié)果都做到了測試覆蓋,某條件取值變化時都保持了所有其他條件的不變。
04
MC/DC覆蓋測試的設(shè)計取值模型
通常根據(jù)安全要求的等級不同,覆蓋率設(shè)計要求也不同,下面我們簡單對不同情況下判定和條件測試設(shè)計考慮情況進行舉例。
4.1 MC/DC 測試設(shè)計 (SIL A)
其他SIL等級下的DC和SC測試設(shè)計時的情況組合我們就不列舉了,前篇文檔我們已做了說明,具體使用時大家也可以查閱相關(guān)的專業(yè)文檔和測試設(shè)計要求文檔。
05
測試小結(jié)
在執(zhí)行MC/DC覆蓋測試時我們有以下建議供大家參考。
1.MC/DC覆蓋測試的條件取值組合有比較詳細的要求,不能簡單認為已完成分支的覆蓋率100%和某些條件的設(shè)計取值,就已經(jīng)完成了MC/DC覆蓋率的設(shè)計要求。需要根據(jù)上一章節(jié)中的標準設(shè)計取值模型或?qū)嶋H項目中要求的標準,對所有條件的可能情況和分支覆蓋情況做整體考慮。
2.MC/DC覆蓋測試比其他結(jié)構(gòu)的覆蓋測試復(fù)雜,測試設(shè)計時可以使用輔助工具來演算每個條件對判定的影響情況,從而更全面的完成用例編寫。
3.提高代碼的編寫和閱讀能力對測試會有很大的幫助,同樣此類測試執(zhí)行多了對代碼編寫質(zhì)量的提升也會有很大幫助。
參考文獻:
[1] RTCA DO-178C, “Software Considerations in Airborne Systems and Equipment Certification,” December 2011
審核編輯 黃宇
-
軟件
+關(guān)注
關(guān)注
69文章
5028瀏覽量
88142 -
軟件代碼
+關(guān)注
關(guān)注
0文章
9瀏覽量
6368 -
結(jié)構(gòu)化
+關(guān)注
關(guān)注
0文章
27瀏覽量
10334 -
覆蓋測試
+關(guān)注
關(guān)注
0文章
4瀏覽量
1132
發(fā)布評論請先 登錄
相關(guān)推薦
代碼覆蓋率測試工具BullseyeCoverage在嵌入式軟件系統(tǒng)中的應(yīng)用研究
![<b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>率<b class='flag-5'>測試</b>工具BullseyeCoverage在嵌入式<b class='flag-5'>軟件</b>系統(tǒng)中的應(yīng)用研究](https://file.elecfans.com/web1/M00/C7/8A/pIYBAF9oc0OAKfG4AADAZJeo5x4546.png)
怎么設(shè)計基于路徑覆蓋的嵌入式軟件動態(tài)測試?
基于路徑覆蓋的嵌入式軟件動態(tài)該怎么測試?
如何對嵌入式軟件進行覆蓋測試?
非結(jié)構(gòu)化P2P覆蓋網(wǎng)絡(luò)通信協(xié)議研究
如何使用覆蓋率指標進行更有效的嵌入式軟件測試
代碼覆蓋率工具的重要性
![<b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>率工具的重要性](https://file.elecfans.com//web2/M00/81/EC/pYYBAGORjrSAOEd5AAE3HzGhA5Y379.png)
代碼覆蓋率記錄
![<b class='flag-5'>代碼</b><b class='flag-5'>覆蓋</b>率記錄](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論