吳曉龍,賁可榮
(海軍工程大學(xué)計(jì)算機(jī)工程系,湖北 武漢 430033)
軟件模型是對(duì)軟件行為和軟件結(jié)構(gòu)的抽象描述。軟件行為可用系統(tǒng)輸入序列、活動(dòng)、條件、輸出邏輯或數(shù)據(jù)流進(jìn)行描述,軟件結(jié)構(gòu)則使用組件圖、部署圖等進(jìn)行描述[1]。UML是一種可視化的建模語(yǔ)言,它能讓系統(tǒng)的構(gòu)造者用標(biāo)準(zhǔn)的、易于理解的方式建立系統(tǒng)藍(lán)圖,并提供一種機(jī)制,以便于不同人之間有效地共享和交流設(shè)計(jì)結(jié)果[2]。UML包括一些可以相互結(jié)合為圖表的圖形元素,目的是用多個(gè)視圖來(lái)展示一個(gè)系統(tǒng),這組視圖被稱為一個(gè)模型。
系統(tǒng)的需求分析階段通常使用時(shí)序圖來(lái)描述系統(tǒng)運(yùn)行的場(chǎng)景,而狀態(tài)圖展示系統(tǒng)中某個(gè)對(duì)象在其生存周期內(nèi)由于事件和觸發(fā)事件而發(fā)生狀態(tài)改變的過(guò)程,狀態(tài)圖更有利于發(fā)現(xiàn)對(duì)象交互的動(dòng)態(tài)錯(cuò)誤。史耀馨等在文獻(xiàn)[3]中介紹了一種從UML順序圖中合成狀態(tài)圖的方法;袁海等在文獻(xiàn)[4]中提出了從UML順序圖生成狀態(tài)圖的一種方法,但在添加語(yǔ)義約束時(shí),對(duì)于時(shí)序圖中消息的發(fā)送和接收對(duì)象狀態(tài)變量的變化未明確定義;馬偉等在文獻(xiàn)[5]中提出了基于UML時(shí)序圖的集成測(cè)試序列自動(dòng)生成方法,然后使用WP方法構(gòu)造測(cè)試序列,但只是從單一順序圖生成狀態(tài)機(jī),未考慮相關(guān)聯(lián)順序圖;YUE在文獻(xiàn)[6]中提出一種從用例模型自動(dòng)轉(zhuǎn)換成UML活動(dòng)圖的方法,在文獻(xiàn)[7]中提出一種從用例模型自動(dòng)轉(zhuǎn)化成UML狀態(tài)圖的方法,并提出了一種轉(zhuǎn)換工具aToucan,由于工具的復(fù)雜性,使得轉(zhuǎn)換過(guò)程不易控制。筆者對(duì)文獻(xiàn)[4]的方法進(jìn)行了改進(jìn),以類圖和協(xié)作圖為基礎(chǔ)模型,采用對(duì)象約束語(yǔ)言[8](object constraint language,OCL)對(duì)協(xié)作圖中每條消息加上前置和后置條件約束,在進(jìn)行消息的語(yǔ)義約束時(shí),強(qiáng)調(diào)只有接收消息才能使對(duì)象的狀態(tài)發(fā)生改變,添加的這些規(guī)約包含狀態(tài)變量的定義。該變量組成了系統(tǒng)的狀態(tài)向量,用于區(qū)分系統(tǒng)所處的不同狀態(tài)。生成的狀態(tài)圖具有較高的結(jié)構(gòu)化和可讀性。
類圖(class diagram,CD)是顯示一組類、接口、協(xié)作及它們之間聯(lián)系的圖。UML中用矩形符號(hào)表示類。類的基本組成包括名稱、屬性及操作。
協(xié)作圖(collaboration diagram,CD)[9]是一種交互圖。一個(gè)協(xié)作圖顯示了一系列的對(duì)象和在這些對(duì)象之間的聯(lián)系以及對(duì)象間發(fā)送與接收的消息。協(xié)作圖是強(qiáng)調(diào)發(fā)送與接收消息對(duì)象之間的結(jié)構(gòu)組織,可以用來(lái)按交互中的角色及其關(guān)系對(duì)一個(gè)用例特定的實(shí)現(xiàn)場(chǎng)景進(jìn)行建模,形式定義如下:
協(xié)作圖CD為一個(gè)6元組,即CD=<O,M,E,→,vs,vs'> 。其中:O={O1,O2,…,Om}為對(duì)象的集合,O1,O2,…,Om為協(xié)作圖中的對(duì)象;M?前綴×守衛(wèi)條件×序列表達(dá)式×返回值×消息名×參數(shù)列表,為消息的集合;E=M×{s,r}為事件集合,事件是指消息的發(fā)送和接收,對(duì)于消息msg,發(fā)送事件用<msg,s>表示,接收事件用<msg,r>表示;→為消息集合M上的一個(gè)全序關(guān)系,表示協(xié)作圖中的消息按序列表達(dá)式約束的先后順序;vs,vs'為消息msg前后對(duì)象的狀態(tài)。
狀態(tài)圖(statechart diagram,SD)[10]是一個(gè)實(shí)體基于事件反應(yīng)的動(dòng)態(tài)行為,顯示了該實(shí)體如何根據(jù)當(dāng)前所處的狀態(tài)對(duì)不同的事件做出反應(yīng),描述了實(shí)體所處的可能狀態(tài)以及狀態(tài)之間的轉(zhuǎn)換,并給出了狀態(tài)變化序列的起點(diǎn)和終點(diǎn)。形式化定義如下:
狀態(tài)圖 SD 為一個(gè) 8元組:SD={S,T,α,β,γ,λ,V,v}。其中:S={s0,s1,…,sn}為狀態(tài)的集合,s0,s1,…,sn為狀態(tài)圖中的狀態(tài);T={t1,t2,…,tm}為轉(zhuǎn)換的集合,t1,t2,…,tm為狀態(tài)圖中的轉(zhuǎn)換;α(ti)為轉(zhuǎn)換 ti的源狀態(tài);β(ti)為轉(zhuǎn)換 ti的目標(biāo)狀態(tài);γ(si)為狀態(tài)si的后繼轉(zhuǎn)換,后繼轉(zhuǎn)換不唯一;λ為狀態(tài)轉(zhuǎn)換標(biāo)簽;V為狀態(tài)向量的集合;v為狀態(tài)對(duì)應(yīng)狀態(tài)向量的值。
筆者以一個(gè)飲料銷售機(jī)為例。飲料銷售機(jī)并不復(fù)雜,但足以說(shuō)明從協(xié)作圖自動(dòng)生成狀態(tài)圖的方法。圖1給出了飲料銷售機(jī)的類圖。
圖1 飲料銷售機(jī)的類圖
飲料銷售機(jī)有3個(gè)部分:前端、錢幣記錄儀及飲料分配器,圖1展示了其組合關(guān)系。前端接收顧客的選購(gòu)和錢幣,顯示信息,返還錢幣,從飲料分配器接收飲料并把飲料交給顧客。錢幣記錄儀從前端獲取顧客輸入信息,更新現(xiàn)鈔存儲(chǔ)以及找零錢。飲料分配器檢查飲料是否有貨及分發(fā)飲料。
一個(gè)較復(fù)雜的系統(tǒng)通常由多個(gè)協(xié)作圖描述其內(nèi)部對(duì)象間的消息傳遞,在整個(gè)系統(tǒng)中,這些協(xié)作圖并不是孤立存在的,它們之間有一定的關(guān)系,如在兩個(gè)協(xié)作圖中涉及了幾個(gè)相同的對(duì)象,或兩個(gè)協(xié)作圖中的對(duì)象雖然一樣,但它們之間的消息傳遞發(fā)生在兩種不同的場(chǎng)景,這兩種場(chǎng)景在某一時(shí)刻不可能同時(shí)發(fā)生,只會(huì)有一種場(chǎng)景出現(xiàn)。圖2、圖3分別給出了飲料銷售機(jī)在飲料已賣完和顧客塞入零錢數(shù)目有誤兩種場(chǎng)景的協(xié)作圖。
UML協(xié)作圖并沒(méi)有包含足夠的語(yǔ)義信息,這給轉(zhuǎn)換成狀態(tài)圖帶來(lái)了麻煩,因此,在轉(zhuǎn)換前,必須對(duì)協(xié)作圖進(jìn)行擴(kuò)展,添加必要的語(yǔ)義信息。UML中提供的對(duì)象約束語(yǔ)言O(shè)CL是純描述性語(yǔ)言,只描述做什么,不描述如何做。OCL表達(dá)式只可用于描述狀態(tài)變化,即用于對(duì)操作/動(dòng)作的描述和聲明系統(tǒng)狀態(tài)的改變。可以用OCL定義一組表示對(duì)象某方面狀態(tài)的變量,該變量組成了系統(tǒng)的狀態(tài)向量,用于區(qū)分系統(tǒng)所處的不同狀態(tài)。對(duì)象之間的消息傳遞可能引起系統(tǒng)狀態(tài)向量的變化,也可能不改變系統(tǒng)的狀態(tài)向量。為協(xié)作圖中對(duì)象之間的消息加上前置條件和后置條件,前置條件和后置條件與操作或行為特征相關(guān),OCL表達(dá)式用<precondition>和<postcondition>標(biāo)識(shí)前置條件和后置條件,前置條件是原狀態(tài)與守衛(wèi)條件的組合,而后置條件為目標(biāo)狀態(tài)的謂詞。
按以上所述,分別對(duì)飲料銷售機(jī)的3個(gè)部分用OCL進(jìn)行語(yǔ)義約束。
前端:
錢幣記錄儀:
飲料分配器:
在協(xié)作圖中,指向?qū)ο驩的消息msg對(duì)應(yīng)為對(duì)象O狀態(tài)圖中的事件,從對(duì)象O發(fā)出的消息msg對(duì)應(yīng)為對(duì)象O狀態(tài)圖中的動(dòng)作。因此,指向?qū)ο驩的消息,能夠改變對(duì)象O的狀態(tài),而由對(duì)象O發(fā)出的消息不改變對(duì)象O的狀態(tài)。
為協(xié)作圖中的單個(gè)對(duì)象構(gòu)造狀態(tài)圖的方法為:按照協(xié)作圖的消息序列遍歷每一條與該對(duì)象相關(guān)的消息,對(duì)于消息msg,如果是對(duì)象的接收消息,則添加一個(gè)轉(zhuǎn)換,把消息msg作為轉(zhuǎn)換的事件;如果是對(duì)象的發(fā)送消息,則添加一個(gè)轉(zhuǎn)換,把消息msg作為轉(zhuǎn)換的動(dòng)作。筆者為簡(jiǎn)單起見,并不關(guān)心消息的細(xì)節(jié),如消息的參數(shù)、返回值等。對(duì)于一個(gè)對(duì)象,不允許同時(shí)接收一個(gè)以上的消息,也不允許在接收一個(gè)消息的同時(shí)發(fā)送另一個(gè)消息。用OCL定義的系統(tǒng)狀態(tài)向量來(lái)表示對(duì)象的狀態(tài),如果狀態(tài)向量的值發(fā)生變化,就表示對(duì)象遷移到一個(gè)新的狀態(tài)。在添加的過(guò)程中,若轉(zhuǎn)換的后繼狀態(tài)未在狀態(tài)圖中出現(xiàn)過(guò),則添加轉(zhuǎn)換至此狀態(tài);若后繼狀態(tài)在狀態(tài)圖中已出現(xiàn)過(guò),則產(chǎn)生回路。
生成狀態(tài)圖的算法如下:
輸入:一組包含 n個(gè)對(duì)象 O1,O2,…,On的協(xié)作圖 CD1,CD2,…,CDp,每個(gè)協(xié)作圖的消息序列為 msg1,msg2,…,msgq,…
輸出:對(duì)象 O1,O2,…,On的合成狀態(tài)圖
為對(duì)象構(gòu)造一個(gè)狀態(tài)圖,并設(shè)置初始狀態(tài)curr:=O[i][0];
for each msgk∈協(xié)作圖CDj下的消息集合
if存在轉(zhuǎn)換 t,使得 λ(t)=mkand α(t)=curr and v(β(t))=vs'(mk),
則 curr:=β(t);
else if存在狀態(tài)s,使得v(s)=vs'(mk)and vs(mk)! =vs'(mk)and 存在 γ(si)=mk+1,
則增加一個(gè)轉(zhuǎn)換 t,α(t)=curr and β(t)=s and λ(t)=mkand curr:=s;
else
增加一個(gè)狀態(tài)s,使得v(s)=vs'(mk),
增加一個(gè)轉(zhuǎn)換 t,使得 α(t)=curr and β(t)=s and λ(t)=mkand curr:=s
通過(guò)以上算法,能夠得到協(xié)作圖里飲料銷售機(jī)的3個(gè)對(duì)象的狀態(tài)圖。如圖4~圖6所示,為了便于標(biāo)注,令 O[1]=a,O[2]=b,O[3]=c。
圖4 前端狀態(tài)圖
系統(tǒng)中每一個(gè)對(duì)象生成狀態(tài)圖后,接著就是把這些對(duì)象的狀態(tài)圖合成,形成一個(gè)描述系統(tǒng)完整功能的狀態(tài)圖。
合并單個(gè)對(duì)象的狀態(tài)圖為系統(tǒng)狀態(tài)圖時(shí),按每個(gè)協(xié)作圖中的消息順序,對(duì)每一條消息進(jìn)行遍歷,每條消息與兩個(gè)對(duì)象相關(guān)聯(lián),消息分別對(duì)應(yīng)關(guān)聯(lián)對(duì)象的事件與動(dòng)作。
分別取飲料銷售機(jī)的3個(gè)對(duì)象的初始狀態(tài)作為系統(tǒng)狀態(tài)圖的初始狀態(tài),即a0b0c0,首先遍歷飲料已賣完場(chǎng)景協(xié)作圖的消息序列:由于消息display screen,只與前端和顧客有關(guān),因此狀態(tài)變?yōu)閍1b0c0;同樣消息 insert()、request()、enter()也都只與前端和顧客有關(guān),因此只有前端改變狀態(tài),下一條與對(duì)象前端和飲料分配器關(guān)聯(lián)的消息get-CustomerInput()狀態(tài)變?yōu)閍5b1c0,按照該方法遍歷該協(xié)作圖余下消息;然后遍歷關(guān)聯(lián)協(xié)作圖的消息序列,即顧客塞入零錢有誤場(chǎng)景協(xié)作圖,在消息checkAvailability()之前狀態(tài)變化都與上一個(gè)協(xié)作圖相同,到達(dá)了狀態(tài)a5b2c1,下一條消息availability(),狀態(tài)變?yōu)閍5b5c3,在狀態(tài)a5b2c1產(chǎn)生分支,按照該協(xié)作圖消息序列遍歷下去,就生成了飲料銷售機(jī)的狀態(tài)圖,如圖7所示。
協(xié)作圖強(qiáng)調(diào)對(duì)象的結(jié)構(gòu)組織和它們之間消息的發(fā)送和接收,筆者以類圖和協(xié)作圖作為基礎(chǔ)模型,首先分析了協(xié)作圖的語(yǔ)義信息,然后采用OCL對(duì)消息添加約束規(guī)約,從中提取相關(guān)信息自動(dòng)生成狀態(tài)圖。進(jìn)行消息的語(yǔ)義約束時(shí),對(duì)文獻(xiàn)[4]中時(shí)序圖消息的發(fā)送和接收對(duì)象狀態(tài)變量的變化未明確定義的問(wèn)題進(jìn)行了改進(jìn),強(qiáng)調(diào)只有接收消息才能使對(duì)象的狀態(tài)發(fā)生改變;轉(zhuǎn)換過(guò)程中,考慮到系統(tǒng)狀態(tài)變化來(lái)自多個(gè)協(xié)作圖場(chǎng)景,選擇了多個(gè)關(guān)聯(lián)協(xié)作圖場(chǎng)景進(jìn)行模型轉(zhuǎn)換,解決了文獻(xiàn)[5]中場(chǎng)景單一的問(wèn)題,根據(jù)上述方法能精確地捕捉協(xié)作圖中的語(yǔ)義信息生成狀態(tài)圖。生成的狀態(tài)圖具有較高的結(jié)構(gòu)化和可讀性,并可用于測(cè)試用例生成。
圖7 飲料銷售機(jī)的狀態(tài)圖
[1] 顏炯,王戟,陳火旺.基于模型的軟件測(cè)試綜述[J].計(jì)算機(jī)科學(xué),2004,31(2):184-187.
[2] KUNDU D,SAMANTA D.A novel approach to generate test cases from UML activity diagrams[J].Journal of Object Technology,2009,8(3):66-83.
[3] 史耀馨,崔萌,李宣東,等.基于MDA的UML模型轉(zhuǎn)換技術(shù):從順序圖到狀態(tài)圖[J].計(jì)算機(jī)工程與應(yīng)用,2004,40(13):40-45.
[4] 袁海,李宣東,鄭國(guó)梁.從UML順序圖生成狀態(tài)圖的一個(gè)方法[J].計(jì)算機(jī)科學(xué),2003,30(6):155-161.
[5] 馬偉,張毅坤.基于UML時(shí)序圖的集成測(cè)試序列自動(dòng)生成[J].計(jì)算機(jī)工程與應(yīng)用,2005,41(19):108-111.
[6] YUE T,BRIAND L,LABICHE Y.An automated approach to transform use cases into activity diagram[C]//Sixth European Conference on Modelling Foundations and Application(ECMFA).Paris:[s.n.],2010:337-353.
[7] YUE T,ALI S,BRIAND L.Automated transition from use cases to UML state machines to support statebased testing[C]//Accepted for Publication in Seventh European Conference on Modelling Foundations and Application(ECMFA).Birmingham:[s.n.],2011:336-342.
[8] BINDER R V.面向?qū)ο笙到y(tǒng)的測(cè)試[M].華慶一,譯.北京:人民郵電出版社,2001:47-62.
[9] 董玉村,李村合.基于UML協(xié)作圖的集成測(cè)試序列生成方法[J].計(jì)算機(jī)工程與應(yīng)用,2007,43(5):96-98.
[10] 陳卉.UML順序圖和狀態(tài)圖的形式化方法研究[D].南京:南京師范大學(xué)圖書館,2008.