曾舒宇,楊 揚(yáng),王 玥,曹阿俊
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 611756)
鐵路計算機(jī)聯(lián)鎖系統(tǒng)是負(fù)責(zé)行車進(jìn)路建立鐵路行車核心控制設(shè)備,具有較高可靠性和故障-安全性要求的實時控制系統(tǒng)[1]。鑒于故障-安全原則對于計算機(jī)聯(lián)鎖系統(tǒng)的特殊性和重要性,系統(tǒng)自身的全面測試就必不可少。目前,國內(nèi)聯(lián)鎖軟件測試量較大,存在大量的重復(fù)性操作,測試人員知識水平、測試經(jīng)驗參差不齊,難以保證測試的完備性。
文獻(xiàn)[2]根據(jù)高鐵列控接口規(guī)范提出了一種計算機(jī)聯(lián)鎖與列控中心(TCC,Train Control Center)接口自動化測試的方式;文獻(xiàn)[3]基于Prover iLock 形式化工具提出了一種形式化自動測試的方法;文獻(xiàn)[4]以灰盒測試為思想,設(shè)計了一種基于腳本驅(qū)動的自動測試系統(tǒng);文獻(xiàn)[5]提出了一種基于有色Petri 網(wǎng)的聯(lián)鎖軟件測試用例生成方法;文獻(xiàn)[6]設(shè)計了一種計算機(jī)聯(lián)鎖系統(tǒng)測試平臺,可輔助測試用例開發(fā)和執(zhí)行。以上研究雖然都能有效完成計算機(jī)聯(lián)鎖測試或計算機(jī)聯(lián)鎖用例生成,但是其測試大多是基于接口進(jìn)行的測試,對于第三方測試來說不了解計算機(jī)聯(lián)鎖內(nèi)部代碼,仍存在測試難度大的問題。同時未能將測試用例生成和測試用例執(zhí)行兩個功能進(jìn)行集成,仍存在不少操作需要人工介入。
為更好地解決以上問題,本文設(shè)計了一種將站場數(shù)據(jù)獲取、聯(lián)鎖表生成、測試用例生成和測試用例執(zhí)行功能集成的計算機(jī)聯(lián)鎖自動測試系統(tǒng)。該計算機(jī)聯(lián)鎖自動測試系統(tǒng)采用黑盒測試的思想,基于OpenCV 庫[7]獲取站場數(shù)據(jù),無須了解計算機(jī)聯(lián)鎖軟件內(nèi)部代碼即可獲取站場數(shù)據(jù)并實現(xiàn)測試用例自動執(zhí)行進(jìn)而完成對計算機(jī)聯(lián)鎖系統(tǒng)的基本功能測試。本文從系統(tǒng)結(jié)構(gòu)、系統(tǒng)核心功能實現(xiàn)和系統(tǒng)測試結(jié)果幾個方面介紹該系統(tǒng)的設(shè)計實現(xiàn)過程與測試結(jié)果。
計算機(jī)聯(lián)鎖系統(tǒng)在信號操作員操作下實現(xiàn)站內(nèi)道岔、信號機(jī)和軌道電路之間聯(lián)鎖控制,是鐵路安全高效行車不可缺少的保障裝備。其系統(tǒng)采用分層式結(jié)構(gòu),分為人機(jī)對話層、聯(lián)鎖運算層和執(zhí)行表示層[1],計算機(jī)聯(lián)鎖系統(tǒng)結(jié)構(gòu),如圖1 所示。
圖1 計算機(jī)聯(lián)鎖系統(tǒng)結(jié)構(gòu)
(1)人機(jī)對話層。由上位機(jī)和電務(wù)維修機(jī)構(gòu)成,上位機(jī)負(fù)責(zé)接收車站值班員下達(dá)的進(jìn)路操作命令,并將操作命令傳送給聯(lián)鎖運算層,同時接收聯(lián)鎖運算層輸出的反映信號設(shè)備工作狀態(tài)和行車情況的信息并進(jìn)行實時顯示。
(2)聯(lián)鎖運算層。由聯(lián)鎖機(jī)軟件組成,聯(lián)鎖機(jī)接收來自上位機(jī)下達(dá)的操作命令,依據(jù)從執(zhí)行表示層接收到的反映室外信號機(jī)、道岔和軌道電路實時狀態(tài)的信息,并結(jié)合內(nèi)部的中間信息,進(jìn)行聯(lián)鎖邏輯運算,根據(jù)運算結(jié)果產(chǎn)生相應(yīng)的輸出信息。
(3)執(zhí)行表示層。為聯(lián)鎖運算層和室外設(shè)備層的中間層,在二者之間起信息交互、硬件電路的轉(zhuǎn)換等作用,同時在硬件上進(jìn)行隔離,以保證室內(nèi)設(shè)備的安全性[1]。
計算機(jī)聯(lián)鎖自動測試系統(tǒng)結(jié)構(gòu),如圖2 所示。整個系統(tǒng)由測試用例生成、測試用例執(zhí)行2 個客戶端組成。
圖2 計算機(jī)聯(lián)鎖自動測試系統(tǒng)結(jié)構(gòu)
(1)測試用例生成客戶端。負(fù)責(zé)接收測試用例執(zhí)行客戶端發(fā)來的開始測試前和測試過程中截取的計算機(jī)聯(lián)鎖上位機(jī)界面圖像,對開始測試前上位機(jī)界面圖像采用OpenCV 庫[7]提取站場數(shù)據(jù),依據(jù)站場數(shù)據(jù)生成聯(lián)鎖表,通過聯(lián)鎖表和鐵路車站計算機(jī)聯(lián)鎖軟件功能測試大綱[8](簡稱:測試大綱)生成測試用例,測試過程中計算機(jī)聯(lián)鎖上位機(jī)界面圖像進(jìn)行分析獲取測試結(jié)果并生成測試報告。
(2)測試用例執(zhí)行客戶端。①應(yīng)用AutoItX[9]自動測試組件開發(fā)不同類型的測試腳本;②接收測試用例生成客戶端下達(dá)的測試用例,對測試用例進(jìn)行解析獲得測試用例類型和相關(guān)輸入?yún)?shù),調(diào)用對應(yīng)類型的測試腳本,通過執(zhí)行測試腳本中的操作指令模擬人工對計算機(jī)聯(lián)鎖系統(tǒng)上位機(jī)界面操作進(jìn)而完成計算機(jī)聯(lián)鎖的功能測試;③對測試過程中的計算機(jī)聯(lián)鎖上位機(jī)界面進(jìn)行截圖記錄,以便測試用例生成客戶端獲取測試結(jié)果并生成測試報告。
(3)測試用例生成客戶端與測試用例執(zhí)行客戶端之間采用Socket 接口實現(xiàn)TCP/IP 協(xié)議通信,完成二者之間數(shù)據(jù)傳輸。測試用例執(zhí)行客戶端通過截圖獲取計算機(jī)聯(lián)鎖系統(tǒng)上位機(jī)界面;執(zhí)行測試腳本模擬人工對上位機(jī)界面操作,進(jìn)而實現(xiàn)自動選排進(jìn)路、改變道岔位置、改變區(qū)段占用情況等功能測試。
基于計算機(jī)聯(lián)鎖自動測試系統(tǒng)結(jié)構(gòu),測試用例生成客戶端和測試用例執(zhí)行客戶端分別要實現(xiàn)不同的功能,功能模塊如圖3 所示。
圖3 計算機(jī)聯(lián)鎖自動測試系統(tǒng)功能模塊
2.2.1 測試用例生成客戶端
(1)站場數(shù)據(jù)獲取模塊
完成站場信號設(shè)備(信號機(jī)、道岔、軌道區(qū)段)和功能按鈕(總?cè)∠?、總?cè)私獍粹o等)數(shù)據(jù)的提取。站場數(shù)據(jù)獲取由站場圖獲取、站場數(shù)據(jù)提取和人工校正數(shù)據(jù)3 個步驟組成。①通過測試用例生成客戶端對計算機(jī)聯(lián)鎖上位機(jī)界面截圖獲取到站場圖;②應(yīng)用OpenCV 庫[7]對其進(jìn)行邏輯處理提取站場數(shù)據(jù);③由人工介入,對提取到的站場數(shù)據(jù)進(jìn)行修改校正,以保證站場數(shù)據(jù)的準(zhǔn)確性。
(2)測試用例生成模塊
按照測試大綱[8]的要求生成進(jìn)路、進(jìn)路鎖閉與解鎖、信號機(jī)和道岔等測試用例。測試用例生成由站場拓?fù)鋱D生成、站場聯(lián)鎖表生成和測試用例生成組成。①應(yīng)用拓?fù)渖伤惴╗10]生成能表示站場信號設(shè)備位置關(guān)系和邏輯關(guān)系的站場拓?fù)鋱D;②采用進(jìn)路搜索算法遍歷拓?fù)鋱D,生成站場聯(lián)鎖表;③依據(jù)聯(lián)鎖表中的進(jìn)路信息和測試大綱要求的功能測試生成不同類型的測試用例。測試用例內(nèi)容包括前提條件、測試步驟及預(yù)期結(jié)果等。此外,在開始測試后,將生成的測試用例下達(dá)給測試用例執(zhí)行客戶端。
(3)測試結(jié)果分析模塊
對測試過程中計算機(jī)聯(lián)鎖上位機(jī)界面圖像進(jìn)行分析,判定測試結(jié)果是否符合預(yù)期結(jié)果,并生成測試報告,以便工作人員查看。該模塊由信號設(shè)備狀態(tài)變更數(shù)據(jù)獲取、預(yù)期結(jié)果比對、輸出測試報告組成。①接收測試用例客戶端記錄的測試結(jié)果(測試過程中計算機(jī)聯(lián)鎖上位機(jī)界面的圖片集合),采用OpenCV 庫[7]對其邏輯分析,提取預(yù)期結(jié)果中的信號設(shè)備和其他狀態(tài)發(fā)生變化的信號設(shè)備的狀態(tài)變更數(shù)據(jù);②將提取到的信號設(shè)備狀態(tài)變更數(shù)據(jù)與預(yù)期結(jié)果比對,判斷測試用例是否通過;③將所有測試用例的判定結(jié)果匯總成報告并寫入文件進(jìn)行存儲。
2.2.2 測試用例執(zhí)行客戶端
(1)上位機(jī)界面獲取模塊
負(fù)責(zé)網(wǎng)絡(luò)通信的初始化,同時對測試腳本執(zhí)行前和執(zhí)行中的計算機(jī)聯(lián)鎖上位機(jī)界面通過截圖方式進(jìn)行記錄。測試腳本執(zhí)行前和執(zhí)行中的截取的上位機(jī)界面圖像分別用于測試執(zhí)行客戶端的站場數(shù)據(jù)提取和測試結(jié)果分析。
(2)測試腳本生成模塊
實現(xiàn)選排進(jìn)路、道岔操作和軌道區(qū)段操作等類型的測試腳本的生成。測試腳本生成模塊由測試腳本開發(fā)、腳本合并與聯(lián)調(diào)、異常處理與恢復(fù)3 個過程構(gòu)成。①對測試大綱中的測試用例類型進(jìn)行分析,獲取測試用例中的輸入數(shù)據(jù)和測試步驟,開發(fā)對應(yīng)類型的測試腳本;②對輸入數(shù)據(jù)一致的測試腳本進(jìn)行合并,同時對有先后順序的測試腳本進(jìn)行聯(lián)調(diào)以提高測試效率;③對測試過程中可能出現(xiàn)的異常情況進(jìn)行分析并編寫異常處理和恢復(fù)方法。
(3)測試腳本執(zhí)行模塊
執(zhí)行測試腳本中操作指令,對計算機(jī)聯(lián)鎖系統(tǒng)上位機(jī)界面進(jìn)行人工操作實現(xiàn)自動測試,同時記錄測試結(jié)果以便測試用例生成模塊生成測試報告。測試腳本執(zhí)行模塊由測試用例解析、操作指令執(zhí)行和測試結(jié)果記錄3 個過程構(gòu)成。①對生成的具體的測試用例進(jìn)行解析獲得相關(guān)的輸入?yún)?shù),調(diào)用相對應(yīng)類型的測試腳本函數(shù)并傳入相關(guān)輸入?yún)?shù),如位置坐標(biāo)、按鈕坐標(biāo)等參數(shù);②執(zhí)行測試腳本中的操作指令以達(dá)到自動測試的目的;③在測試過程中調(diào)用上位機(jī)界面獲取模塊對上位機(jī)界面進(jìn)行截圖記錄并存儲為圖像進(jìn)而發(fā)送給測試用例生成客戶端,以便分析測試結(jié)果并生成測試報告。
計算機(jī)聯(lián)鎖系統(tǒng)上位機(jī)界面是依照車站計算機(jī)聯(lián)鎖操作顯示技術(shù)規(guī)范[11](簡稱:顯示規(guī)范)而繪制的,不同的鐵路站場在計算機(jī)聯(lián)鎖上位機(jī)中的顯示遵循的是同一顯示規(guī)范,因此不同鐵路站場的信號設(shè)備在聯(lián)鎖上位機(jī)中的顯示具有相同的特征。OpenCV 是一個計算機(jī)視覺庫,實現(xiàn)了圖像處理和計算機(jī)視覺的很多通用算法,并且支持跨平臺,同時支持C#、C++、Python 等編程語言[7]。本文采用OpenCV 庫[7]對被測計算機(jī)聯(lián)鎖系統(tǒng)上位機(jī)界面進(jìn)行圖像處理,進(jìn)而提取車站信號設(shè)備的數(shù)據(jù)。站場數(shù)據(jù)獲取流程,如圖4 所示。
圖4 站場數(shù)據(jù)獲取流程
對某計算機(jī)聯(lián)鎖系統(tǒng)上位機(jī)界面進(jìn)行圖像處理和邏輯分析后提取得到的列車信號機(jī)數(shù)據(jù)如圖5所示。從圖5 可知,通過圖像處理和邏輯分析可以得到列車信號機(jī)名稱、坐標(biāo)、高矮柱和進(jìn)出站類型等信息。同理,對于道岔,可以提取到道岔坐標(biāo)、道岔編號、道岔類型等數(shù)據(jù);對于無岔區(qū)段和股道,可以提取到其坐標(biāo)、名稱和類型等數(shù)據(jù)。
圖5 列車信號機(jī)數(shù)據(jù)提取結(jié)果
測試用例的生成是在聯(lián)鎖表的基礎(chǔ)上實現(xiàn)的,而聯(lián)鎖表基于站場拓?fù)鋱D采用進(jìn)路搜索算法生成。因此要生成測試用例,站場拓?fù)鋱D至關(guān)重要。通過人工輸入站場拓?fù)鋱D數(shù)據(jù)費時費力,所以在已經(jīng)提取到站場數(shù)據(jù)的基礎(chǔ)上,提出一種基于站場設(shè)備坐標(biāo)的站場拓?fù)鋱D生成算法,該算法具體過程如。
(1)確定道岔與道岔之間的連接關(guān)系。對所有道岔進(jìn)行遍歷,搜索遍歷道岔岔尖、定位、反位x坐標(biāo)距離20 像素點內(nèi),y坐標(biāo)距離10 像素點內(nèi)的道岔,若存在,則該道岔為遍歷道岔的相連道岔。將相連道岔設(shè)置為遍歷道岔對應(yīng)位置(岔尖、定位、反位)的連接設(shè)備,同時將遍歷道岔設(shè)置為相連道岔對應(yīng)位置的連接設(shè)備。
(2)確定區(qū)段與道岔的連接關(guān)系。所謂區(qū)段是指無岔區(qū)段和股道。遍歷所有區(qū)段,搜索與其左側(cè)和右側(cè)相連(道岔岔尖、定位、反位x、y坐標(biāo)距離左側(cè)或右側(cè)均不超過10 像素點則認(rèn)為相連)的道岔設(shè)備。若與區(qū)段相連道岔存在,則將道岔設(shè)置為區(qū)段的左側(cè)或右側(cè)設(shè)備,同時將區(qū)段設(shè)置為道岔對應(yīng)位置的連接設(shè)備。
(3)確定區(qū)段與區(qū)段的連接關(guān)系。對于站場中離去和接近區(qū)段需要處理區(qū)段與區(qū)段的連接關(guān)系。遍歷所有區(qū)段,搜索與其左側(cè)或右側(cè)x、y坐標(biāo)距離不超過10 像素點的區(qū)段,將搜索到的區(qū)段設(shè)置為該區(qū)段的左側(cè)或右側(cè)連接設(shè)備。
(4)確定信號機(jī)與道岔和區(qū)段的連接關(guān)系。遍歷所有道岔和區(qū)段,搜索道岔岔尖、定位、反位附近、區(qū)段左側(cè)和右側(cè)附近的信號機(jī),若搜索到2 個信號機(jī),則認(rèn)為信號機(jī)是并置信號機(jī)。將信號機(jī)插入到道岔及與道岔相連設(shè)備之間或者是區(qū)段和與區(qū)段相連設(shè)備之間。
測試用例的執(zhí)行可分為人工測試和自動測試。測試大綱[8]涉及到的測試用例種類較多,為提高測試效率,本系統(tǒng)采用自動測試。為實現(xiàn)自動測試,本系統(tǒng)基于AutoItX 庫采用c#高級程序語言編寫與測試用例對應(yīng)類型的測試腳本。AutoIt[9]是用來在Windows GUI(用戶界面)中進(jìn)行自動操作的軟件,通過它可以組合使用模擬鍵擊、鼠標(biāo)移動和窗口/控件操作等來實現(xiàn)自動化任務(wù)。而AutoItX 是AutoIt 的一個標(biāo)準(zhǔn)DLL 庫,可以加入一些AutoIt 獨有的特性到其他的腳本語言或程序設(shè)計語言中而實現(xiàn)自動化任務(wù)[9]。
測試用例類型分為進(jìn)路、進(jìn)路鎖閉與解鎖、信號機(jī)、道岔等。其中進(jìn)路鎖閉類型的測試用例的測試腳本內(nèi)容,如圖6 所示。
圖6 進(jìn)路鎖閉類型測試腳本內(nèi)容
本文設(shè)計的計算機(jī)聯(lián)鎖自動測試系統(tǒng)工作流程,如圖7 所示。
圖7 計算機(jī)聯(lián)鎖自動測試系統(tǒng)工作流程
(1)啟動測試用例生成客戶端和測試用例執(zhí)行客戶端,并完成網(wǎng)絡(luò)通信初始化實現(xiàn)二者的網(wǎng)絡(luò)連接。
(2)接收測試用例執(zhí)行客戶端截取的上位機(jī)界面,并判斷測試用例是否已經(jīng)生成,若測試案例未生成,對上位機(jī)界面進(jìn)行圖像處理,提取站場數(shù)據(jù)并生成聯(lián)鎖表,再生成測試用例,下達(dá)給測試用例執(zhí)行客戶端進(jìn)行解析,調(diào)用對應(yīng)類型的測試腳本并自動執(zhí)行,截取上位機(jī)界面發(fā)送給測試用例生成客戶端對上位機(jī)界面圖像處理提取信號設(shè)備狀態(tài)信息,并與預(yù)期結(jié)果比對,記錄測試結(jié)果。
(3)判斷是否所有的測試用例均下發(fā),若均下發(fā)則輸出測試報告,否則繼續(xù)下發(fā)測試用例給測試用例執(zhí)行客戶端進(jìn)行測試用例解析與測試腳本執(zhí)行。
本系統(tǒng)以某計算機(jī)聯(lián)鎖系統(tǒng)作為被測對象,對其標(biāo)準(zhǔn)站下行咽喉列車進(jìn)路進(jìn)行進(jìn)路鎖閉功能測試。測試過程中測試用例生成客戶端界面,如圖8 所示。
圖8 測試過程中測試用例生成客戶端界面
本次測試對生成的測試用例中的32 條列車進(jìn)路測試了進(jìn)路的辦理與取消功能。人工和系統(tǒng)分別測試了3 次,通過測試用例30 條,不通過2 條。由于進(jìn)路鎖閉過程中道岔轉(zhuǎn)換過程花費時間較長,且這部分時間無法降低,導(dǎo)致自動測試平均一條進(jìn)路用時需要近8 s,測試耗時,如表1 所示。由此可見,系統(tǒng)能有效地提高測試效率,降低對測試人員技術(shù)的要求。
表1 測試耗時
本文設(shè)計的計算機(jī)聯(lián)鎖自動測試系統(tǒng)實現(xiàn)了站場數(shù)據(jù)的獲取、聯(lián)鎖表的生成、測試用例的生成和測試用例的執(zhí)行功能;能夠?qū)崿F(xiàn)自動測試設(shè)計、測試執(zhí)行和測試結(jié)果分析整個自動測試過程。
測試結(jié)果表明,該系統(tǒng)基于OpenCV 庫[7]獲取站場數(shù)據(jù),可以解決第三方獲取站場數(shù)據(jù)困難的問題;能實現(xiàn)測試用例自動生成執(zhí)行一體化,減少了人工操作步驟,降低對測試人員的技術(shù)要求;能對按照顯示規(guī)范設(shè)計[11]的計算機(jī)聯(lián)鎖系統(tǒng)進(jìn)行測試,適用性強(qiáng);能降低測試用例的執(zhí)行時間,比人工測試用時少25.4%,提高了測試效率。