李冠軍,楊清祥,白鴻鈞
(河南思維軌道交通技術研究院有限公司,鄭州 450001)
列車運行監控裝置(LKJ)車載控制軟件涉及列車行車安全,因此在每次軟件變更后都必須進行嚴格測試,以保證軟件控制的安全性、可靠性[1]。在LKJ軟件升級過程中,軟件測試工作一直占據著很大的比重。雖然目前已逐漸使用LKJ軟件自動化仿真測試系統代替部分人工測試的工作,但其測試用例的編輯和維護仍需人工手動完成,需耗費較多的人力,且效率較低。因此,為了盡可能的提高效率及自動化程度,充分發揮LKJ軟件自動化仿真測試系統的優勢,除對測試腳本的編寫方法進行優化外,亟待有更安全、可靠的LKJ軟件測試用例自動生成解決方案。
由于LKJ軟件控制功能復雜且牽涉外部接口參數較多,在編寫LKJ軟件測試用例時,需要根據軟件控制功能將不同的控制參數和外部接口等進行排列組合來形成不同的測試用例。測試LKJ軟件的一個控制功能往往需要幾十條甚至上百條LKJ軟件測試用例,才能實現對控制功能的完整覆蓋。目前LKJ軟件自動化仿真測試系統提供的LKJ軟件測試用例編寫方式有腳本語言編輯、人工錄制測試用例和圖形化編輯3 種方式。
(1)腳本語言編輯方式是指采用測試腳本語言編輯生成自動測試腳本[2]。該方法對測試用例編寫人員的業務水平和腳本語言運用水平要求較高,且編輯工作量較大,一般適用于功能相對簡單的壓力測試和重復性的性能測試等方面。對于邏輯復雜的軟件功能測試,由于測試腳本的編輯及維護工作量非常巨大,使用該方式無法體現自動化測試的優越性。
(2)人工錄制測試用例方式是指在人工操作LKJ設備時,系統對設備操作過程、LKJ輸出關鍵信息和LKJ控制結果等信息進行詳實記錄,并從一次或多次人工操作記錄中提煉信息,自動生成LKJ軟件測試用例初稿,再由人工對初稿進行修改。該方式以人工操作為范例,由于個人操作習慣及業務水平不同,可能會輸出與預期不符的結果,導致測試用例偏離實際,且生成的測試用例腳本維護工作量大,只適用于特殊場景的重復測試。
(3)圖形化編輯方式僅需要通過拖動圖形完成一系列組合即可編輯測試用例,對測試用例編輯人員的腳本語言運用水平沒有太高要求。此方法可顯著提高LKJ軟件測試用例的編輯效率,簡化LKJ軟件測試用例維護工作。但由于LKJ軟件測試用例整體數量龐大,用例編輯及維護仍需要大量人力,不能發揮LKJ軟件自動化仿真測試系統的優點。
測試用例的自動生成技術是實現LKJ軟件的自動化測試的關鍵一環。目前測試用例自動生成的方法,幾乎都離不開選取接口參數[3]和創建測試模型[4]。通常采用的測試模型有有限狀態機(FSM,Finite State Machine)和擴展有限狀態機(EFSM ,Extended Finite State Machine)[5]等。在列車控制領域,已嘗試采用UML2.0活動圖的方式自動生成測試用例[6-8]。
本文通過圖形化建模的方式,將復雜的LKJ功能進行拆分并采用簡單的圖形控件進行建模,自動生成測試用例,從而提高測試用例編寫效率和質量。
鑒于LKJ軟件的特點及目前LKJ軟件測試用例編制困難的現狀,本文主要結合圖形建模技術,對通過模型自動生成LKJ軟件測試用例的方法展開研究,并從測試模型框架、測試用例模塊劃分、接口參數選取及取值設計、接口參數組合設計及測試用例自動生成方法5方面入手,詳細介紹基于LKJ軟件自動化仿真測試系統的測試用例自動生成方案。
在對LKJ軟件進行測試前,應先根據LKJ軟件控制功能建立相應的LKJ軟件功能測試模型,依據該模型對接口參數采用遍歷的算法自動生成一系列測試用例,其中,接口參數選取及接口參數組合序列的形成是關鍵。LKJ軟件功能測試模型主要包括測試環境、接口參數、圖形建模3部分。
測試環境主要指測試用例進入的前置條件及測試用例運行的必備資源,如司機設定信息、LKJ基礎數據等;接口參數指影響測試結果的關鍵信息,主要體現在圖形建模的判斷節點及各分支中,每種參數可存在2個及以上的參數值。圖形建模指根據接口參數之間的邏輯關系進行模型繪制。
不同控制功能有不同的測試環境,不在本文討論范圍之內,暫不展開討論。
由于LKJ軟件功能復雜、接口參數多樣,若每個功能僅設計一個測試用例,則會造成測試用例接口參數過多、邏輯分支龐大,很難實現測試用例的自動生成。因此,首先應對LKJ軟件功能進行分解,細分成一個個相對獨立的功能模塊,然后對每個功能模塊再進行多次分解,分解成能進行獨立測試的最小測試單元,如圖1所示。

