武中奇,趙雅囡,李鳳嬌
(北京和利時(shí)系統(tǒng)工程有限公司,北京,100176)
隨著中國(guó)高速鐵路的迅速發(fā)展,鐵路信號(hào)控制系統(tǒng)的自動(dòng)化程度和復(fù)雜程度也成倍增長(zhǎng)。其中,對(duì)鐵路信號(hào)安全相關(guān)軟件的質(zhì)量屬性提出了更高要求。除了滿足功能性、可靠性、易用性、效率、可維護(hù)性、可移植性等要求外,特別強(qiáng)調(diào)軟件安全完整性的特有屬性。軟件測(cè)試是保證這些屬性得到實(shí)現(xiàn)的重要手段。對(duì)不同安全完整性等級(jí)(SIL)要求的鐵路信號(hào)系統(tǒng)軟件,其代碼測(cè)試覆蓋率及類型有不同的要求。SIL1/2等級(jí)的軟件要求做語(yǔ)句覆蓋(Statement),SIL3等級(jí)的軟件要求做語(yǔ)句+分支覆蓋(Statement + Branch),SIL4等級(jí)的軟件要求做語(yǔ)句+修正條件判定覆蓋(Statement+MC/DC)。《鐵路信號(hào)安全軟件測(cè)試暫行技術(shù)要求》(TJ/DW 231-2020)中對(duì)需達(dá)到SIL4級(jí)安全產(chǎn)品軟件測(cè)試覆蓋率的要求:
(1)軟件源代碼的每條語(yǔ)句都被至少一個(gè)測(cè)試用例覆蓋,語(yǔ)句100%覆蓋;
(2)軟件源代碼的每個(gè)分支都被至少一個(gè)測(cè)試用例覆蓋,分支100%覆蓋;
(3)軟件源代碼的每個(gè)分支的每個(gè)條件都被獨(dú)立起作用的測(cè)試用例覆蓋,即MC/DC100%覆蓋。
通常的覆蓋率統(tǒng)計(jì)在單元測(cè)試中完成,例如使用C++TEST工具進(jìn)行單元測(cè)試,得到該單元的覆蓋率。不同單元的測(cè)試覆蓋率數(shù)據(jù)綜合在一起,得到系統(tǒng)軟件的總體覆蓋率。但是單元測(cè)試不同于系統(tǒng)動(dòng)態(tài)測(cè)試,模塊的接口和行為在系統(tǒng)功能中的表現(xiàn)不同于其單獨(dú)作為被測(cè)對(duì)象的表現(xiàn)。例如,該模塊在當(dāng)前系統(tǒng)功能的測(cè)試用例中不會(huì)被調(diào)用到,或者其中部分分支由于條件不具備而無(wú)法執(zhí)行到。出現(xiàn)此類情況的可能原因包括:
(1)該模塊執(zhí)行了非預(yù)期的行為或者與軟件功能需求規(guī)格書(shū)的要求不一致。
(2)測(cè)試案例設(shè)計(jì)不夠充分,沒(méi)能覆蓋到該模塊。
(3)測(cè)試環(huán)境或條件限制當(dāng)前模塊被調(diào)用。
與之對(duì)應(yīng)的解決方法是:
(1)該模塊是非必要的,因而刪除。
(2)分析該模塊的功能和接口,豐富動(dòng)態(tài)測(cè)試用例集,使其得到完全執(zhí)行。
(3)基于分析的測(cè)試可以作為對(duì)測(cè)試用例無(wú)法執(zhí)行到的模塊代碼覆蓋率的補(bǔ)充。
單元測(cè)試無(wú)法判斷在系統(tǒng)動(dòng)態(tài)測(cè)試過(guò)程中某個(gè)特定模塊的執(zhí)行情況,因而無(wú)從判斷該模塊語(yǔ)句覆蓋率、分支覆蓋率以及MC/DC代碼覆蓋率的具體度量數(shù)值。這里,引入一種自動(dòng)測(cè)試的工具-VectorCAST,是由第三方開(kāi)發(fā)的商用自動(dòng)測(cè)試平臺(tái)。它可以執(zhí)行單元測(cè)試,亦可對(duì)動(dòng)態(tài)測(cè)試的代碼覆蓋率進(jìn)行分析和統(tǒng)計(jì)(QA)。支持的測(cè)試覆蓋類型包括語(yǔ)句覆蓋,語(yǔ)句+分支覆蓋,語(yǔ)句+MC/DC覆蓋,函數(shù)覆蓋,函數(shù)調(diào)用覆蓋,代碼執(zhí)行路徑覆蓋等。
VCAST QA對(duì)軟件的測(cè)試覆蓋率度量有很好的支持,主要包括的測(cè)試覆蓋率類型有:
(1)語(yǔ)句覆蓋(Statement):用于描述特定動(dòng)態(tài)測(cè)試用例運(yùn)行時(shí)每個(gè)可執(zhí)行語(yǔ)句占整個(gè)單元語(yǔ)句總數(shù)的比例。
(2)分支覆蓋(Branch):用于描述特定動(dòng)態(tài)測(cè)試用例運(yùn)行時(shí)每個(gè)可執(zhí)行分支占整個(gè)單元分支總數(shù)的比例。
(3)函數(shù)覆蓋(Function):用于描述特定動(dòng)態(tài)測(cè)試用例運(yùn)行時(shí)所執(zhí)行到的函數(shù)。
(4)修正條件判定覆蓋(MC/DC,Modified Condition/Decision Coverage):一個(gè)MC/DC對(duì)是一對(duì)真值向量,這對(duì)真值向量使得判定語(yǔ)句有不同的結(jié)果,但結(jié)果的不同是由于真值向量中一個(gè)條件值的變化引起的。
另外還包括由以上覆蓋類型組合而成的覆蓋類型,這些組合覆蓋類型的執(zhí)行結(jié)果會(huì)統(tǒng)一合成在一份測(cè)試報(bào)告中。主要的組合覆蓋類型有:
(5)函數(shù)+函數(shù)調(diào)用覆蓋(Function + Function Call)。
(6)語(yǔ)句 +MC/DC覆蓋(Statement + MC/DC)。
(7)語(yǔ)句+分支覆蓋(Statement + Branch)。
通常的動(dòng)態(tài)測(cè)試對(duì)語(yǔ)句執(zhí)行覆蓋率以及函數(shù)調(diào)用情況很難做出定量的描述,更為困難的是對(duì)MC/DC覆蓋率有要求的系統(tǒng)動(dòng)態(tài)測(cè)試,尤其難以測(cè)量。這是因?yàn)閷?duì)于具有 N 個(gè)條件的布爾表達(dá)式,其完備的測(cè)試用例有2N組。很難針對(duì)具體的條件判定設(shè)計(jì)出符合MC/DC要求的100%代碼覆蓋率的測(cè)試用例集。即便設(shè)計(jì)出來(lái),執(zhí)行成本也會(huì)很大。VCAST QA提供了一種可行的方法,在軟件系統(tǒng)動(dòng)態(tài)集成測(cè)試中同步統(tǒng)計(jì)MC/DC測(cè)試覆蓋率,進(jìn)而分析沒(méi)有達(dá)到100%MC/DC代碼覆蓋率是由于什么原因?qū)е碌摹8鶕?jù)經(jīng)驗(yàn),可能的原因包括但不限于:
(1)動(dòng)態(tài)測(cè)試用例集不完備。
(2)當(dāng)前的測(cè)試環(huán)境受限導(dǎo)致無(wú)法執(zhí)行到相應(yīng)的真值對(duì)。
第2)種情況可以使用基于分析的測(cè)試(CBA)作為動(dòng)態(tài)測(cè)試的補(bǔ)充實(shí)現(xiàn)MC/DC100%覆蓋率。
通過(guò)VCAST QA分析系統(tǒng)動(dòng)態(tài)測(cè)試覆蓋率,首先需要對(duì)被測(cè)軟件做一系列預(yù)處理。被測(cè)軟件可以是嵌入式軟件,也可以是運(yùn)行在Windows系統(tǒng)的上位機(jī)軟件。一致的處理流程大致可以概括為:
(1)在VCAST QA環(huán)境中新建工程。
(2)對(duì)新建的工程進(jìn)行適當(dāng)?shù)嘏渲?,例如選擇編譯器、選擇嵌入式CPU類型(Windows程序無(wú)需做此操作)等。
(3)加載被測(cè)源代碼文件。
(4)對(duì)源文件進(jìn)行插樁,插樁指以某種測(cè)試覆蓋率類型對(duì)源文件進(jìn)行預(yù)處理,但不會(huì)影響源文件的內(nèi)部邏輯。插樁會(huì)導(dǎo)致源文件發(fā)生膨脹,這對(duì)內(nèi)存較小的嵌入式軟件會(huì)有較大影響,甚至導(dǎo)致編譯后的可執(zhí)行程序無(wú)法燒寫(xiě)進(jìn)目標(biāo)板。并且插樁后的源文件由于增加了VCAST QA的附加代碼,可能會(huì)影響到嵌入式軟件的時(shí)序。因此,對(duì)嵌入式軟件進(jìn)行插樁處理時(shí)要綜合考慮哪些代碼需要插樁。例如對(duì)變更的代碼進(jìn)行插樁會(huì)顯著減小代碼的膨脹率。需要說(shuō)明的是對(duì)于嵌入式軟件插樁后的源代碼應(yīng)進(jìn)行處理。不同于Windows軟件,動(dòng)態(tài)測(cè)試結(jié)果數(shù)據(jù)可以自動(dòng)保存在被測(cè)軟件的工程目錄下。嵌入式軟件則需要修改部分源代碼。目的是在特定時(shí)刻或條件下,利用嵌入式目標(biāo)板的對(duì)外接口,例如串口或者網(wǎng)口,將內(nèi)存區(qū)域內(nèi)VCAST QA數(shù)據(jù)發(fā)送到PC機(jī)接收端,接收方式可以是超級(jí)終端或者Wireshark等。如果嵌入式系統(tǒng)有記錄卡,也可將VCAST QA數(shù)據(jù)存放在記錄卡內(nèi),通過(guò)讀卡器讀取。
(5)對(duì)經(jīng)過(guò)插樁的源代碼進(jìn)行編譯,運(yùn)行,采集輸出數(shù)據(jù)并存儲(chǔ)為*.DAT格式。
(6)將*.DAT數(shù)據(jù)導(dǎo)入到VCAST QA環(huán)境中,觀察并分析系統(tǒng)動(dòng)態(tài)測(cè)試代碼覆蓋率。
對(duì)C++例程進(jìn)行Function + Function Call插樁和Statement + MC/DC插樁,并對(duì)結(jié)果進(jìn)行分析。
圖1說(shuō)明:
圖1 運(yùn)行結(jié)果
(1)Unit顯示了被測(cè)文件的名稱,本例為brass.cpp。
(2)Subprogram列舉本文件的所有函數(shù)模塊。
(3)Complexity顯示了對(duì)應(yīng)模塊的代碼復(fù)雜度。
(4)Functions顯示了函數(shù)被調(diào)用的狀態(tài),100%為被調(diào)用,0%為未被調(diào)用。
(5)Function Calls顯示了特定函數(shù)被執(zhí)行的語(yǔ)句數(shù)量占該函數(shù)可執(zhí)行語(yǔ)句總數(shù)的比例。例如BrassPluss::withdraw函數(shù)的執(zhí)行比例是85%,14條可執(zhí)行語(yǔ)句中2條未被執(zhí)行。
(6)TOTALS是對(duì)總體的統(tǒng)計(jì),F(xiàn)unctions列90%是由于BrassPluss類的另一個(gè)重載構(gòu)造函數(shù)未被執(zhí)行導(dǎo)致。
函數(shù)及函數(shù)調(diào)用覆蓋率統(tǒng)計(jì)可以顯示某個(gè)文件中函數(shù)被執(zhí)行的情況。實(shí)際系統(tǒng)動(dòng)態(tài)測(cè)試中,關(guān)注的焦點(diǎn)是軟件功能是否滿足系統(tǒng)功能需求規(guī)格說(shuō)明書(shū),發(fā)現(xiàn)并消除軟件BUG,以證明軟件產(chǎn)品是否具備發(fā)布條件。而往往忽視了代碼的簡(jiǎn)潔,模塊功能的安全防護(hù),是否能被執(zhí)行到等維度。Function+Function Call覆蓋率對(duì)此問(wèn)題進(jìn)行了定量描述,為代碼優(yōu)化指明了方向。體現(xiàn)在:
(1)動(dòng)態(tài)執(zhí)行全部測(cè)試用例集后分析哪些函數(shù)未被執(zhí)行到。若此函數(shù)對(duì)應(yīng)了軟件需求規(guī)格說(shuō)明書(shū),則說(shuō)明測(cè)試用例集不夠完備,需補(bǔ)充。若此函數(shù)未對(duì)應(yīng)軟件需求功能規(guī)格說(shuō)明書(shū),也未對(duì)應(yīng)軟件隱含需求,此函數(shù)需刪除。
(2)由于鐵路信號(hào)軟件的高度復(fù)用性,通用模塊經(jīng)常對(duì)應(yīng)于實(shí)際運(yùn)營(yíng)場(chǎng)景中的某種邏輯場(chǎng)景。若沒(méi)被用例集執(zhí)行到,則可反推軟件設(shè)計(jì)規(guī)格說(shuō)明書(shū)對(duì)軟件功能描述是否有遺漏,即作為驗(yàn)證軟件設(shè)計(jì)規(guī)格說(shuō)明書(shū)的一種方法。
圖2說(shuō)明(圖1介紹過(guò)的內(nèi)容不再重復(fù)):
圖2 運(yùn)行結(jié)果
(1)Statements列顯示了對(duì)應(yīng)函數(shù)模塊被執(zhí)行語(yǔ)句占該函數(shù)可執(zhí)行語(yǔ)句的比例。Brass::Withdraw方法的可執(zhí)行語(yǔ)句為7條,且全部被執(zhí)行。覆蓋率為100%。
(2)Branches列顯示了被執(zhí)行到的分支占該函數(shù)總分支數(shù)的比例。
(3)Pairs列顯示了MC/DC真值對(duì)的統(tǒng)計(jì)描述,點(diǎn)擊圖3第32行左側(cè)的紅色箭頭,出現(xiàn)如圖4的界面。
圖3
圖4
圖4顯示了圖3條件判定3.1中所有的MC/DC真值對(duì),其中3、4真值對(duì)被測(cè)試用例執(zhí)行,未被執(zhí)行的真值對(duì)是2、4。因而MC/DC覆蓋率是50%。
圖4中Row 2紅色表示Ca條件沒(méi)有被執(zhí)行到,由于例程中實(shí)際變量amt取值不可能為負(fù)數(shù),因而這個(gè)條件不會(huì)被執(zhí)行到。CBA提供一種基于分析的測(cè)試,作為測(cè)試覆蓋率的補(bǔ)充。若經(jīng)人工確認(rèn)此條件為真時(shí),函數(shù)的行為符合預(yù)期,則認(rèn)為這個(gè)測(cè)試通過(guò)。CBA執(zhí)行結(jié)果如圖5所示。此時(shí)真值對(duì)的覆蓋率是100%。圖6展示了結(jié)合CBA結(jié)論的測(cè)試覆蓋率報(bào)告。
圖5
圖6
Statement+MC/DC測(cè)試實(shí)現(xiàn)100%覆蓋,是安全級(jí)軟件產(chǎn)品滿足SIL4要求的必要條件。實(shí)際動(dòng)態(tài)測(cè)試中,動(dòng)態(tài)測(cè)試用例集執(zhí)行往往以黑盒測(cè)試的方式的為主,關(guān)注軟件功能的實(shí)現(xiàn)以及軟件缺陷的消除。沒(méi)有有效途徑深入軟件結(jié)構(gòu)內(nèi)部分析軟件動(dòng)態(tài)執(zhí)行的情況。VCAST QA提供了這樣一種有效方法。通過(guò)對(duì)源代碼進(jìn)行插樁,實(shí)現(xiàn)對(duì)軟件結(jié)構(gòu)內(nèi)部執(zhí)行情況的追蹤和測(cè)量。用于幫助開(kāi)發(fā)和測(cè)試人員分析:
(1)哪些語(yǔ)句沒(méi)有執(zhí)行到,原因是什么,進(jìn)而采取相應(yīng)措施。
(2)哪些分支沒(méi)有執(zhí)行到,這些分支是否存在執(zhí)行到的可能?若有可能被執(zhí)行到,則通過(guò)豐富用例集或借助CBA進(jìn)行補(bǔ)充測(cè)試。若任何場(chǎng)景都無(wú)法執(zhí)行到,則此分支屬于無(wú)用代碼,應(yīng)予以刪除,以減小軟件規(guī)模。
(3)哪些MC/DC真值對(duì)沒(méi)有被執(zhí)行到,這些真值對(duì)是否存在執(zhí)行到的可能?分析過(guò)程同2)。
(4)Statement+MC/DC測(cè)試是優(yōu)化軟件系統(tǒng)的重要手段。尤其對(duì)于嵌入式系統(tǒng),目標(biāo)板資源有限,精簡(jiǎn)后的軟件代碼執(zhí)行效率更高,安全性和可靠性可得到進(jìn)一步提升。
VCAST QA是鐵路信號(hào)系統(tǒng)軟件集成測(cè)試代碼覆蓋率測(cè)量的有效工具,對(duì)動(dòng)態(tài)測(cè)試用例的完備性提供了間接的量化描述。同時(shí),也為代碼的復(fù)雜程度及有效性評(píng)估提供了重要依據(jù),尤其適合在Windows環(huán)境中運(yùn)行的C或者C++程序。對(duì)于嵌入式軟件,由于目標(biāo)板資源的限制,需要綜合考慮代碼插樁的類型以及被插樁代碼的數(shù)量,防治插樁后的代碼因體量太大而無(wú)法燒寫(xiě)進(jìn)目標(biāo)板的情況出現(xiàn)或者嚴(yán)重影響到目標(biāo)程序的執(zhí)行效率。