李冠軍,楊清祥,白鴻鈞
(河南思維軌道交通技術(shù)研究院有限公司,鄭州 450001)
列車運行監(jiān)控裝置(LKJ)車載控制軟件涉及列車行車安全,因此在每次軟件變更后都必須進行嚴格測試,以保證軟件控制的安全性、可靠性[1]。在LKJ軟件升級過程中,軟件測試工作一直占據(jù)著很大的比重。雖然目前已逐漸使用LKJ軟件自動化仿真測試系統(tǒng)代替部分人工測試的工作,但其測試用例的編輯和維護仍需人工手動完成,需耗費較多的人力,且效率較低。因此,為了盡可能的提高效率及自動化程度,充分發(fā)揮LKJ軟件自動化仿真測試系統(tǒng)的優(yōu)勢,除對測試腳本的編寫方法進行優(yōu)化外,亟待有更安全、可靠的LKJ軟件測試用例自動生成解決方案。
由于LKJ軟件控制功能復(fù)雜且牽涉外部接口參數(shù)較多,在編寫LKJ軟件測試用例時,需要根據(jù)軟件控制功能將不同的控制參數(shù)和外部接口等進行排列組合來形成不同的測試用例。測試LKJ軟件的一個控制功能往往需要幾十條甚至上百條LKJ軟件測試用例,才能實現(xiàn)對控制功能的完整覆蓋。目前LKJ軟件自動化仿真測試系統(tǒng)提供的LKJ軟件測試用例編寫方式有腳本語言編輯、人工錄制測試用例和圖形化編輯3 種方式。
(1)腳本語言編輯方式是指采用測試腳本語言編輯生成自動測試腳本[2]。該方法對測試用例編寫人員的業(yè)務(wù)水平和腳本語言運用水平要求較高,且編輯工作量較大,一般適用于功能相對簡單的壓力測試和重復(fù)性的性能測試等方面。對于邏輯復(fù)雜的軟件功能測試,由于測試腳本的編輯及維護工作量非常巨大,使用該方式無法體現(xiàn)自動化測試的優(yōu)越性。
(2)人工錄制測試用例方式是指在人工操作LKJ設(shè)備時,系統(tǒng)對設(shè)備操作過程、LKJ輸出關(guān)鍵信息和LKJ控制結(jié)果等信息進行詳實記錄,并從一次或多次人工操作記錄中提煉信息,自動生成LKJ軟件測試用例初稿,再由人工對初稿進行修改。該方式以人工操作為范例,由于個人操作習(xí)慣及業(yè)務(wù)水平不同,可能會輸出與預(yù)期不符的結(jié)果,導(dǎo)致測試用例偏離實際,且生成的測試用例腳本維護工作量大,只適用于特殊場景的重復(fù)測試。
(3)圖形化編輯方式僅需要通過拖動圖形完成一系列組合即可編輯測試用例,對測試用例編輯人員的腳本語言運用水平?jīng)]有太高要求。此方法可顯著提高LKJ軟件測試用例的編輯效率,簡化LKJ軟件測試用例維護工作。但由于LKJ軟件測試用例整體數(shù)量龐大,用例編輯及維護仍需要大量人力,不能發(fā)揮LKJ軟件自動化仿真測試系統(tǒng)的優(yōu)點。
測試用例的自動生成技術(shù)是實現(xiàn)LKJ軟件的自動化測試的關(guān)鍵一環(huán)。目前測試用例自動生成的方法,幾乎都離不開選取接口參數(shù)[3]和創(chuàng)建測試模型[4]。通常采用的測試模型有有限狀態(tài)機(FSM,F(xiàn)inite State Machine)和擴展有限狀態(tài)機(EFSM ,Extended Finite State Machine)[5]等。在列車控制領(lǐng)域,已嘗試采用UML2.0活動圖的方式自動生成測試用例[6-8]。
本文通過圖形化建模的方式,將復(fù)雜的LKJ功能進行拆分并采用簡單的圖形控件進行建模,自動生成測試用例,從而提高測試用例編寫效率和質(zhì)量。
鑒于LKJ軟件的特點及目前LKJ軟件測試用例編制困難的現(xiàn)狀,本文主要結(jié)合圖形建模技術(shù),對通過模型自動生成LKJ軟件測試用例的方法展開研究,并從測試模型框架、測試用例模塊劃分、接口參數(shù)選取及取值設(shè)計、接口參數(shù)組合設(shè)計及測試用例自動生成方法5方面入手,詳細介紹基于LKJ軟件自動化仿真測試系統(tǒng)的測試用例自動生成方案。
在對LKJ軟件進行測試前,應(yīng)先根據(jù)LKJ軟件控制功能建立相應(yīng)的LKJ軟件功能測試模型,依據(jù)該模型對接口參數(shù)采用遍歷的算法自動生成一系列測試用例,其中,接口參數(shù)選取及接口參數(shù)組合序列的形成是關(guān)鍵。LKJ軟件功能測試模型主要包括測試環(huán)境、接口參數(shù)、圖形建模3部分。
測試環(huán)境主要指測試用例進入的前置條件及測試用例運行的必備資源,如司機設(shè)定信息、LKJ基礎(chǔ)數(shù)據(jù)等;接口參數(shù)指影響測試結(jié)果的關(guān)鍵信息,主要體現(xiàn)在圖形建模的判斷節(jié)點及各分支中,每種參數(shù)可存在2個及以上的參數(shù)值。圖形建模指根據(jù)接口參數(shù)之間的邏輯關(guān)系進行模型繪制。
不同控制功能有不同的測試環(huán)境,不在本文討論范圍之內(nèi),暫不展開討論。
由于LKJ軟件功能復(fù)雜、接口參數(shù)多樣,若每個功能僅設(shè)計一個測試用例,則會造成測試用例接口參數(shù)過多、邏輯分支龐大,很難實現(xiàn)測試用例的自動生成。因此,首先應(yīng)對LKJ軟件功能進行分解,細分成一個個相對獨立的功能模塊,然后對每個功能模塊再進行多次分解,分解成能進行獨立測試的最小測試單元,如圖1所示。
圖1 LKJ軟件測試用例模塊劃分示意圖
為避免遺漏,用例模塊劃分采用自頂向下逐層分解的原則,先畫出整體框架,再逐層細化。具體劃分步驟如下。
(1)根據(jù)運行場景或LKJ控制模式進行劃分,場景劃分方式主要依據(jù)運用場景,例如:庫內(nèi)、調(diào)車、自動閉塞站內(nèi)運行、自動閉塞區(qū)間運行等;LKJ控制模式劃分方式主要依據(jù)LKJ控制功能的模式,例如:待機、降級、段內(nèi)走行、調(diào)車、通常、重載模式、無防冒、隨時停車等。本文選取第2種劃分方式。
(2) 梳理各控制模式的所有控制功能,例如:通常模式下的走停走、特殊前行、綠色許可證行車、過機校正、警惕、手信號引導(dǎo)等。對上述控制功能再向下逐層分解,如走停走可以分為停車再開和過機再走,其中過機再走又可向下分解為過機后信號開放和過機后信號關(guān)閉,直到不能再向下分解為止。
(3) 依據(jù)控制功能的最小單元進行測試用例模塊劃分,分解出的測試用例模塊應(yīng)能單獨進行測試,且輸入?yún)?shù)相對較少。如停車再開控制功能可以分解成停車期間、起車至機車越過信號機等測試單元模塊。
(4) 將每個測試單元劃分成進入(啟動)條件、控制過程、退出(解除)條件等3部分,每部分為一個獨立的測試用例模塊。
測試用例接口參數(shù)直接關(guān)系到被測LKJ軟件功能的覆蓋度,是影響測試結(jié)果的關(guān)鍵參數(shù),但接口參數(shù)過多不利于參數(shù)組合設(shè)計,所以應(yīng)當(dāng)根據(jù)不同測試用例模塊的實際需求選擇適合的接口參數(shù),LKJ測試用例模塊常用的接口參數(shù)有速度、列車管壓力、信號機類型、信號機標志、信號制式、機車信號、距離、列車類型、機車類型等。
測試用例接口參數(shù)分為有限集參數(shù)和無限集參數(shù)兩種,有限集參數(shù)可以通過枚舉來表示,無限集參數(shù)一般為數(shù)值型參數(shù),通常采用等價或邊界取值轉(zhuǎn)換為有限集參數(shù)。
(1)有限集參數(shù)取值可根據(jù)測試需要選取典型值。信號機類型、信號機標識、信號制式、機車信號、列車類型等為枚舉型接口參數(shù),例如:信號機類型取值包括預(yù)告、2預(yù)告、通過、容許、進站、進出站、出站等。
(2)速度、限速、距離等無限集參數(shù)取值盡量按等價類和邊界值方法轉(zhuǎn)換為有限的離散數(shù)值集合。例如LKJ控制中要求距離小于70 m,則測試用例中可設(shè)置距離為69 m和70 m兩個邊界值。
接口參數(shù)選擇完成后,運用圖形化方式編輯測試環(huán)境,并基于圖形建模的方式為接口參數(shù)建立測試場景流程圖;系統(tǒng)依據(jù)測試場景流程圖自動生成一系列的測試用例接口參數(shù)組合序列[9],每個接口參數(shù)組合序列可生成一個測試用例,并通過對接口參數(shù)組合序列的篩選及對測試預(yù)期(測試斷言)的設(shè)置,形成本測試用例的接口參數(shù)組合序列表。
以LKJ軟件的貨車特殊前行功能進入條件[10]為例,介紹測試用例的接口參數(shù)組合序列表的形成的過程。
貨車特殊前行功能主要解決貨物列車在非貨車靠標停車困難車站尾部拉過標的問題,貨車特殊前行功能進入條件如下:
(1)貨物列車;
(2)機車停在LKJ車載數(shù)據(jù)預(yù)先設(shè)置為非貨車靠標停車困難車站的站內(nèi),且列車頭部與出站信號機距離小于70 m;
(3)機車信號為停車信號或LKJ邏輯判斷為停車信號;
(4)機車運行速度為0 km/h;
(5)司機按規(guī)定方法操作,輸入LKJ的前行距離值不超過100 m。
對貨車特殊前行功能進入條件進行梳理,形成如表1所示的7種接口參數(shù)。
表1 貨車特殊前行進入條件接口參數(shù)表
從表1可以看出,接口參數(shù)為7個,接口參數(shù)各有2個取值,若需要覆蓋所有接口參數(shù)的取值,則生成的接口參數(shù)組合序列數(shù)量應(yīng)為128(27)個。若接口參數(shù)個數(shù)及取值再增加,則接口參數(shù)組合序列將會成倍或成指數(shù)級增加。例如:信號類型參數(shù)個數(shù)增加到10個、列車類型參數(shù)個數(shù)增加到12個,則生成3 840個接口參數(shù)組合序列,也就是可以生成3 840 個測試用例。
因此,對于LKJ軟件自動化仿真測試系統(tǒng)需要構(gòu)建一個測試模型,將接口參數(shù)通過程序流程圖的方式進行建模,形成一個完整的測試場景,提高測試效率。貨車特殊前行進入條件的測試場景建模如圖2所示。
自動生成測試用例技術(shù)目前尚不能解決測試失效的自動辨識問題,無法自動生成斷言,需在流程圖中人工設(shè)置斷言,在自動分解生成接口參數(shù)組合序列后,需人工對接口參數(shù)組合序列進行全面性和正確性檢查,最終形成完整的接口參數(shù)組合序列集。
圖2 貨車特殊前行進入條件測試場景流程圖
流程圖編輯采用預(yù)先定義的圖形控件,通過對圖形控件拖拽及對控件的屬性和參數(shù)進行設(shè)置的方式完成序列集的制定,主要包括以下幾類圖形控件:
(1)開始/結(jié)束:定義流程圖的入口和出口;
(2)判斷:通過對參數(shù)的判斷來控制分支方向;
(3)箭頭:各個參數(shù)和步驟的連接關(guān)系;
(4)斷言:對測試結(jié)果進行檢查的測試斷言項。
軟件自動生成的接口參數(shù)序列數(shù)量受內(nèi)部判斷及分支的影響,通過遍歷算法對活動圖進行路徑搜索,人工調(diào)整后形成如表2所示的貨車特殊前行進入條件測試接口參數(shù)組合序列表。
由表2可知,貨車特殊前行進入條件的接口參數(shù)組合序列僅有8個,僅需8個測試用例已能完成所有路徑的覆蓋,相對于128條用例來說已顯著縮減,極大的提高自動化測試效率。
以上示例未將所有接口參數(shù)及判斷邏輯全部展開,僅用于對方案的演示和說明,實際應(yīng)用中接口參數(shù)及并發(fā)路徑會更多,對多并發(fā)路徑可采用取典型值法或?qū)⒍嗖l(fā)路徑分支繼續(xù)拆分成若干個單獨的測試模塊。
表2 測試用例接口參數(shù)組合序列表
將上述生成的接口參數(shù)組合序列中各組參數(shù)依次傳入測試模塊接口中,即可自動生成LKJ軟件測試用例集合。
通過對測試用例模塊采用程序流程圖方式建模并自動生成測試用例的方法,顯著縮減無效測試用例,提高了LKJ軟件測試用例編制效率。且能對未測試的路徑和狀態(tài)組合進行查漏,有利于測試環(huán)境的復(fù)用。如果發(fā)生軟件功能模塊修改,只需修改軟件測試環(huán)境、接口參數(shù)和測試狀態(tài)圖即可重新生成所有用例,提高了測試用例的可維護性,節(jié)省了人工編制用例的時間。與LKJ軟件自動化仿真測試系統(tǒng)相結(jié)合,可顯著提高測試效率、測試覆蓋率及LKJ軟件測試的自動化程度。
該方案已在新一代LKJ軟件仿真測試系統(tǒng)中試用,在一般測試場景中能夠很好的滿足系統(tǒng)自動生成用例的需求,有效提高了測試用例編輯效率。但是由于測試場景的復(fù)雜性,往往在自動測試用例編輯過程中需要人工干預(yù)和修正,如何驗證生成用例模型正確性及測試覆蓋的完整性將是測試用例自動生成技術(shù)未來的研究重點之一。