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