安 媛,陸云峰
(1.國核自儀系統工程有限公司,上海 200241;2.上海申能崇明發電有限公司,上海 202155)
隨著核電儀控系統數字化程度的提升,應用于核電儀控系統的嵌入式軟件向復雜化和集成化發展,并能實現硬件的功能。嵌入式軟件在設計、編碼后,要固化在存儲芯片,或者在硬件板卡等硬件環境中才能看見,必須配備專門的開發工具和開發環境。
而嵌入式軟件的安全性和可靠性要求比較高。為了保證系統的穩定性,避免由于其可能出現的失效而導致災難性的后果,要求對嵌入式軟件進行獨立的驗證和確認(independent verification and validation,IV&V)。
嵌入式軟件IV&V過程中,有著嚴格的體系標準和驗證流程。因此,在軟件的各個生命周期內因地制宜地調整測試方法和策略,可提高和改善嵌入式軟件的質量。
修正的條件/判定覆蓋(modified condition decision coverage,MC/DC)準則是一種實用的軟件結構覆蓋率測試準則,由波音公司提出,并被RTAC/DO-178B(機載系統和設備合格審定中的軟件)所采納。其目前被廣泛應用于嵌入式軟件IV&V過程中。
嵌入式軟件的主要特點是實時性、可移植性以及軟硬件可裁剪;應用的硬件平臺及操作系統具有多樣性,開發工具昂貴,缺陷不容易修復等特點。
針對以上嵌入式軟件特點,在IV&V的需求分析階段、設計階段、實現階段以及驗證階段,需要采用不同的測試策略。本文主要采用的是靜態代碼分析和動態測試方法相結合的策略[1]。
靜態測試時不需要運行軟件,主要分為代碼審查和靜態代碼分析,通過人工審查和測試工具檢測相結合的方式,完成編碼規范檢查、語法和語義分析、數據流分析等。在需求、設計和實現階段盡早地檢查出錯誤,以減少整個項目的開發成本[2]。
動態測試時軟件需要運行在目標環境中,分為黑盒測試和白盒測試兩種測試類型。黑盒測試主要進行功能檢測,功能全覆蓋后利用白盒測試實現軟件代碼的覆蓋測試,從而進一步提高軟件的質量和可靠性。
覆蓋測試貫穿于單元測試、軟件集成測試、系統測試,通過構造測試實例,運行被測程序,檢查運行結果與預期結果的差異,從而達到測試程序內部邏輯結構的目的[3]。
軟件測試方法分類如圖1所示。

圖1 軟件測試方法分類圖
在嵌入式軟件的IV&V過程中需要進行兩種覆蓋驗證,即需求覆蓋和結構覆蓋。通過需求覆蓋,驗證所有目標函數被正確地執行;通過結構覆蓋,驗證軟件代碼的可達性和充分性。
兩種覆蓋分析相輔相成,建成完備的IV&V體系,實現軟件測試的嚴格性和完全性。條件判定語句由高安全性的實時嵌入式軟件基本語句構成,用于實現各種邏輯控制與實時數據處理。條件判定語句占嵌入式軟件代碼的50%以上。實現條件判定覆蓋是保證結構覆蓋的基礎[4]。
條件判定覆蓋要求同時滿足條件覆蓋和判定覆蓋。條件覆蓋是指每個條件的任何可能取值至少執行一次。判定覆蓋是指每個判定結果也要至少執行一次。但是,條件判定覆蓋卻忽略了兩者組合的情況。
MC/DC修正的條件/判定覆蓋是在條件判定覆蓋的基礎上,實現的一種優化結構覆蓋準則。該準則要求代碼中所有可能輸入輸出取值一次,每個條件必須產生所有可能的輸出結果至少一次,并且每個判定中的每個條件必須能夠獨立影響一個判定的輸出,即在其他條件不變的前提下僅改變這個條件的值,從而使判定結果改變[5]。
條件判定語句由多個布爾表達式通過布爾操作符(如and,or,not等)組成。布爾表達式由關系操作符(如“>”,“<”,“=”等)構成。相同的條件在一個判定中出現多次,則每次出現均視為不同的條件。布爾表達式中最基本就是邏輯與操作符與邏輯或操作符,任何復雜的布爾表達式均可視為“and”和“or”最簡布爾表達式的邏輯組合。
邏輯與布爾表達“A and B”中,A和B均為布爾變量,取值為{0,1},C = A and B的完備測試用例集。邏輯與測試集如表1所示。

