任麗霞
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 610031)
鐵路運輸是我國重要的旅客和貨物運輸方式之一,車站聯(lián)鎖功能的提升也是現(xiàn)代鐵路運輸?shù)男枰?。計算機(jī)聯(lián)鎖系統(tǒng)[1]是否能夠完成聯(lián)鎖邏輯功能,最重要的工作之一就是對聯(lián)鎖軟件的聯(lián)鎖邏輯運算功能進(jìn)行測試,一方面測試聯(lián)鎖軟件的功能是否滿足軟件的規(guī)格需求說明書并發(fā)現(xiàn)錯誤,另一方面是為了發(fā)現(xiàn)至今為止還沒有被發(fā)現(xiàn)的錯誤。關(guān)于軟件的測試[2],通常有人工測試和自動測試兩種方式。人工測試需要人為地測試每一條測試用例,其中會涉及到大量重復(fù)的測試動作,耗時耗力,效率低下。而自動測試則用軟件代替了人工測試中重復(fù)的動作,效率得以極大地提高,因此,自動測試已經(jīng)成為現(xiàn)在主流的測試方式。該測試方式屬于功能測試,測試時不需要知道軟件內(nèi)部代碼的具體執(zhí)行情況,因此通常采用軟件測試方法中的黑盒測試方法。本文基于等價類劃分法和故障樹分析法編寫不用覆蓋率的測試用例,用python偽代碼實現(xiàn)了測試用例“進(jìn)路正常選出”。
為了驗證一個軟件是否完成了用戶需求的功能,并發(fā)現(xiàn)尚未發(fā)現(xiàn)的錯誤的測試方案,在一個軟件的開發(fā)過程中不可避免地需要對各個開發(fā)階段進(jìn)行不同作用的測試。
具體來說,測試的目的主要有以下3點[1]:
(1)測試是為了發(fā)現(xiàn)程序中的錯誤而執(zhí)行程序的過程;
(2)好的測試方案是極可能發(fā)現(xiàn)迄今為止尚未發(fā)現(xiàn)的錯誤的測試方案;
(3)成功的測試是發(fā)現(xiàn)了至今為止尚未發(fā)現(xiàn)的錯誤的測試。
為了盡可能地提高程序的正確性,更好地實現(xiàn)測試的目的,針對不同的實際情況也出現(xiàn)了不同的軟件測試方法。
1.2.1 黑盒測試
黑盒測試也叫做功能測試,關(guān)于這類測試,測試員不需要知道具體的程序代碼,而只需要輸入相關(guān)測試數(shù)據(jù)后收集對應(yīng)的輸出結(jié)果,通過實際輸出結(jié)果與預(yù)期輸出結(jié)果對比一致性來判斷軟件是否完成了某種功能。
黑盒測試主要在測試過程的后期使用,力求發(fā)現(xiàn)白盒測試不易發(fā)現(xiàn)的一些錯誤:功能錯誤、功能遺漏、界面錯誤、外部數(shù)據(jù)庫訪問錯誤或數(shù)據(jù)結(jié)構(gòu)錯誤以及性能錯誤等。常見的幾種黑盒測試技術(shù)為:等價劃分法、邊界值分析法、錯誤推測法。
1.2.2 等價類劃分
等價類劃分后的數(shù)據(jù)類又分為有效等價類和無效等價類,即輸入有效和輸入無效的等價類型。等價劃分法是一種黑盒測試技術(shù),可以類比于數(shù)學(xué)中的合并同類項。
例如:判斷一個程序是否能實現(xiàn)“輸入一個3位正整數(shù)時相應(yīng)的輸出也為一個3位正整數(shù)”功能??梢园选?[1-9][1-9]”“00[1-9]”“[1-9][1-9][1-9]”分別看作3類數(shù)據(jù),這時,我們只需要在每一類數(shù)據(jù)中拿出一個數(shù)據(jù)來作為輸入數(shù)據(jù)進(jìn)行測試就行了,即這3種類型的數(shù)據(jù)為有效等價類。而“0000”這種格式的數(shù)據(jù)明顯不屬于上述3種類型的數(shù)據(jù),因此為一種無效等價類。
綜上所述,等價劃分法的重點和難點在于等價類的劃分,即選取出有效的具有代表性的數(shù)據(jù)。
1.2.3 故障樹分析
安全性測試中常用的一種方法就是故障樹分析(FTA,F(xiàn)ault Tree Analysis)。故障樹分析通常分3步進(jìn)行:確定頂事件、建造故障樹、故障樹的定性和定量分析。
(2)測試軟件的測試用例數(shù)據(jù)庫向計算機(jī)聯(lián)鎖軟件輸入控制命令,計算機(jī)聯(lián)鎖軟件輸出結(jié)果并傳入測試軟件的運行結(jié)果記錄數(shù)據(jù)庫;測試軟件分析運行結(jié)果是否與期望結(jié)果一致。如果一致,則測試下一個操作命令;如果不一致,則反饋重新生成測試數(shù)據(jù)并測試該操作命令,3次都不一致則重新排入測試命令序列等待測試;
(3)測試軟件最后生成記錄文檔,顯示測試功能的結(jié)果。
聯(lián)鎖軟件的黑盒測試通常在一個測試平臺完成,這個測試平臺由測試軟件、被測聯(lián)鎖軟件以及車站信號設(shè)備仿真系統(tǒng)3部分構(gòu)成,測試框圖[5],如圖1所示。
圖1 聯(lián)鎖軟件黑盒自動測試框圖
在測試平臺中,自動測試過程如下。
(1)測試軟件發(fā)送“改變狀態(tài)”的命令到車站設(shè)備仿真系統(tǒng)中,通過改變3大信號設(shè)備的狀態(tài)來模擬實際現(xiàn)場可能遇到的各種聯(lián)鎖情況;
(2)仿真系統(tǒng)中各設(shè)備接受命令后改變狀態(tài),并將改變后的狀態(tài)發(fā)送至聯(lián)鎖軟件和測試軟件;
(3)測試軟件將模擬的操作命令發(fā)送至聯(lián)鎖軟件,聯(lián)鎖軟件根據(jù)操作命令生成驅(qū)動命令;
(4)聯(lián)鎖軟件用驅(qū)動命令來使仿真系統(tǒng)完成模擬操作,同時,聯(lián)鎖軟件將輸出的驅(qū)動命令發(fā)送給測試軟件,測試軟件根據(jù)輸入和輸出判定該操作命令的軟件功能是否完成;
墨西哥民族和文化的本質(zhì)便具有混血性(mestizo)(陶家俊,2003:4)這種混血性的文化身份是帝國主義殖民擴(kuò)張和全球化的產(chǎn)物,體現(xiàn)了現(xiàn)代、后現(xiàn)代時期異質(zhì)文化間的張力。(61)
(5)測試重新開始1的過程,進(jìn)入到下一輪測試。
測試軟件[2]由測試用例數(shù)據(jù)庫、運行結(jié)果記錄數(shù)據(jù)庫、分析判斷模塊、網(wǎng)絡(luò)通信模塊以及設(shè)置設(shè)備狀態(tài)模塊5部分構(gòu)成。
測試開始時,測試用例數(shù)據(jù)庫向聯(lián)鎖軟件發(fā)送模擬操作命令,同時將該條測試用例發(fā)送至運行結(jié)果記錄數(shù)據(jù)庫中。聯(lián)鎖軟件完成測試功能后輸出驅(qū)動命令后將被記錄在運行結(jié)果記錄數(shù)據(jù)庫中。此時,分析判斷模塊將對比運行結(jié)果和測試用例中期望的輸出結(jié)果,判斷出該條測試用例的期望結(jié)果和實際結(jié)果是否一致。若一致,則刪除運行結(jié)果記錄數(shù)據(jù)庫中的該條測試;若不一致,返回到測試開始重新進(jìn)行測試,3次測試仍然不一致后將停止該條測試用例的測試,并將每一次的測試結(jié)果和仿真系統(tǒng)的狀態(tài)信息記錄在運行結(jié)果記錄數(shù)據(jù)庫中。
若涉及到需要改變仿真系統(tǒng)信號設(shè)備狀態(tài)的測試時,則需要通過測試軟件的設(shè)置設(shè)備狀態(tài)模塊,也就是模擬故障情況下的測試時需要用到設(shè)置設(shè)備狀態(tài)模塊。
車站信號設(shè)備平面布置圖是根據(jù)站場線路圖繪制的,能清楚地反映站場信號設(shè)備的位置。聯(lián)鎖表是說明站場中信號設(shè)備聯(lián)鎖關(guān)系的圖表。它們都是測試平臺中車站信號設(shè)備仿真系統(tǒng)仿真的依據(jù)和聯(lián)鎖軟件實現(xiàn)聯(lián)鎖功能的基礎(chǔ)。
圖2 舉例車站信號設(shè)備平面布置圖
表1 聯(lián)鎖表
依據(jù)的車站信號設(shè)備平面布置圖和聯(lián)鎖表分別如圖2和表1所示。其中,聯(lián)鎖表只截取了列車進(jìn)路選出測試用例編寫時涉及到的相關(guān)進(jìn)路。
下面對“列車進(jìn)路選出”這一功能進(jìn)行等價類劃分。根據(jù)傳統(tǒng)的計算機(jī)聯(lián)鎖軟件功能測試項目可知,針對“列車進(jìn)路選出”這一功能有正常選出進(jìn)路和故障下選出進(jìn)路兩大測試項目,如表2所示??梢杂貌紶栔怠癟rue”和“False”來判斷設(shè)備狀態(tài)。
表2 計算機(jī)聯(lián)鎖“進(jìn)路選出”功能測試項
根據(jù)測試用例分級要求和已有的相關(guān)經(jīng)驗,選取“進(jìn)路選出時發(fā)生危險性失效”作為故障樹的頂事件,并建造故障樹,如圖3所示。
其次,需要進(jìn)行故障樹的定性分析,以確定最小割集,也就是可能引發(fā)頂事件的故障組合方式。
圖3 進(jìn)路選出時發(fā)生危險性失效故障樹框圖
針對“進(jìn)路選出時發(fā)生危險性失效”故障樹,這里采用下行法進(jìn)行分析。從T1開始為步驟1,這里的G1為一個“與門”,根據(jù)下行法的規(guī)則,這時應(yīng)該增加割集的階數(shù),于是有步驟1的{x1,M1}。M1下面是G2,即從步驟1到步驟2遇到G2這個“或門”,根據(jù)下行法的規(guī)則,這時應(yīng)該增加割集的個數(shù),又因為M1下面是x2與x3,所以豎向展開得割集。至此,故障樹已到達(dá)所有的底事件,故障樹分析完成。所以,該故障樹分析分為了2步,共得2個割集{x1,x2},{x1,x3}。又因為該割集已經(jīng)無法再簡化,因此得到的全部最小割集為{x1,x2},{x1,x3}。
根據(jù)測試用例的編號,測試軟件將自動生成測試序列,然后將每一條測試用例都至少進(jìn)行一次測試。測試開始后,輸入測試用例中的輸入數(shù)據(jù),此時,聯(lián)鎖軟件會依次檢查仿真系統(tǒng)中信號設(shè)備的聯(lián)鎖條件。若進(jìn)路中軌道區(qū)段和超限絕緣區(qū)段空閑、敵對進(jìn)路未建立、道岔與進(jìn)路要求的位置一致,則是正常情況,即完成該條測試,并等待下一條測試操作指令;若以上聯(lián)鎖條件中有不正常情況,測試將轉(zhuǎn)入測試開始階段重新測試該條測試用例,重復(fù)3次測試都不正常時也將轉(zhuǎn)入下一條測試操作指令,并把該測試結(jié)果記錄在運行結(jié)果記錄數(shù)據(jù)庫中,以便對所有測試發(fā)生的故障情況進(jìn)行匯總。列車進(jìn)路選出的測試流程,如圖4所示。
在聯(lián)鎖軟件的黑盒測試平臺上使用python語言[6],可以實現(xiàn)測試用例的重用、測試動作的自動執(zhí)行以及測試結(jié)果的報表輸出。用python語言實現(xiàn)測試用例是一種已經(jīng)運用在實際測試中的方法。針對測試用例“正常選出進(jìn)路”編寫的python偽代碼。
圖4 列車進(jìn)路選出的測試流程圖
輸入始終端按鈕:
檢查敵對信號是否開放:
檢查超限區(qū)段是否空閑:
檢查道岔是否與進(jìn)路選出要求的位置一致:
當(dāng)檢查的聯(lián)鎖條件與進(jìn)路要求一致時,變量x=1,否則x=0。并將x做and運算。由and運算的規(guī)則可知,只有當(dāng)聯(lián)鎖條件判斷后x都等于1時,最終被x賦值的end才為1,即輸出“進(jìn)路選出”。否則,若聯(lián)鎖條件判斷后有至少一項使得x=0,最終被x賦值的end則為0,即輸出“操作失敗”。
(1)聯(lián)鎖軟件代替了繼電聯(lián)鎖中繼電器的動作,避免了硬件損傷帶來的錯誤,使得聯(lián)鎖邏輯功能具有更高的可靠性、安全性和可用性,并使得設(shè)計、施工及其維護(hù)變得簡便易操作。
(2)聯(lián)鎖軟件在測試平臺下的黑盒測試過程,并根據(jù)聯(lián)鎖軟件黑盒測試[5]的測試用例覆蓋率重點分析了不同等級測試用例的編寫方法。本文選取了“列車進(jìn)路選出”這一聯(lián)鎖邏輯功能作為舉例,從測試環(huán)境、測試用例的編寫和測試流程說明3個方面進(jìn)行了分析,重點在對該功能測試的測試用例的編寫過程介紹。
(3)等價類劃分法只做了簡單的測試說明,采用故障樹分析法編寫了4級測試用例。而且論文只是用python偽代碼實現(xiàn)了一個測試用例。
選用某一種程序設(shè)計語言來編寫代碼,用代碼來模擬人工的輸入和檢查,實現(xiàn)自動測試。這種方式不但提高了效率,也在很大程度上提高了測試的準(zhǔn)確度,因而能更好地保障聯(lián)鎖軟件的安全。
[1]張海藩. 軟件工程導(dǎo)論[M]. 北京:清華大學(xué)出版社,2011:150.
[2]石艷敏. 一種高效的計算機(jī)聯(lián)鎖軟件測試方法[J]. 鐵路計算機(jī)應(yīng)用,2013,22(12):50-54..
[3]中華人民共和國鐵道部.計算機(jī)聯(lián)鎖技術(shù)條件:TB/T03027-2002[S].北京:中國鐵道出版社,2002.
[4]王 東. 軌道交通信號系統(tǒng)仿真測試與驗證技術(shù)研究與應(yīng)用[D]. 杭州:浙江大學(xué),2014.
[5]張 偉,高 凡. 黑盒測試技術(shù)在城市軌道交通信號系統(tǒng)監(jiān)理驗收中的研究與應(yīng)用[J]. 鐵路計算機(jī)應(yīng)用,2012,21(12):56-59.
[6]劉小旭, 岳東河. 基于Python的計算機(jī)聯(lián)鎖系統(tǒng)自動測試平臺[J]. 價值工程,2010(27):171.