一個描述用例實現的實例級協作圖上用于建模的元模型包括:類元角色名、關聯角色名、對象符號、鏈接符號、消息符號、鏈上的約束等。對象框能夠表示參與協作中交互的對象,鏈表示這些對象之間的結構關系,消息的箭頭形狀表示協作對象間的通信模式和對象的執行特征, 消息標簽表示對一個對象的操作調用的允許順序的實例、操作的語義。在實際的建?;顒又杏行┰夭⒉辉谀P蜕戏从?,例如圖1的協作圖只表示了協作中參與的對象和對象之間的消息,這是表示對象交互的最小元素集。本文關注協作圖表示的動態行為的測試,前面提到協作圖上表示交互的主要元素是消息,下面詳細介紹消息。
協作圖中的消息用帶有消息標簽的箭頭表示,附在連接發送者和接受者的鏈上,鏈用于訪問目標對象,箭頭沿著鏈指向接受者,一個鏈上可以有多個消息,沿著相同或不同方向傳遞,消息的相關順序由消息標簽中的順序號表示。按照UML1.5[5]中提出消息箭頭有三種形狀表示對象之間的通信方式和控制流類型:實線實心箭頭表示同步消息,用于表示過程調用和嵌套控制流,每次調用增加一個嵌套層次;刺狀箭頭表示平面控制流,是異步通信,無嵌套,表示前驅-后繼關系,指向下一步驟;虛線刺狀箭頭表示從過程調用返回。圖1中的消
圖1 ATM建立一次會話的實例的協作圖
息都是帶有刺狀箭頭的實線,表示前驅/后繼關系。消息標簽說明發送的消息、發送的條件、由消息激活的方法、相應的參量和返回值,以及交互中的消息順序,包括調用嵌套、迭代、分支、并行和同步,完全格式消息標簽的語法[5]中有詳細的定義。其語法如下:
[predecessor][guardcondition][sequence-expression][return-value-list]:=message-name(argument)
[predecessor]表示前驅,在協作中前驅是用逗號隔開的順序號列表,并后跟“/”;[guardcondition]表示線程同步的衛式條件;[sequence-expression]表示順序項列表每一項表示交互中的一個嵌套層次,如果所有的控制并行則無嵌套;整數表示過程調用中的相鄰高層中的消息的順序,同一整數項中的不同消息在嵌套層是順序相關的,同一前綴的消息順序號構成序列。循環表示條件或迭代執行,表示根據條件執行零個或多個消息;[return-value-list]在有返回值的情況下表示消息返回值的名稱,名稱之間用逗號隔開,可以作為后續消息的參量;message-name 表示目標對象中引發的事件名稱,可以用不同的方式實現,如操作調用;Argument 是消息引發的方法的參量列表。
圖2 圖1 ATM用戶驗證的類圖
消息上的條件增加了消息的表達能力,也增加的消息復雜度,消息上的條件有幾種形式:在一個新的調用層次開始,如圖1中消息標簽4.1[isMemberCard]feeAmount:=getfeeAmount()所示:4.1表示一個新的調用序列,條件成真時該層次的消息順序發送,否則都不發送;在順序發送的消息上,例如消息1.3中,[!isATMCard]條件表示二值條件,條件成真時其后的消息eject()執行一次,否則不執行,對其他消息沒有影響;在一個表示迭代的嵌套調用消息開始,如消息3.1.1表示了一個迭代執行多個消息的情況,根據validPIN和n的取值可能發送1或2次消息。
這些協作圖上的模型元素所表示的軟件系統的不同方面的信息,都是系統的本質信息,需要在軟件從設計到實現過程中必須保持的,因而軟件實現中的行為的本質方面都會在設計中表示,所以可以從設計表示中獲取行為方面的信息,用于確認軟件實現中是否正確實現。
2.2場景路徑
一個表示用例實現的協作圖實現了用例的不同事件流,包括正常流和異常流,每個事件流稱為一個場景,這些場景都被相應的協作圖實現。一個協作圖所表示的協作正是從一個外部事件觸發開始,在參與協作的對象之間完成一系列的交互,最后正確的協作結束時都導致一個外部輸出 ,對應于一個實際場景,也是一個線程執行的路徑。要找到這些路徑,一般的方法是將協作圖轉換為流圖,然后在流圖上使用圖遍歷的方法達到路徑覆蓋從而得到所有的路徑。本文為了避免復雜流圖的轉換和不可行路徑的遍歷開銷,試圖直接從協作圖上獲取這些路徑。我們從Paul C. Jorgenson[4]定義原子系統功能(ASF)和方法/消息路徑(MM-path)得到啟發,本文定義了一個場景路徑(scenario-path):
定義 場景路徑(scenario-path,s-path)是協作圖上從一個沒有前驅消息的消息開始,沿著消息的偏序執行序列,到達一個沒有后繼的消息結束的由消息相連的方法執行序列。
原文轉自:http://www.anti-gravitydesign.com