作者 | 李偉 上海控安安全測評部總監
來源 |鑒源實驗室
社群 | 添加微信號“TICPShanghai”加入“上海控安51fusa安全社區”
前兩篇我們介紹了白盒測試中代碼結構覆蓋率測試的語句和分支覆蓋測試,本篇我們介紹MC/DC覆蓋測試。
01
關于定義
MC/DC的全稱是Modified Condition/Decision Coverage,修正條件判定覆蓋率。很多文章對于定義的解釋都比較專業,通常也會讓人感覺理解困難,本文我們用通俗易懂的說明給大家做介紹。從字面意思看這種覆蓋率是通過對條件覆蓋和判定覆蓋組合后進行了一定的修正達成的。我們都知道窮舉測試是不可取的,所以有等價類、邊界值等測試方法來選取典型情況做測試設計。MC/DC的情況也比較類似,隨著代碼判定條件的增多,判定內部每個條件的取值都會對判定結果產生作用,所有判定和所有條件的組合如果窮舉的話是不可取的,MC/DC就對組合的方式選擇進行了約束。
MC/DC涉及到了條件覆蓋和判定覆蓋,其中判定覆蓋(分支覆蓋)我們在上一篇中已經作了比較詳細的說明。本篇我們就先對條件覆蓋測試做簡單說明。
02
條件覆蓋
條件覆蓋測試要求測試設計時涉及邏輯判定的每個條件均要考慮到真假兩種情況。覆蓋時通常不考慮每個條件測試取值對整體判定路徑覆蓋的影響,也不考慮條件間的組合,只考慮每個條件要設計真假兩種情況。理論上在一次邏輯判定的路徑選擇由兩個及以上條件組合決定時,條件覆蓋的測試用例數要多于分支覆蓋測試。
2.1 條件覆蓋測試的舉例
我們繼續使用上篇中的一段簡單代碼來舉例說明:
這段代碼有一個邏輯判定,x < 10 && y > 10的結果是否為假,對應判定的兩個分支。這樣設計測試用例對應判定是基于分支覆蓋來進行的,可以用如下表進行條件取值來做到分支判定100%覆蓋率。
基于條件覆蓋做測試設計時,我們測試用例應該要保證每個條件的真假都被覆蓋到,如下表所示。
我們可以看到判定覆蓋時條件y并沒有取到假的情況,同樣滿足了判定覆蓋率100%,如果剛好此情景下存在故障,僅執行了100%的判定覆蓋是不能發現這個故障的。因此通過這個例子我們可以看到當參與路徑判定的條件足夠多時,條件覆蓋的測試充分程度是高于分支覆蓋的。
2.2 條件覆蓋的不足
從定義要求中我們可以看到,條件覆蓋只關注了每個條件的真假要覆蓋到,對于條件之間的組合或組合對最終判定的影響是不關注的,如果使用僅符合于條件覆蓋需要的測試設計,在某些情況下即使每個條件都做到了真假的覆蓋,由于條件之間的組合,也可能導致某些路徑不會被覆蓋到。
我們將前例中的判定增加一個條件,如下表中所示。
例:if (x < 10 && y > 10 && z == 0)
如上表所示我們根據條件覆蓋的要求,測試設計時考慮到了每個條件均做了真假兩種情況的取值,但是整體的路徑判定只覆蓋到了為真的情況,分支判定為假的路徑例中的測試設計并未覆蓋到。
那我們為什么不將每種組合都做設計呢,設想一下如果參與路徑判定的條件有5個時,測試用例的設計將會多達10余條。程序中的判定越多,參與判定的條件越多,這樣設計的測試用例會迅速擴大至無法實際操作。MC/DC覆蓋能夠在兩者之間進行一個很好的平衡,既考慮分支路徑的判斷覆蓋又滿足參與判定的條件取值要求。
03
MC/DC覆蓋
MC/DC的覆蓋要求源于DO 178適航符合性方法。該標準由美國航空無線電技術委員會(RTCA)編制發布,并作為民用飛機機載軟件開發和適航認證的標準指南文件。由于民航適航認證過程的強制性,MC/DC覆蓋率測試也成為民用航空電子軟件適航測試過程的必須執行項。
DO 178標準首個版本于1982年發布,最新版本為2011年12月發布的第四版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.
定義要求:程序里的每一個輸入和輸出點要至少被調用一次,程序里一個判定中每個條件要至少一次考慮達到所有可能性的結果,程序里每個判定至少一次考慮達到了所有可能性結果,并且一次判定中的每個條件已體現獨立地影響該判定的結果。一個條件可以通過以下方式獨立地影響決策的結果:(1)只改變該條件,同時保持所有其他可能的條件不變;或(2)只改變該條件,同時保持所有其他可能影響結果的條件不變。
原文的專業定義大家可能覺得難以理解,我們繼續使用之前的例子來說明MC/DC的覆蓋設計要求。
以SIL A級要求為準,示例代碼的條件判斷組合如下:if (x < 10 && y > 10 && z == 0)
示例中有一次判定,和3個對結果有影響的條件。設計的測試用例中,查看完整的示例代碼(示例代碼沒有補充輸入變量z)所有輸入輸出都做了考慮,每個條件的可能情況均做了取值,判定的兩種結果都做到了測試覆蓋,某條件取值變化時都保持了所有其他條件的不變。
04
MC/DC覆蓋測試的設計取值模型
通常根據安全要求的等級不同,覆蓋率設計要求也不同,下面我們簡單對不同情況下判定和條件測試設計考慮情況進行舉例。
4.1 MC/DC 測試設計 (SIL A)
其他SIL等級下的DC和SC測試設計時的情況組合我們就不列舉了,前篇文檔我們已做了說明,具體使用時大家也可以查閱相關的專業文檔和測試設計要求文檔。
05
測試小結
在執行MC/DC覆蓋測試時我們有以下建議供大家參考。
1.MC/DC覆蓋測試的條件取值組合有比較詳細的要求,不能簡單認為已完成分支的覆蓋率100%和某些條件的設計取值,就已經完成了MC/DC覆蓋率的設計要求。需要根據上一章節中的標準設計取值模型或實際項目中要求的標準,對所有條件的可能情況和分支覆蓋情況做整體考慮。
2.MC/DC覆蓋測試比其他結構的覆蓋測試復雜,測試設計時可以使用輔助工具來演算每個條件對判定的影響情況,從而更全面的完成用例編寫。
3.提高代碼的編寫和閱讀能力對測試會有很大的幫助,同樣此類測試執行多了對代碼編寫質量的提升也會有很大幫助。
參考文獻:
[1] RTCA DO-178C, “Software Considerations in Airborne Systems and Equipment Certification,” December 2011
審核編輯 黃宇
-
軟件
+關注
關注
69文章
4973瀏覽量
87730 -
軟件代碼
+關注
關注
0文章
9瀏覽量
6354 -
結構化
+關注
關注
0文章
27瀏覽量
10326 -
覆蓋測試
+關注
關注
0文章
4瀏覽量
1132
發布評論請先 登錄
相關推薦
評論