靖焱林,唐 濤
(北京交通大學(xué) 軌道交通控制與安全國家重點實驗室,北京 100044)
車載設(shè)備是列控系統(tǒng)的重要組成部分,其功能和性能符合規(guī)范的要求,才能保證列車的安全運行,因此在設(shè)備投入使用前,要對其進行全面的測試。測試用例生成是實現(xiàn)自動化測試的關(guān)鍵,對于車載設(shè)備的測試,基于UML模型的測試具有很大的優(yōu)勢。UML 2.0活動圖適合于描述各種運營條件下車載設(shè)備的功能執(zhí)行過程,不同抽象層次的活動圖可以對系統(tǒng)不同層次的行為進行建模,可以生成用于不同用途的測試用例。本文主要研究CTCS-2級列控系統(tǒng)車載設(shè)備的功能測試用例生成方法。
CTCS-2級列控系統(tǒng)是基于軌道電路和點式應(yīng)答器,傳輸列車運行信息,并采用目標(biāo)距離模式監(jiān)控列車運行的列車運行控制系統(tǒng)。系統(tǒng)包括列控車載設(shè)備和列控地面設(shè)備。
車載設(shè)備由車載安全計算機、軌道電路信息接收模塊、應(yīng)答器信息接收模塊、人機界面、速度傳感器、列車接口單元、運行記錄單元、軌道電路信息接收天線、應(yīng)答器信息接收天線等部件組成。
車載設(shè)備具有的基本功能有軌道電路信息和應(yīng)答器信息接收功能、載頻鎖定功能、速度和距離計算功能、制動輸出功能、防溜逸功能、記錄功能、顯示和提示功能、LKJ接口功能、與動態(tài)監(jiān)測設(shè)備接口功能、與EMU的接口功能等。
UML 2.0活動圖將系統(tǒng)行為過程建模為活動,活動由邊所連接的節(jié)點集合組成。節(jié)點可以是動作節(jié)點、控制節(jié)點或?qū)ο蠊?jié)點。邊代表活動中的流,可以是控制流或?qū)ο罅鳌?/p>
僅當(dāng)每條輸入邊上有控制流,并且系統(tǒng)狀態(tài)滿足節(jié)點的前置條件,動作節(jié)點執(zhí)行其操作;在操作執(zhí)行結(jié)束時,如果系統(tǒng)狀態(tài)滿足節(jié)點的后置條件,那么控制流轉(zhuǎn)換到其輸出邊。常見的動作節(jié)點有調(diào)用動作、發(fā)送信號動作和接受事件動作。
控制節(jié)點管理活動內(nèi)的控制流,它控制流如何從它們的輸入邊傳遞到輸出邊。常用控制節(jié)點類型有初始節(jié)點和終止節(jié)點、判決節(jié)點和匯合節(jié)點、派生節(jié)點和匯聚節(jié)點。初始節(jié)點表示活動開始,終止節(jié)點表示活動結(jié)束。對于判決節(jié)點,只有滿足防護條件的輸出邊才能獲得流;匯合節(jié)點則將輸入邊的控制流匯合給輸出邊。派生節(jié)點將控制流同時分給滿足條件的并發(fā)輸出進程;對于匯聚節(jié)點,僅當(dāng)所有的輸入邊的控制流滿足條件時,才傳給輸出邊。
對象節(jié)點表明對象在活動中的特定位置可用。對象流是對象節(jié)點的輸入和輸出邊,代表對象的活動。對象節(jié)點可以表示為活動參數(shù)或別針,它們在語義上都是相同的?;顒訁?shù)與對象節(jié)點并無二異,表示活動的輸入或輸出參數(shù)。別針僅有一條邊,輸入別針僅有輸入邊,輸出別針僅有輸出邊。
定義1:活動圖D = {A, T, C, F}是一個四元組,其中:
(1)A是有限節(jié)點集合,且A為非空集合;
(2)T是有限邊集合,且T為非空集合;
(3)C是相應(yīng)邊上的轉(zhuǎn)移條件表達式;
定義2:D = {A, T, C, F}是活動圖,CA表示當(dāng)前活動狀態(tài),CA是A的子集,對于T中的任意元素t,有:
(2)C(t)表示t上的轉(zhuǎn)移條件,E(CA)表示CA可觸發(fā)的邊集合,則?t 是CA的子集。
(3)f(CA)表示在某一時刻CA能夠觸發(fā)的唯一發(fā)生轉(zhuǎn)換的邊,則f(CA) = {t | t∈E(CA)且(CA為空},t觸發(fā)后的新狀態(tài)CA* = (CA-,如果滿足條件的t不止一個,那么任選其中一個。
(4)EP表示活動圖的執(zhí)行路徑,即:
CA0是EP的起始活動狀態(tài),CAn是EP的終止活動狀態(tài),CAi是當(dāng)前活動狀態(tài),ti= f(CAi),i =
定義3是測試場景的形式化定義。
定義3:D = {A, T, C, F}是一個可測試活動圖,即D至少有一個初始節(jié)點。D的初始活動狀態(tài)是CA0,表示初始節(jié)點集合,終止活動狀態(tài)是CAn,表示終止節(jié)點集合。D的一個測試場景TS是從活動的初始節(jié)點到終止節(jié)點的執(zhí)行序列,即:
其中,CAi是當(dāng)前活動節(jié)點集,且ti∈E(CAi),Ci是ti的轉(zhuǎn)換條件,i = 0, 1, 2,…, n-1;CAi= (CAi
定義4是測試用例的形式化定義。
定義4:D = {A, T, C, F}是一個活動圖,D的一個測試用例TC是包含特定測試場景和輸入輸出數(shù)據(jù)的三元組,即:
TC = {TS, ID, ED}
其中,TS是測試用例所屬的測試場景,ID是輸入數(shù)據(jù),ED是ID對應(yīng)的輸出數(shù)據(jù)。
測試數(shù)據(jù)可以通過分析活動的輸入對象節(jié)點、輸出對象節(jié)點、轉(zhuǎn)移邊上防護條件得到。輸入數(shù)據(jù)取值可采用等價類劃分、邊界值分析等方法設(shè)計,然后通過組合覆蓋原則定義滿足測試覆蓋要求的測試用例。
(1)節(jié)點覆蓋準則:活動圖上的所有節(jié)點至少要執(zhí)行一次。(2)轉(zhuǎn)移覆蓋準則:活動圖上的所有轉(zhuǎn)換至少要執(zhí)行一次。(3)基本路徑覆蓋準則:活動圖上的所有路徑至少要執(zhí)行一次。對于循環(huán),按照不進入循環(huán)和進入循環(huán)一次處理,這樣生成的路徑叫做基本路徑。
當(dāng)并發(fā)線程比較多時,由于并發(fā)線程可以任何順序排列構(gòu)成基本路徑,會導(dǎo)致路徑爆炸問題,因此需要對并發(fā)線程的基本路徑組合進行約束。測試人員可以對活動進行約束,規(guī)定執(zhí)行順序;也可以指定路徑權(quán)值,規(guī)定權(quán)值大的路徑在測試場景中所占比例較大。
在生成測試場景前,定義活動圖的數(shù)據(jù)模型,該模型描述了活動圖構(gòu)成及其與測試用例間的關(guān)系?;顒訄D類由分區(qū)、節(jié)點和轉(zhuǎn)換邊組合而成;節(jié)點有兩種,分別是控制節(jié)點和動作節(jié)點,此外節(jié)點的屬性有輸入數(shù)據(jù)、輸出數(shù)據(jù)、輸入邊、輸出邊和防護條件;轉(zhuǎn)換邊的屬性有頭節(jié)點、尾節(jié)點和防護條件。每一個活動圖對應(yīng)于多條測試場景,每一條測試場景至少屬于一條測試用例。
根據(jù)測試覆蓋準則,采用帶回溯的深度優(yōu)先搜索遍歷算法,遍歷活動中所有基本路徑生成測試場景。遇到?jīng)Q策節(jié)點拆成不同場景,對于循環(huán),至多進入循環(huán)一次,因此在遍歷基本路徑的同時,也可以遍歷活動的所有節(jié)點和轉(zhuǎn)換。
測試場景生成算法的輸入是活動圖,輸出是該活動圖的所有場景(scenarios),定義節(jié)點棧(VertexStack)、轉(zhuǎn)換邊棧(TransStack),可觸發(fā)的轉(zhuǎn)換邊棧(Enabled-Stack),當(dāng)前狀態(tài)集(CurrStateSet)、當(dāng)前狀態(tài)集的可轉(zhuǎn)換邊集(EnabledTrans)、新的狀態(tài)集(NewStateSet)、下一次觸發(fā)的轉(zhuǎn)換邊(Se-Transition)、找到的基本路徑(scenario)、判斷是否到終止節(jié)點的標(biāo)識符(SeAnother)。算法流程如圖1。
測試用例的生成算法是提取測試場景信息的過程,將測試場景中的信息轉(zhuǎn)換成輸入、輸出數(shù)據(jù)和操作組成的序列,并以數(shù)組或序列的形式輸出。
測試用例生成算法的輸入是測試場景序列(scenarios[]),輸出是測試用例序列(Testcases[])。當(dāng)前測試場景(currScenario)由節(jié)點序列(vertex[])和轉(zhuǎn)換邊序列構(gòu)成(trans[]),當(dāng)前測試用例(currTestcase)由輸入數(shù)據(jù)(Input),輸出數(shù)據(jù)(Output)和約束(Constrains)構(gòu)成,i和j是自然數(shù)。算法具體流程如圖2。
圖2 測試用例生成算法
系統(tǒng)活動圖模型既要精確描述系統(tǒng)的行為過程,也要保證其可測試性。車載設(shè)備工作過程中,需要與多個外部接口進行信息交互,同時還要實時監(jiān)控列車運行。結(jié)構(gòu)復(fù)雜的活動圖模型雖然能夠詳細地描述系統(tǒng)的活動,但是不利于理解,也難以生成好的測試用例集。為方便測試用例設(shè)計和生成,規(guī)定車載ATP活動建模遵循以下規(guī)則。
規(guī)則1:每一個活動只有一個初始節(jié)點,至少有一個終止節(jié)點,派生節(jié)點和匯聚節(jié)點須成對出現(xiàn),不同分支的活動必須異步執(zhí)行。
規(guī)則2:除了初始節(jié)點和終止節(jié)點,其他節(jié)點至少有一條輸入邊和輸出邊,從而保證了圖中每一節(jié)點都是可達的,即沒有孤立節(jié)點。
規(guī)則3:對于結(jié)構(gòu)化活動或原子動作節(jié)點,標(biāo)識其輸入輸出對象節(jié)點,使用輸入和輸出別針來表示。
規(guī)則4:對于控制節(jié)點,需要標(biāo)識其輸出邊上的轉(zhuǎn)移條件,作為約束。
下面以車載設(shè)備的制動輸出功能為例說明基于活動圖模型的車載設(shè)備測試用例的生成。車載設(shè)備的制動指令與制動模式曲線相關(guān),對于設(shè)備制動優(yōu)先方式,當(dāng)運行速度達到常用制動模式曲線時,車載設(shè)備觸發(fā)最大常用制動,并按照一定條件在觸發(fā)最大常用制動之前的時機發(fā)出弱常用制動命令;當(dāng)運行速度達到緊急制動模式曲線時,列控車載設(shè)備發(fā)出緊急制動命令。圖3為設(shè)備制動優(yōu)先時的制動輸出功能執(zhí)行過程活動圖。
圖3 制動輸出功能活動圖
在UML建模工具中創(chuàng)建的活動圖模型可以XMI格式導(dǎo)出,使用XMI格式表示的UML模型具有良好的數(shù)據(jù)定義,也便于自動化處理和與數(shù)據(jù)庫連接。本文采用標(biāo)準的Java DOM API分析XMI格式的活動圖,生成的測試場景和測試用例以Acess數(shù)據(jù)表的形式給出。根據(jù)我們實現(xiàn)的測試場景生成程序,可得出上述活動圖有7條基本路徑,圖4為部分測試場景信息。
圖4 制動輸出功能的測試場景
通過分析每條測試場景節(jié)點的輸入輸出對象內(nèi)容和轉(zhuǎn)換的防衛(wèi)條件,可以生成相應(yīng)的測試用例,圖5為部分測試用例信息。
圖5 制動輸出功能的測試用例
本文重點研究基于活動圖的車載設(shè)備的測試方法,包括測試場景和測試用例的生成?;诠?jié)點、轉(zhuǎn)換和路徑覆蓋準則生成的測試場景可以滿足現(xiàn)場中的運營條件需要,測試用例中的測試數(shù)據(jù)詳細描述了系統(tǒng)與外部的交互信息,為在實驗室仿真環(huán)境下對系統(tǒng)進行測試提供了有力的支持。
只是包含描述性測試信息的測試用例是無法直接執(zhí)行的,因此還需要深入分析這些描述性信息,研究如何生成具體的測試數(shù)據(jù)和可執(zhí)行的測試用例,這是未來的研究重點。
[1]方貴賓,胡輝良. UML 2.0和統(tǒng)一過程[M]. 北京:機械工業(yè)出版社,2006:184-212.
[2]徐嘯明. 列控車載設(shè)備(CTCS2-200H型)[M]. 北京:中國鐵道出版社,2007:8-11.
[3]牟 凱,顧 明. 基于UML活動圖的測試用例自動生成方法研究[J].計算機應(yīng)用,2006,26(4):844-846.
[4]袁潔松,王林章,李宣東,鄭國梁. UMLTGF:一個基于灰盒測試方法從UML活動圖生成測試用例的工具[J]. 計算機研究與發(fā)展,2006,43(1):46-53.