凌 珊
(西南交通大學(xué) 信息與科學(xué)技術(shù)學(xué)院,成都 611756)
隨著我國(guó)鐵路的快速發(fā)展,鐵路旅客發(fā)送量及旅客周轉(zhuǎn)量逐年增加,保證鐵路運(yùn)輸安全、提高運(yùn)輸效率越來(lái)越成為鐵路系統(tǒng)關(guān)注的話題。鐵路信號(hào)軟件控制信號(hào)基礎(chǔ)設(shè)備動(dòng)作并實(shí)現(xiàn)邏輯檢查,其穩(wěn)定性及可靠性對(duì)于保證鐵路安全運(yùn)輸起著重要的作用。在軟件投入使用之前,需要對(duì)軟件進(jìn)行一系列的測(cè)試,單元測(cè)試作為最早、最基本的環(huán)節(jié),不僅是軟件可靠性與穩(wěn)定性保證的關(guān)鍵因素,更是保證軟件質(zhì)量的有效手段。現(xiàn)階段,對(duì)于鐵路信號(hào)軟件單元測(cè)試,大多存在測(cè)試不完整、不規(guī)范等缺點(diǎn),如文獻(xiàn)[1]僅介紹了計(jì)算機(jī)聯(lián)鎖軟件的黑盒測(cè)試。而鐵路信號(hào)系統(tǒng)安全度等級(jí)嚴(yán)苛,其軟件質(zhì)量要求高,在對(duì)其進(jìn)行單元測(cè)試階段,更應(yīng)按照規(guī)定進(jìn)行更加細(xì)致完整的驗(yàn)證,以保證鐵路信號(hào)軟件的可靠性,進(jìn)一步提升鐵路信號(hào)系統(tǒng)的安全性。
軟件的單元測(cè)試就是針對(duì)軟件最小組成單元進(jìn)行正確性檢驗(yàn)的測(cè)試工作,它的測(cè)試對(duì)象可以是一個(gè)模塊、一個(gè)類甚至是一個(gè)函數(shù)[2]。測(cè)試人員依據(jù)軟件源程序和軟件設(shè)計(jì)規(guī)格說(shuō)明書,了解函數(shù)的輸入、輸出范圍限制,以及代碼邏輯原理,以測(cè)試的方式來(lái)分析軟件編碼是否正確,確定軟件接口、單元功能是否與軟件設(shè)計(jì)規(guī)格說(shuō)明書要求一致[3]。
對(duì)于較為復(fù)雜的軟件,通過(guò)運(yùn)行單元測(cè)試,可以直接測(cè)試各個(gè)功能的正確性,而無(wú)需啟動(dòng)整個(gè)系統(tǒng),能夠較早地發(fā)現(xiàn)編碼問(wèn)題并迅速定位問(wèn)題所在位置,及時(shí)修改,降低整體開(kāi)發(fā)時(shí)間,減少后期維護(hù)成本,有效提高軟件代碼質(zhì)量。因此,單元測(cè)試是復(fù)雜軟件測(cè)試中必不可少的一部分。
軟件單元測(cè)試主要分為靜態(tài)分析和動(dòng)態(tài)測(cè)試兩種方法,其中,動(dòng)態(tài)測(cè)試又可分為白盒測(cè)試和黑盒測(cè)試[4]。
1.2.1 靜態(tài)分析
靜態(tài)分析是一種不執(zhí)行代碼本身而獲得其信息的技術(shù),其目的是根據(jù)代碼標(biāo)準(zhǔn)進(jìn)行質(zhì)量監(jiān)控[5]。依靠人工檢查或者專用的工具分析,檢查軟件源代碼在邏輯、語(yǔ)法中所存在的錯(cuò)誤。在整個(gè)檢查過(guò)程中,可以覆蓋所有程序代碼,而不會(huì)破壞代碼本身。靜態(tài)分析的度量指標(biāo)有邏輯代碼行數(shù)、圈復(fù)雜度、扇入數(shù)、扇出數(shù)等。
白盒測(cè)試是基于軟件內(nèi)部設(shè)計(jì)和程序?qū)崿F(xiàn)的測(cè)試方法,顧名思義,白盒,能夠看見(jiàn)內(nèi)部,這是一種“身處其中”的測(cè)試機(jī)制。整個(gè)測(cè)試過(guò)程中,不僅僅關(guān)注輸入與輸出的結(jié)果是否正確,還可以知曉軟件內(nèi)部程序是如何處理的[6]。白盒測(cè)試的主要方法有:數(shù)據(jù)流法、控制流法、邏輯覆蓋分析法等。
1.2.3 黑盒測(cè)試
黑盒測(cè)試也稱為功能性測(cè)試,從字面上理解,就是把軟件單元的所有功能和邏輯接口放入一個(gè)黑盒子中,在無(wú)法得知內(nèi)部邏輯走向與程序結(jié)構(gòu)時(shí),根據(jù)預(yù)設(shè)的程序進(jìn)行測(cè)試[7],驗(yàn)證軟件功能的正確性。在測(cè)試過(guò)程中,黑盒測(cè)試只關(guān)注輸入、輸出,若輸入一個(gè)測(cè)試數(shù)據(jù),其輸出結(jié)果是正確的,則認(rèn)為該功能正確,而不考慮軟件內(nèi)部的計(jì)算處理過(guò)程,是一種“置身事外”的數(shù)據(jù)驅(qū)動(dòng)測(cè)試。黑盒測(cè)試的主要方法有邊界值分析法、等價(jià)類劃分法、場(chǎng)景法和因果圖法等。
目前,在鐵路信號(hào)領(lǐng)域,鐵路信號(hào)軟件測(cè)試的標(biāo)準(zhǔn)規(guī)范主要參考MISRA-C:2004 (Guidelines for the use of the C language in critical systems)[8]和ISO 29119-3(軟件測(cè)試國(guó)際標(biāo)準(zhǔn))[9]等文件,對(duì)鐵路信號(hào)軟件的單元測(cè)試需要根據(jù)軟件詳細(xì)設(shè)計(jì)規(guī)格說(shuō)明書、軟件需求規(guī)格說(shuō)明書、軟件測(cè)試規(guī)格說(shuō)明書等;選取適當(dāng)?shù)姆椒▽?duì)軟件的性能、質(zhì)量等方面進(jìn)行測(cè)試,以檢驗(yàn)該軟件是否符合軟件需求規(guī)格說(shuō)明書的需求,盡可能及早地發(fā)現(xiàn)軟件缺陷[10]。
鐵路信號(hào)軟件單元測(cè)試一般應(yīng)滿足以下要求:
(1)保證軟件的行為和性能滿足對(duì)應(yīng)測(cè)試規(guī)格的要求;
(2)流通方向及流量。主要流通方向?yàn)橹貞c主城區(qū),同時(shí)涵蓋周邊的涪陵、南川等區(qū)縣,仔豬外調(diào)還包括湖南、廣東等省市。
(2)軟件測(cè)試應(yīng)遵循先靜態(tài)再動(dòng)態(tài)的測(cè)試原則;
(3)測(cè)試用例應(yīng)包含輸入、輸出兩部分,能驗(yàn)證函數(shù)的正確性;
(4)測(cè)試用例使用等價(jià)類方式時(shí),應(yīng)包括有效等價(jià)類和無(wú)效等價(jià)類,最佳用例應(yīng)覆蓋所有有效等價(jià)類和無(wú)效等價(jià)類;
(5)測(cè)試通過(guò)準(zhǔn)則為:BUG數(shù)等于0;
(6)對(duì)于錯(cuò)誤較多的函數(shù),應(yīng)進(jìn)行多次測(cè)試;
(7)分支覆蓋率覆應(yīng)達(dá)到100%,對(duì)于部分高覆蓋率較難實(shí)現(xiàn)的函數(shù),可以使用邊界值和等價(jià)類或輸入分割測(cè)試,用較少測(cè)試用例實(shí)現(xiàn)足夠的覆蓋;
(8)組合條件覆蓋率應(yīng)達(dá)到100%,特殊情況下,組合覆蓋率不能達(dá)到100%,應(yīng)經(jīng)過(guò)人工驗(yàn)證代碼,并給出合理解釋和說(shuō)明。
本文選擇C++test軟件作為單元測(cè)試的工具,分為以下3步完成軟件的單元測(cè)試:
(1)基于C++test的軟件靜態(tài)分析;
(2)基于邊界值和等價(jià)類的黑盒測(cè)試;
(3)基于覆蓋率分析的白盒測(cè)試。
本文以鐵路信號(hào)軟件區(qū)間綜合監(jiān)控系統(tǒng)軟件為例,進(jìn)行單元測(cè)試研究。
采用工具及人工檢查相結(jié)合的方式,通過(guò)C++test進(jìn)行代碼質(zhì)量度量、控制流、數(shù)據(jù)流和編碼規(guī)則檢查,通過(guò)人工方式對(duì)編碼規(guī)范符合性、代碼與詳細(xì)設(shè)計(jì)一致性進(jìn)行分析,檢查過(guò)程如圖1所示。
結(jié)合C++test制定靜態(tài)分析檢查單作為檢查依據(jù),檢查單部分內(nèi)容見(jiàn)表1。根據(jù)檢查單確定檢查內(nèi)容是否可通過(guò)軟件檢查,如果不能,則采用人工走查方式進(jìn)行檢查;如果可以,則進(jìn)行軟件分析,采用C++test軟件,得到靜態(tài)分析報(bào)告,若報(bào)告無(wú)誤,則完成軟件分析部分,若有誤,則須人工核查錯(cuò)誤項(xiàng),確認(rèn)無(wú)誤后修改軟件靜態(tài)分析約束,抑制該檢查項(xiàng),并再次進(jìn)行軟件分析,直到得到正確分析報(bào)告。
表1 靜態(tài)分析檢查單
等價(jià)類劃分是把程序輸入數(shù)據(jù)均劃分為無(wú)數(shù)個(gè)等價(jià)類,從中選取具有代表性的作為測(cè)試用例數(shù)據(jù);而邊界值分析則是對(duì)等價(jià)類分析的補(bǔ)充,使得整個(gè)黑盒測(cè)試更具完整性。選取區(qū)間綜合監(jiān)控系統(tǒng)軟件中處理區(qū)間占用邏輯函數(shù)fn_ProcSectOcupLogic為例,分4步完成黑盒測(cè)試。
(1)明確函數(shù)代碼結(jié)構(gòu)中所包含的輸入、輸出變量,以及輸入輸出邊界值,劃分等價(jià)類。fn_ProcSectOcupLogic函數(shù)中包含區(qū)間當(dāng)前運(yùn)行方向、功能啟用標(biāo)志等9個(gè)輸入,在劃分等價(jià)類時(shí)需注意增加無(wú)效等價(jià)類,以保證測(cè)試數(shù)據(jù)更加充分。
例如,判斷區(qū)間運(yùn)行方向是正向還是反向,其測(cè)試數(shù)據(jù)應(yīng)取“0xaa”“0x55” “0x5a”,其中,“0xaa”表示區(qū)間正向,“0x55” 表示區(qū)間反向,這2種類型的數(shù)據(jù)即為有效等價(jià)類,而“0x5a”則是無(wú)法判斷區(qū)間方向的數(shù)據(jù),此為無(wú)效等價(jià)類數(shù)據(jù)。
(2)建立測(cè)試用例,在區(qū)間綜合監(jiān)控系統(tǒng)單元測(cè)試中,由于函數(shù)輸入輸出值較多,采用C++Test軟件自帶的測(cè)試用例生成功能,容易造成部分測(cè)試用例缺失,所以在軟件中建立外部數(shù)據(jù)源,手動(dòng)建立數(shù)據(jù)源測(cè)試用例。
(3)在新建的Excel表格中添加測(cè)試用例數(shù)據(jù)。同時(shí),對(duì)函數(shù)內(nèi)部調(diào)用的其他函數(shù)進(jìn)行打樁處理,生成樁函數(shù),替代原函數(shù)的功能,使得單元測(cè)試過(guò)程中能將被測(cè)功能與外部依賴隔離。
例如,在fn_ProcSectOcupLogic函數(shù)中調(diào)用了改方延遲函數(shù)fn_SOLGFDelayTime,此時(shí),建立樁函數(shù)fn_SOLGFDelayTime,使測(cè)試過(guò)程中直接返回樁函數(shù)值為外部數(shù)據(jù)源,如圖2所示,而無(wú)需調(diào)用原函數(shù),提高了測(cè)試效率。在進(jìn)行打樁處理時(shí)需要注意樁函數(shù)的返回值類型,內(nèi)部調(diào)用函數(shù)的返回值類型應(yīng)與其保持一致。
(4)根據(jù)程序的邏輯對(duì)外部數(shù)據(jù)源和樁函數(shù)輸入取值進(jìn)行修改,使其滿足測(cè)試需求,在樁函數(shù)與測(cè)試用例都無(wú)誤后,進(jìn)行測(cè)試。
進(jìn)行白盒測(cè)試,通過(guò)分析區(qū)間綜合監(jiān)控系統(tǒng)軟件模塊內(nèi)部的路徑執(zhí)行情況、邏輯分支,選用覆蓋率分析的方法,該軟件要求語(yǔ)句、判定、簡(jiǎn)單條件和修正條件判定(MC/DC)4種覆蓋率均達(dá)到100%。
基于以上黑盒測(cè)試,在C++Test軟件工具菜單中選擇“Parasoft”>“顯示圖示”>“覆蓋率”,根據(jù)覆蓋要求查看模塊的4種覆蓋率情況。對(duì)于覆蓋率不能達(dá)到100%要求的函數(shù),可點(diǎn)擊相應(yīng)的源碼,查看未覆蓋的原因,這樣不僅能有效地提高測(cè)試質(zhì)量,還能避免設(shè)計(jì)無(wú)效用例。如圖3所示,選擇MC/DC覆蓋后,紅色表示未覆蓋語(yǔ)句,并顯示未覆蓋條件。
將圖3語(yǔ)句描述為if((A)||((B)&& (C)))形式,A、B、C分別對(duì)應(yīng)3個(gè)條件語(yǔ)句,用0和1分別表示假和真。分析語(yǔ)句,其判定結(jié)果如表2所示。
要實(shí)現(xiàn)MC/DC覆蓋,其測(cè)試用例取值應(yīng)滿足每個(gè)條件都曾獨(dú)立地影響判斷結(jié)果至少1次,對(duì)于該語(yǔ)句,應(yīng)同時(shí)滿足以下2個(gè)條件:
表2 語(yǔ)句判定結(jié)果分析
(1)當(dāng)A對(duì)判斷結(jié)果起作用,則B&&C判定結(jié)果為假,即應(yīng)滿足A為1或0,B&&C保持為0。當(dāng)A為1且B&&C為0時(shí),包含3種可能,分別對(duì)應(yīng)表2中情況1、2、3,測(cè)試時(shí)任選1種添加測(cè)試用例;當(dāng)A為0且B&&C為0時(shí),同樣包含3種可能,對(duì)應(yīng)表2中情況5、6、7,測(cè)試時(shí)與前面同理。
(2)當(dāng)B&&C對(duì)判斷結(jié)果起作用,則A判定結(jié)果為假,即應(yīng)滿足B&&C為1或0,A保持為0。當(dāng)B&&C為1且A為0時(shí),對(duì)應(yīng)表2中情況8;當(dāng)B&&C為0且A為0時(shí),對(duì)應(yīng)表2中情況4。
由圖3中未覆蓋條件可知,其未滿足上述條件(2)中B&&C為1的情況,此時(shí),根據(jù)未覆蓋的值添加相應(yīng)的測(cè)試用例,即可滿足測(cè)試覆蓋率的要求,最終覆蓋結(jié)果如圖4所示,覆蓋率如圖5所示。
現(xiàn)階段,在軟件測(cè)試領(lǐng)域,單元測(cè)試工作已得到越來(lái)越多的重視,但常常由于項(xiàng)目時(shí)間短、經(jīng)費(fèi)不足等原因?qū)е萝浖卧獪y(cè)試工作擱置,所以明白軟件單元測(cè)試的重要性,使用有效的單元測(cè)試方法,對(duì)保證鐵路信號(hào)軟件的質(zhì)量具有重要的現(xiàn)實(shí)意義?;诖?,本文結(jié)合理論實(shí)踐,研究了鐵路信號(hào)軟件單元測(cè)試方法,并選取典型函數(shù)進(jìn)行分析,可有效發(fā)現(xiàn)軟件開(kāi)發(fā)過(guò)程中存在的缺陷,及時(shí)改正,從而保證鐵路信號(hào)軟件的穩(wěn)定性與可靠性。