摘要:主要介紹了面向?qū)ο筌浖念悳y試技術(shù)。從基于對象狀態(tài)方面分析UML狀態(tài)圖的組成、并發(fā)的優(yōu)點,描述繼承的對象動態(tài)行為、并發(fā)的動態(tài)行為,給出利用UML狀態(tài)圖構(gòu)造復(fù)合狀態(tài)測試樹算法并產(chǎn)生測試用例的面向?qū)ο筌浖y試方法。
關(guān)鍵詞:UML;測試用例;類測試;面向?qū)ο螅粻顟B(tài)圖
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)35-2169-02
The Software Testing Methods of Object State Based on Statechart
LIU Jia, YIN Zhi-ben
(School of Information Science and Technology, South West Jiao Tong University, Chengdu 610031 China)
Abstract: Introduces the class testing of object-oriented software. An example is cited to account for an object-oriented software testing method based on UML, which constructs testing use-case according the state that the objects are being and the transfer among object states.
Key words: UML; test case; class testing; object-oriented; statechart
1 引言
面向?qū)ο筌浖y試的主要目標(biāo)與傳統(tǒng)軟件測試目標(biāo)相同,既是用最小的工作量發(fā)現(xiàn)最多的錯誤。由于面向?qū)ο笏氂械亩鄳B(tài)、繼承、封裝等新的特點,使面向?qū)ο鬁y試的策略和技術(shù)與傳統(tǒng)測試有所不同,測試的視角擴(kuò)大到包括復(fù)審分析和設(shè)計模型,測試焦點從模塊轉(zhuǎn)向類。類是構(gòu)成面向?qū)ο蟪绦虻幕境煞?,類的測試無疑成為面向?qū)ο?測試的重要環(huán)節(jié)?;趯ο鬆顟B(tài)的測試是根據(jù)被測試的類的對象所處的狀態(tài)以及狀態(tài)之間的轉(zhuǎn)移來構(gòu)造測試用例,它側(cè)重于對象的動態(tài)行為,這種動態(tài)行為依賴于對象狀態(tài)。測試對象動態(tài)行為能檢測出對象成員函數(shù)之間通過對象狀態(tài)進(jìn)行交互式產(chǎn)生的錯誤。
2 基于對象狀態(tài)的測試方法的發(fā)展
現(xiàn)在面向?qū)ο鬁y試中基于對象狀態(tài)的測試方法一般是采用扁平狀態(tài)機(jī)和狀態(tài)遷移圖。扁平狀態(tài)機(jī)能很好的提示出一些類中的錯誤,但是隨著類的狀態(tài)屬性的增加,對象狀態(tài)的數(shù)目會迅速膨脹,大大增加測試的復(fù)雜度。狀態(tài)轉(zhuǎn)移圖用于刻畫對象響應(yīng)各種事件時狀態(tài)發(fā)生轉(zhuǎn)移的情況,容易借助于自動機(jī)理論來選擇測試時所用的時間序列和預(yù)測對象的狀態(tài)變化結(jié)果序列,但是,它難于描述繼承的對象動態(tài)行為、并發(fā)的動態(tài)行為以及由數(shù)據(jù)成員和成員函數(shù)構(gòu)成的對象狀態(tài)和對象狀態(tài)轉(zhuǎn)移。基于UML的狀態(tài)圖可以很好的描述對象動態(tài)行為、并發(fā)的動態(tài)行為,可以把狀態(tài)的復(fù)雜度控制在和狀態(tài)屬性相關(guān)的線性級別,下面我們主要介紹利用UML狀態(tài)圖如何描述對象動態(tài)行為、并發(fā)的動態(tài)行為,以及如何產(chǎn)生測試用例。
3 UML狀態(tài)圖
UML狀態(tài)圖(State Diagram)是UML中對系統(tǒng)的動態(tài)行為進(jìn)行建模的表示方法,它包括對反應(yīng)型對象的行為建模。它展現(xiàn)了對象生命周期內(nèi)可能處于的狀態(tài)以及在這些狀態(tài)間轉(zhuǎn)換的激發(fā)條件。UML狀態(tài)圖中引起狀態(tài)遷移的原因通常有兩種,一種是在狀態(tài)圖中相應(yīng)的遷移上未指明事件,這表示當(dāng)位于遷移箭頭源頭的狀態(tài)中的內(nèi)部動作全部執(zhí)行完后,該狀態(tài)遷移被自動觸發(fā);另一種是,當(dāng)出現(xiàn)某一事件時會引起狀態(tài)的遷移,在狀態(tài)圖中把這種一起狀態(tài)遷移的事件標(biāo)在改前一的箭頭上,如圖1。
圖1 狀態(tài)裝換
狀態(tài)遷移的形式化語法為:
event_signsture[guard_condition]/action_expression^send_clause
其中事件特征event_signsture是由事件名后括號括起來的參數(shù)表組成,它指出觸發(fā)遷移的事件以及與該事件相連接的附加數(shù)據(jù)。guard_condition警戒條件是一個布爾表達(dá)式,如果狀態(tài)遷移中既有事件又有警戒條件,則表示僅當(dāng)這個事件發(fā)生并且警戒條件為真時,觸發(fā)狀態(tài)遷移。動作表達(dá)式action_expression是一個觸發(fā)狀態(tài)遷移時可執(zhí)行的過程表達(dá)式,表達(dá)式中可引用該狀態(tài)所擁有的對象中的屬性、操作或事件特征中的參數(shù)。發(fā)送子句send_clause是動作的一種特殊情況,用來說明在兩個狀態(tài)的遷移期間發(fā)送的消息。
UML狀態(tài)圖的優(yōu)點在于它支持嵌套和并發(fā)。UML狀態(tài)圖中包含基本狀態(tài)(basic state)和復(fù)合狀態(tài)(composite state),復(fù)合狀態(tài)分為或狀態(tài)(or-state)和與狀態(tài)(and-state)?;驙顟B(tài)的子狀態(tài)之間是相互排斥的或關(guān)系,表示在任一時刻這些子狀態(tài)中只有一個子狀態(tài)為真;與狀態(tài)的子狀態(tài)之間是并發(fā)的非相互排斥關(guān)系,與狀態(tài)表示一個狀態(tài)可以有多個并發(fā)的子狀態(tài),并發(fā)子狀態(tài)之間用虛線分隔,用虛線分隔的每個區(qū)域表示一個并發(fā)的子狀態(tài)。把狀態(tài)屬性看成并發(fā)的子狀態(tài),從而可以把狀態(tài)圖的復(fù)雜度控制在線性級別上。并發(fā)狀態(tài)圖中一個事件可能引起多個子狀態(tài)的狀態(tài)遷移。如圖2中的CVM就是一個或狀態(tài),它的子狀態(tài)OFF和ON之間是相互排斥的關(guān)系,ON狀態(tài)就是一個與狀態(tài),當(dāng)處于ON狀態(tài)時,就意味著同時處于COFFEE和MONEY兩個子狀態(tài)。
由于UML狀態(tài)圖支持嵌套和并發(fā),這就使得它比以往的狀態(tài)轉(zhuǎn)移圖能更好的描述繼承的對象動態(tài)行為、并發(fā)的動態(tài)行為以及由數(shù)據(jù)成員和成員函數(shù)構(gòu)成的對象狀態(tài)和對象狀態(tài)轉(zhuǎn)移。UML狀態(tài)圖中可以包含復(fù)合狀態(tài)這就使得它可以把狀態(tài)的復(fù)雜度控制在和狀態(tài)屬性相關(guān)的線性級別。下面我們討論如何從UML狀態(tài)圖構(gòu)造一棵復(fù)合狀態(tài)測試樹。
4 構(gòu)造復(fù)合狀態(tài)測試樹
與以往的測試樹不同的是復(fù)合狀態(tài)測試樹的每個節(jié)點代表對象的復(fù)合狀態(tài)既對象的各個屬性的集合,邊表示狀態(tài)間的遷移,根節(jié)點代表對象的初始屬性集合。
構(gòu)造一個隊列queue來存放復(fù)合狀態(tài)測試樹的各個節(jié)點。
1)把UML狀態(tài)圖的起點讀入隊列queue。
2) 以UML狀態(tài)圖的起點定義根節(jié)點TestTree root,同時把節(jié)點標(biāo)識treeNode置為對象的初始狀態(tài),nodelevel置為0,t和childTree置為NULL,把root放入隊列中。
3) 取隊列頭部的節(jié)點設(shè)為head,搜索從head節(jié)點所對應(yīng)的狀態(tài)(head.treeNode)發(fā)出的狀態(tài)前移以及前移置的目標(biāo)狀態(tài),分別填充head.t和head.childTree,即把遷移至的狀態(tài)作為head的子節(jié)點;同時置好各個子節(jié)點的屬性值,nodeLevel=head.nodeLevel+1,從root節(jié)點開始層次遍歷測試樹(從第0層至head.nodeLevel層),如果在head的子節(jié)點中存在某個節(jié)點n,其所對應(yīng)的狀態(tài)已經(jīng)在第0層至head.nodeLevel層中出現(xiàn)過,則該節(jié)點n不再擴(kuò)展,即為葉子節(jié)點。把其他沒有出現(xiàn)過的子節(jié)點加入到隊列的尾部。
4) head指向隊列中的下一個節(jié)點,重復(fù)第二步,直至隊列為空。
在3)中,如果 某個遷移對應(yīng)的目標(biāo)狀態(tài)已經(jīng)在測試樹中出現(xiàn)過,就不再考慮這個狀態(tài),不加入到隊列尾部。這樣有效地避免了重復(fù)構(gòu)造節(jié)點,同時又不降低測試的覆蓋率。通過上述步驟就可以構(gòu)造出UML狀態(tài)圖對應(yīng)的測試樹。
復(fù)合狀態(tài)樹構(gòu)造算法能很好的支持多個并發(fā)的子狀態(tài)的情況,只是節(jié)點表示為并發(fā)子狀態(tài)的合集;如果某個事件觸發(fā)其他事件從而引起一系列的狀態(tài)遷移時,只要把最終的狀態(tài)作為節(jié)點加入到測試樹中。比以往的插入樁模塊更容易實現(xiàn)。
通過測試樹可以很容易的構(gòu)造出測試用例。從根節(jié)點開始沿著各個分支往下知道葉子節(jié)點,每條這樣從根節(jié)點開始到某個葉子節(jié)點結(jié)束的路徑上的事件按順序組合在一起,就成為基于對象狀態(tài)測試的一個測試用例。如果增加對象屬性可以很容易的在復(fù)合狀態(tài)測試樹中增加,增加屬性后可以把狀態(tài)的復(fù)雜度控制在和狀態(tài)屬性相關(guān)的線性級別,測試時不僅可以單獨的對對象的每一個屬性和所有屬行進(jìn)行測試,也可以對對象的所有屬性任意選擇組合進(jìn)行測試。大大增加了測試的靈活性。
5 結(jié)束語
UML的狀態(tài)圖支持潛逃和并發(fā),把狀態(tài)的復(fù)雜度控制在和狀態(tài)屬性相關(guān)的線性級別;其次UML狀態(tài)參數(shù)圖是在面向?qū)ο筌浖_發(fā)的生命周期中的早期設(shè)計階段確定的,是對對象狀態(tài)的完整的描述,并不依賴于源代碼,既保證了狀態(tài)描述的完整性,又可以在開發(fā)早期進(jìn)行測試,盡早發(fā)現(xiàn)與狀態(tài)相關(guān)的錯誤,避免將錯誤帶入到后面的開發(fā)階段。因此可以用UML的狀態(tài)圖來產(chǎn)生有效的測試用例,這大大提高了測試的靈活性和有效性。
參考文獻(xiàn):
[1] 張克東,莊燕濱.軟件工程與軟件測試自動化教程[M].北京:電子工業(yè)出版社,2002.
[2] 劉金艷,藺娟茹,尹治本.面向?qū)ο筌浖y試的探討[C]//2002年全國軟件與應(yīng)用學(xué)術(shù)會議(NASAC)論文集.北京:機(jī)械工業(yè)出版社,2002:262-266.
[3] 楊小平.面向?qū)ο筌浖y試探討[J].計算機(jī)工程與應(yīng)用,2000,36(1):44-46.
[4] 姬瑩,羅鈞昊,鐘聯(lián)炯.面向?qū)ο筌浖y試主要問題的探討[J].西安工業(yè)學(xué)院學(xué)報,2001(1).
[5] Fewster M,Graham D.軟件測試自動化技術(shù)與實例詳解[M].舒智勇,譯.北京:電子工業(yè)出版社,2000.
[6] 葉仁召,鄭玉墻,魯漢榕.面向?qū)ο筌浖y試及度量的研究[J].計算機(jī)工程與設(shè)計.2001,22(4):21-24.
[7] 徐中偉,吳芳美.軟件測試質(zhì)量的度量[J].計算機(jī)工程與應(yīng)用,2002,38(2l):100-102.