表1 邏輯與測試集
{1,2}組測試用例中條件A的所有取值均出現一次,條件A在條件B不變的情況下獨立地影響判定的結果。
{1,3}組測試用例中條件B的所有取值均出現一次,條件B在條件A不變的情況下獨立地影響判定的結果。
因此,取交集{1,2,3}生成邏輯與的最小測試用例集。
邏輯或布爾表達 “A or B”中,A和B均為布爾變量,取值為{0,1},C = A or B的完備測試用例集。邏輯或測試集如表2所示。
{7,8}組測試用例中條件A的所有取值均出現一次,條件A在條件B不變的情況下獨立地影響判定的結果。
{6,8}組測試用例中條件B的所有取值均出現一次,條件B在條件A不變的情況下獨立地影響判定的結果。
因此,取交集{6,7,8}生成邏輯或的最小測試用例集。

表2 邏輯或測試集
最小測試集是實現MC/DC結構覆蓋的基礎,根據最小測試集建立最小測試集用例,從而完成MC/DC覆蓋測試。
隨著嵌入式實時系統的廣泛應用,MC/DC覆蓋率指標被越來越多的監管機構與認證機構認可。很多軟件自動化測試工具中都支持MC/DC覆蓋率度量方法,如Cantata++,VectorCAST等。
VectorCAST是主要用于C/C++/Ada程序的自動化測試軟件,可以應用于Windows和Linux等多種開發平臺。最大程度的自動化和更適用于嵌入式環境,是該平臺最大的特點和優勢。使用VectorCAST輔助進行MC/DC覆蓋測試用例設計和執行分析的流程步驟如下。
①在VectorCAST中創建工程環境,導入測試源碼,完成語句和MC/DC插樁,分離出獨立影響的布爾表達式。
②通過獨立影響條件的真值表獲取每個表達式的最小測試集,并結合需求完成測試用例設計。
③編寫腳本,執行測試用例,分析測試結果,完成缺陷追蹤。
④VectorCAST自動生成覆蓋率報告。
以某核電儀控系統的RCS頂蓋排氣閥控制子系統為例,基于VectorCAST完成MC/DC覆蓋測試,閥門分為電動閥、爆破閥、電磁閥以及調節閥。每類閥門的狀態分為使能、掛牌、打開、關閉,并用黃、紅、粉、綠四種顏色表示。
程序中關于閥門狀態的表達式如下:
If (ValveA->Selected II ValveB->Selected)&& (ValveC->Selected II ValveC->Selected) then
ValveSetStatus(Open);
else
ValveSetStatus(Close);
簡化為if (A or B) and (C or D) then
Statement1;
else
Statement2;
該表達式可以進一步簡化為 Z = X and Y。其中:X=A or B,Y=C or D。
某核電儀控系統RCS頂蓋排氣閥控制子系統的邏輯結構如圖2所示。

圖2 頂蓋排氣閥控制子系統邏輯結構圖
根據以上基本邏輯與或的分析,可獲取獨立影響結果的最小子集,即可得到MC/DC的最小測試用例集。
頂蓋排氣閥控制子系統最小測試集如表3所示。

表3 頂蓋排氣閥控制子系統最小測試集
{1,5}為條件A獨立影響判定結果,{1,3}為條件B獨立影響判定結果,{2,4}為條件C獨立影響判定結果,{2,3}為條件D獨立影響判定結果。即{1,2,3,4,5}5個測試用例生成的最小測試集就可以達到MC/DC的100%覆蓋率。相比于16個測試用例完成的全代碼覆蓋,其數量減少了約70%,有效地提高了驗證效率,節約了驗證成本。
在VectorCAST建立測試工程,選擇statement和MC/DC覆蓋準則插樁源碼,基于最小測試集方法創建相應的測試用例集,編譯運行后可以得到MC/DC的覆蓋率報告。
表4為頂蓋排氣閥系統相關測試模塊的覆蓋率信息,其中最后一列為MC/DC覆蓋率情況。由此可見,最小測試集方法可以實現MC/DC的100%覆蓋測試。

表4 MC/DC 覆蓋率信息
MC/DC覆蓋作為軟件結構覆蓋測試準則之一。在高安全性和高可靠性的嵌入式軟件Level A認證過程中,DO-178B、IEC61508是強制要求遵守的標準。語句覆蓋和MC/DC覆蓋相結合,可以有效地檢出軟件錯誤,從而提高軟件的安全等級。隨著越來越多的國際認證機構對MC/DC覆蓋的認可,MC/DC得到了廣泛應用。