左澤軒+薛戰(zhàn)東
【摘 要】隨著民用飛機機載軟件的應(yīng)用越來越廣泛,軟件復(fù)雜程度越來越高,按照DO-178設(shè)計保證指南進行機載軟件開發(fā)逐漸成為行業(yè)規(guī)范。機載軟件測試是驗證過程的關(guān)鍵,對測試結(jié)果的覆蓋分析中的結(jié)構(gòu)覆蓋,DO-178僅提出了相關(guān)目標的抽象要求,在工程實際驗證軟件過程中不便理解和實現(xiàn)。本文結(jié)合適機載軟件工程實踐,淺析對測試覆蓋分析過程的理解。
【關(guān)鍵詞】DO-178 機載軟件 結(jié)構(gòu)覆蓋 MC/DC
【Abstract】With the wider use of airborne software on civil airplane, and its higher complicity, it is gradually becoming a common standard to develop the airborne software according to DO-178 design guidance. Airborne software test is the key method of verification process. But for structural coverage, which is a step of test coverage analysis, only general requirements has been claimed in DO-178, which leads to the inconvenience of understanding and realization for software verification in engineering. In this essay, combined with experience from both suppliers management and communication with airworthiness certification side, test coverage analysis process is explained from engineering side.
【Key words】DO-178; Airborne Software; Structural Coverage; MC/DC
0 引言
隨著電子信息技術(shù)的發(fā)展,機載電子設(shè)備和機載軟件在民用運輸飛機上的應(yīng)用越來越廣泛。幾乎所有的航空電子系統(tǒng)均由軟件實現(xiàn)其功能,并保證系統(tǒng)和飛機的運行安全。機載軟件的質(zhì)量直接影響飛機運行安全,也是飛機試驗、試飛以及合格取證的保證。
相比于普通商用軟件,機載軟件對安全性可靠性有更高的要求,而隨著復(fù)雜程度的不斷提高,幾乎無法通過簡單的窮舉測試方法保證機載軟件可靠性。FAA、EASA和CAAC相繼通過咨詢通告,推薦DO-178B作為可接受的機載軟件符合性方法,2011年RTCA最新發(fā)布了DO-178C。DO-178是基于過程控制對機載軟件進行管理,但是目前國內(nèi)對此還處于解讀和理解階段,按DO-178B/C進行機載軟件,尤其是對應(yīng)最高安全等級的A級軟件研發(fā),并通過適航審查還缺少相關(guān)經(jīng)驗。
在機載軟件開發(fā)中,驗證活動是貫穿軟件生命周期的整體過程,而軟件測試是驗證的關(guān)鍵。軟件測試的結(jié)果,通常還需采用測試覆蓋分析進行驗證。測試覆蓋分析包括需求覆蓋分析和結(jié)構(gòu)覆蓋分析。需求覆蓋對應(yīng)基于需求的軟件測試過程,保證高級別和低級別需求被覆蓋。對于結(jié)構(gòu)測試覆蓋,DO-178B/C中僅籠統(tǒng)地提出了相關(guān)目標和指南性描述,并未具體說明測試覆蓋的分析方法。實際上無論是對于飛機主制造商的管理,還是國內(nèi)機載軟件開發(fā)商的軟件驗證活動,測試覆蓋都是一個較難解決的問題。本文從民用飛機主制造商角度出發(fā),根據(jù)對國外成熟機載軟件供應(yīng)商的管控,以及與審查方機載軟件代表的溝通經(jīng)驗,分析結(jié)構(gòu)覆蓋的含義、實現(xiàn)和注意點。
1 測試覆蓋
測試覆蓋是指測試用例相對某個特定的覆蓋準則而言的覆蓋情況,是用來度量測試完整性的手段。覆蓋率是指至少被覆蓋一次的測試對象數(shù)量占測試對象總數(shù)的比例。覆蓋分析主要評估軟件測試用例及其測試活動的完備性,間接地可用來評估軟件需求的完整性,從而保證機載軟件測試活動達到相應(yīng)等級的適航要求。
在DO-178B/C中,測試覆蓋分析包括基于需求的測試覆蓋和結(jié)構(gòu)覆蓋。需求測試覆蓋用于分析測試用例與軟件需求的追溯性,保證測試用例滿足特定準則。結(jié)構(gòu)覆蓋用來保證基于需求的測試過程對軟件代碼結(jié)構(gòu)的執(zhí)行滿足合適的覆蓋要求。DO-178對不同等級軟件具有不同的結(jié)構(gòu)覆蓋要求:D級別沒有要求,C級別要求實現(xiàn)語句覆蓋,B級別要求判定覆蓋,A級別則必須滿足MC/DC(修正條件判定)覆蓋。
2 結(jié)構(gòu)覆蓋
結(jié)構(gòu)覆蓋是針對軟件代碼的覆蓋分析,包括源代碼、目標碼和可執(zhí)行代碼。DO-178B/C對于基于需求的測試用例可能無法完全執(zhí)行代碼結(jié)構(gòu),如程序接口部分的代碼,要求進行結(jié)構(gòu)覆蓋分析和其他額外的驗證活動來保證結(jié)構(gòu)覆蓋率。結(jié)構(gòu)覆蓋可以發(fā)現(xiàn)在測試中未被執(zhí)行到的代碼結(jié)構(gòu):
2.1 語句覆蓋
語句覆蓋(Statement Coverage)是最基本的結(jié)構(gòu)覆蓋要求,要求設(shè)計足夠的測試用例,使得程序中每條語句至少被執(zhí)行一次,即目標是對每一條可執(zhí)行語句進行覆蓋測試。分析如下的程序語句:
為便于分析,將該段代碼用流程圖表示如圖1所示,并用小寫字母標注程序執(zhí)行路徑。
對于語句覆蓋測試,為了使得代碼中每條語句被至少執(zhí)行一次。假設(shè)在代碼的路徑(b)中刪除C=1的執(zhí)行語句,則語句覆蓋應(yīng)執(zhí)行流程圖中兩條路徑。設(shè)計兩條測試用例,如表1所示。
語句覆蓋測試可以直接從源代碼得到測試用例,無需細分每條判定表達式。但是,語句覆蓋無法測試隱藏的條件和可能到達的隱式邏輯表達式。例如程序中的IF語句,若未給出ELSE語句后的執(zhí)行分支,則語句覆蓋會忽略該情況的測試(例如本例中不考慮A>1的ELSE條件執(zhí)行語句時,依舊滿足語句覆蓋條件),但實際中無法排除這種分支不會被執(zhí)行;或者判定中某條件錯誤也無法通過語句覆蓋檢查出來,由此可能導(dǎo)致代碼中錯誤的存在。因此語句覆蓋是一種很弱的、不充分的測試覆蓋。
2.2 判定覆蓋
判定覆蓋(Decision Coverage)又稱分支覆蓋,要求足夠的測試用例,使得程序中每個判定至少有一次為真值,一次為假值,即每個分支至少執(zhí)行一次,真假各一次。因此滿足判定覆蓋一定能夠滿足語句覆蓋條件。對于圖1中的代碼程序,設(shè)計如表2的測試用例。
表2 判定覆蓋測試用例
判定覆蓋的測試用例多于語句覆蓋,測試能力更強,同時也無需細分每個判定中的條件。由于判定覆蓋要求對分支的真假值各需執(zhí)行一次,因此即使ELSE語句后沒有執(zhí)行語句,覆蓋也要求設(shè)計相應(yīng)的測試用例,從而提高了代碼測試的充分性。但是,對于判定中由條件組成的布爾表達式,若僅判斷最終結(jié)果而忽略每個條件的取值,可能無法發(fā)現(xiàn)判定條件本身的錯誤。
2.3 條件覆蓋
條件覆蓋(Condition Coverage)不作為DO-178B/C中對軟件的覆蓋要求。條件覆蓋應(yīng)包含足夠的測試用例,使得判定中的每個條件獲得各種可能的結(jié)果,即每個條件至少有一次為真值,一次為假值。
為了實現(xiàn)條件覆蓋,需要設(shè)計大量的測試用例,相比判定覆蓋增加了測試路徑,但是并不能保證判定覆蓋,因為條件覆蓋只保證每個條件至少一次為真,而不考慮所有的判定結(jié)果。
2.4 MC/DC(修正判定條件)覆蓋
在DO-178B/C中,條件(Condition)是指不含布爾操作符(與、或、非等)的布爾表達式;判定是指由條件,加上布爾操作符(零或多個)組成的布爾表達式。根據(jù)FAA和NASA相關(guān)資料的解釋,MC/DC覆蓋要求在一個程序中每一種輸入輸出至少出現(xiàn)一次,在程序中的每一個條件必須產(chǎn)生所有可能的輸出結(jié)果至少一次,并且每個判定中每個條件必須能夠獨立地影響一個判定的輸出,即在其他條件不變的前提下僅改變這個條件的值,而使判定結(jié)果改變。
MC/DC首先要求實現(xiàn)條件覆蓋和判定覆蓋,在此基礎(chǔ)上對于每一個條件C,要求存在符合以下條件的兩次計算:a)條件C所在判定內(nèi)的所有條件,除條件C外,其他條件的取值完全相同;b)條件C的取值相反;c)判定的計算結(jié)果相反。MC/DC覆蓋是條件組合覆蓋的子集。條件組合覆蓋要求覆蓋判定中所有條件取值的所有可能組合,需要大量的測試用例,實用性較差。而MC/DC具有條件組合覆蓋的優(yōu)勢,同時大幅減少了測試用例數(shù)。
假設(shè)對以下的代碼進行MC/DC覆蓋測試用例設(shè)計,并建立真值表,如表3所示。
根據(jù)表3,選取其中的一對測試用例,使得某個條件能獨立影響判定的結(jié)果:選擇真值對3和5,其中條件A的取值變化能夠獨立影響輸出。繼續(xù)選擇新的測試用例,使得某個新的條件能夠獨立影響輸出結(jié)果,并重復(fù)直到所有的條件都能夠獨立影響判定結(jié)果:對于真值對5和8,條件C的變化獨立影響判定,對于真值對8和7,條件B的變化獨立影響判定。如表4所示為選定的MC/DC覆蓋測試用例。
可以看出,MC/DC覆蓋是條件組合覆蓋的子集,條件組合覆蓋要求覆蓋判定中所有條件取值的所有可能組合,隨著條件數(shù)增加用例數(shù)呈指數(shù)增長;而理論上滿足MC/DC覆蓋的測試用例數(shù)下限為條件數(shù)+1,上限為條件數(shù)的兩倍,因此在判定中包含大量條件時可以大大提高軟件測試效率。通過MC/DC測試覆蓋分析,一方面可以發(fā)現(xiàn)未被執(zhí)行的代碼,另一方面能夠檢查出軟件中存在的問題,例如邏輯中“與”被誤寫成“或”,一個變量或表達式被誤寫成了它的“非”。
設(shè)計獨立影響結(jié)果的最小測試用例集一般有兩種方法:唯一原因法(Unique-Cause)和屏蔽法(Masking)。在唯一原因法中,僅關(guān)注條件值和判定表達式結(jié)果,其他所有的可能條件必須保持固定,如上分析的測試用例。屏蔽法是指對一個邏輯操作符的特定輸入能隱藏對該操作符的其他輸入的影響。例如對OR操作符的“T”輸入可以屏蔽其他所有輸入,對AND操作符的“F”輸入可以屏蔽其他所有輸入,只要對判定的內(nèi)部邏輯分析表明關(guān)注的條件是唯一影響判定輸出值的條件,那么屏蔽法允許獨立影響對中多于一個輸入值的變化。
對于本例使用屏蔽法分析,設(shè)X=(B and C),則判定條件可改寫為(^A) or X。為了表明條件A的獨立影響,X必須為“F”,否則判定結(jié)果總是“T”。此時允許B和C的值變化,只要X為“F”,因此屏蔽法產(chǎn)生了更多的獨立影響對。通過建立中間變量來替代所有不關(guān)心的變量,也是檢查條件屏蔽的有效方法。
唯一原因法和屏蔽法都可以保證判定中所有條件的獨立性影響。在多數(shù)情況下,屏蔽法比唯一原因法允許更多的獨立影響對,因為滿足后者的測試用例組必然符合前者的要求。屏蔽法需要分析判定表達式中的內(nèi)部邏輯,因此增加了一定的測試工作量。屏蔽法適用于具有耦合條件的判定中,而唯一原因法則不適用。
DO-178中對于結(jié)構(gòu)測試覆蓋的目標差異是不同等級機載軟件的顯著特征之一,尤其是針對A級和B級軟件的開發(fā)成本考慮,很大程度上來源于MC/DC覆蓋相比判定覆蓋需要增加大量測試用例而導(dǎo)致的成本上升。
2.5 結(jié)構(gòu)覆蓋的實現(xiàn)
結(jié)構(gòu)覆蓋分析測試一般要求在源代碼上進行,DO-178B/C中同時也提到了可以在中間代碼或目標代碼上進行。如果能夠證明源代碼、中間代碼以及目標代碼的一致性,則在這三個層面進行的分析都具有同等效力。對于A級別軟件,如果目標代碼中被編譯環(huán)境等自動加入一些附加代碼,則必須開展一致性分析。
對于不同等級軟件的結(jié)構(gòu)覆蓋要求,通過人工構(gòu)造測試用例時,需要分析每個條件對輸出結(jié)果的影響,容易出現(xiàn)考慮不周或重復(fù),并增加整個軟件生命周期的開發(fā)成本。目前,許多商用的自動化軟件工具都可以提供結(jié)構(gòu)覆蓋率的度量方法,如Cantata++,LDRA Testbed,VectorCAST等。它們可以搭建軟件單元測試環(huán)境并進行代碼覆蓋率分析。通過工具軟件對目標代碼模塊進行插樁,然后通過工具軟件上傳到宿主機上的歷史記錄文件進行分析,獲得覆蓋率的測試報告。
對于結(jié)構(gòu)覆蓋測試中發(fā)現(xiàn)的未執(zhí)行代碼結(jié)構(gòu),可能原因如下:
a)基于需求測試的用例或程序的缺失,應(yīng)增加用例或程序來提高覆蓋率,必要時對基于需求的覆蓋率分析方法進行評審。
b)軟件需求不足時,更改需求并增加測試用例和程序。
c)多余碼(死代碼)情況,刪除并分析其影響和重新驗證的必要性。若多余碼出現(xiàn)在源代碼或目標碼層級,當可以表明可執(zhí)行代碼中不存在多余碼的情況下可以允許保留(DO-178C修訂的要求,在DO-178B中要求直接刪除死代碼)。d)未激活代碼情況,結(jié)合分析和測試來表明已采用了某種手段,能防止、隔離或消除因疏忽而不當運行該類代碼。
3 結(jié)束語
本文從DO-178B/C中對機載軟件測試覆蓋的要求出發(fā),介紹了針對軟件代碼層級的結(jié)構(gòu)覆蓋,通過實例分別介紹了滿足C/B/A級別軟件的語句覆蓋、判定覆蓋、MC/DC覆蓋概念,并說明了在工程中對于結(jié)構(gòu)覆蓋的實現(xiàn)方法。本文作為對DO-178B/C的技術(shù)性研讀,能在一定程度上提高對軟件測試覆蓋的理解,指導(dǎo)機載軟件的開發(fā)、驗證過程。
【參考文獻】
[1]王紅園,郭永飛,姬琪.面向需求覆蓋的航天軟件測試用例優(yōu)化方法[J].光學(xué)精密工程,2014(01).
[2]張軍才,王娟,潘衛(wèi).基于DO-178B的結(jié)構(gòu)覆蓋分析研究[J].航空計算技術(shù),2011,7,41(4).
[3]馬金梭.基于模型的安全關(guān)鍵軟件全覆蓋測試方法的研究與實現(xiàn)[D].上海交通大學(xué).2011.6/
[4]陳鑫,楊平.應(yīng)用MC/DC準則時需考慮的問題及其改進方法[J].計算機工程與設(shè)計.2004.3.25(3).
[5]黃犖,丁立冬.基于LDRA TestBed的民用飛機軟件結(jié)構(gòu)覆蓋率分析流程研究[J].航空標準化與質(zhì)量,2014(4).
[6]岳海,任慧敏.基于修正條件判定覆蓋的軟件測試技術(shù)研究和方法應(yīng)用[J]. 航天控制,2012,6,30(3).
[7]陳勇,嚴林芳,孫景華.民用飛機機載軟件管理[M].北京:航空工業(yè)出版社,2015,78-79.
[8]蔡喁,鄭征,蔡開元,王澤新,歐旭坡.機載軟件適航標準DO-178B/C研究[M].上海:上海交通大學(xué)出版社,2013:70-71.
[9]中航工業(yè)成都凱天電子股份有限公司.機載設(shè)備適航工作指南[M]. 北京:航空工業(yè)出版社,2014:88-90.
[責(zé)任編輯:楊玉潔]