圖1 LKJ軟件測試用例模塊劃分示意圖
為避免遺漏,用例模塊劃分采用自頂向下逐層分解的原則,先畫出整體框架,再逐層細化。具體劃分步驟如下。
(1)根據運行場景或LKJ控制模式進行劃分,場景劃分方式主要依據運用場景,例如:庫內、調車、自動閉塞站內運行、自動閉塞區間運行等;LKJ控制模式劃分方式主要依據LKJ控制功能的模式,例如:待機、降級、段內走行、調車、通常、重載模式、無防冒、隨時停車等。本文選取第2種劃分方式。
(2) 梳理各控制模式的所有控制功能,例如:通常模式下的走停走、特殊前行、綠色許可證行車、過機校正、警惕、手信號引導等。對上述控制功能再向下逐層分解,如走停走可以分為停車再開和過機再走,其中過機再走又可向下分解為過機后信號開放和過機后信號關閉,直到不能再向下分解為止。
(3) 依據控制功能的最小單元進行測試用例模塊劃分,分解出的測試用例模塊應能單獨進行測試,且輸入參數相對較少。如停車再開控制功能可以分解成停車期間、起車至機車越過信號機等測試單元模塊。
(4) 將每個測試單元劃分成進入(啟動)條件、控制過程、退出(解除)條件等3部分,每部分為一個獨立的測試用例模塊。
測試用例接口參數直接關系到被測LKJ軟件功能的覆蓋度,是影響測試結果的關鍵參數,但接口參數過多不利于參數組合設計,所以應當根據不同測試用例模塊的實際需求選擇適合的接口參數,LKJ測試用例模塊常用的接口參數有速度、列車管壓力、信號機類型、信號機標志、信號制式、機車信號、距離、列車類型、機車類型等。
測試用例接口參數分為有限集參數和無限集參數兩種,有限集參數可以通過枚舉來表示,無限集參數一般為數值型參數,通常采用等價或邊界取值轉換為有限集參數。
(1)有限集參數取值可根據測試需要選取典型值。信號機類型、信號機標識、信號制式、機車信號、列車類型等為枚舉型接口參數,例如:信號機類型取值包括預告、2預告、通過、容許、進站、進出站、出站等。
(2)速度、限速、距離等無限集參數取值盡量按等價類和邊界值方法轉換為有限的離散數值集合。例如LKJ控制中要求距離小于70 m,則測試用例中可設置距離為69 m和70 m兩個邊界值。
接口參數選擇完成后,運用圖形化方式編輯測試環境,并基于圖形建模的方式為接口參數建立測試場景流程圖;系統依據測試場景流程圖自動生成一系列的測試用例接口參數組合序列[9],每個接口參數組合序列可生成一個測試用例,并通過對接口參數組合序列的篩選及對測試預期(測試斷言)的設置,形成本測試用例的接口參數組合序列表。
以LKJ軟件的貨車特殊前行功能進入條件[10]為例,介紹測試用例的接口參數組合序列表的形成的過程。
貨車特殊前行功能主要解決貨物列車在非貨車靠標停車困難車站尾部拉過標的問題,貨車特殊前行功能進入條件如下:
(1)貨物列車;
(2)機車停在LKJ車載數據預先設置為非貨車靠標停車困難車站的站內,且列車頭部與出站信號機距離小于70 m;
(3)機車信號為停車信號或LKJ邏輯判斷為停車信號;
(4)機車運行速度為0 km/h;
(5)司機按規定方法操作,輸入LKJ的前行距離值不超過100 m。
對貨車特殊前行功能進入條件進行梳理,形成如表1所示的7種接口參數。

表1 貨車特殊前行進入條件接口參數表
從表1可以看出,接口參數為7個,接口參數各有2個取值,若需要覆蓋所有接口參數的取值,則生成的接口參數組合序列數量應為128(27)個。若接口參數個數及取值再增加,則接口參數組合序列將會成倍或成指數級增加。例如:信號類型參數個數增加到10個、列車類型參數個數增加到12個,則生成3 840個接口參數組合序列,也就是可以生成3 840 個測試用例。
因此,對于LKJ軟件自動化仿真測試系統需要構建一個測試模型,將接口參數通過程序流程圖的方式進行建模,形成一個完整的測試場景,提高測試效率。貨車特殊前行進入條件的測試場景建模如圖2所示。
自動生成測試用例技術目前尚不能解決測試失效的自動辨識問題,無法自動生成斷言,需在流程圖中人工設置斷言,在自動分解生成接口參數組合序列后,需人工對接口參數組合序列進行全面性和正確性檢查,最終形成完整的接口參數組合序列集。

圖2 貨車特殊前行進入條件測試場景流程圖
流程圖編輯采用預先定義的圖形控件,通過對圖形控件拖拽及對控件的屬性和參數進行設置的方式完成序列集的制定,主要包括以下幾類圖形控件:
(1)開始/結束:定義流程圖的入口和出口;
(2)判斷:通過對參數的判斷來控制分支方向;
(3)箭頭:各個參數和步驟的連接關系;
(4)斷言:對測試結果進行檢查的測試斷言項。
軟件自動生成的接口參數序列數量受內部判斷及分支的影響,通過遍歷算法對活動圖進行路徑搜索,人工調整后形成如表2所示的貨車特殊前行進入條件測試接口參數組合序列表。
由表2可知,貨車特殊前行進入條件的接口參數組合序列僅有8個,僅需8個測試用例已能完成所有路徑的覆蓋,相對于128條用例來說已顯著縮減,極大的提高自動化測試效率。
以上示例未將所有接口參數及判斷邏輯全部展開,僅用于對方案的演示和說明,實際應用中接口參數及并發路徑會更多,對多并發路徑可采用取典型值法或將多并發路徑分支繼續拆分成若干個單獨的測試模塊。

表2 測試用例接口參數組合序列表
將上述生成的接口參數組合序列中各組參數依次傳入測試模塊接口中,即可自動生成LKJ軟件測試用例集合。
通過對測試用例模塊采用程序流程圖方式建模并自動生成測試用例的方法,顯著縮減無效測試用例,提高了LKJ軟件測試用例編制效率。且能對未測試的路徑和狀態組合進行查漏,有利于測試環境的復用。如果發生軟件功能模塊修改,只需修改軟件測試環境、接口參數和測試狀態圖即可重新生成所有用例,提高了測試用例的可維護性,節省了人工編制用例的時間。與LKJ軟件自動化仿真測試系統相結合,可顯著提高測試效率、測試覆蓋率及LKJ軟件測試的自動化程度。
該方案已在新一代LKJ軟件仿真測試系統中試用,在一般測試場景中能夠很好的滿足系統自動生成用例的需求,有效提高了測試用例編輯效率。但是由于測試場景的復雜性,往往在自動測試用例編輯過程中需要人工干預和修正,如何驗證生成用例模型正確性及測試覆蓋的完整性將是測試用例自動生成技術未來的研究重點之一。