• 沒有找到結果。

欲決定各軟體代理人間的測試順序及軟體代理人內程式之測試路徑安排,必 須先蒐集足夠的資訊後,因此必須先剖析每一個軟體代理人的程式碼,並取得且 儲存下列的資料:

1. 軟體代理人只有一核心的類別,由此類別來負責整個軟體代理人的邏輯 運作,以 IBM Aglets 為例,核心類別會繼承 Aglet 類別[6],如圖 4- 1 所示,因此可將該類別的名稱視為軟體代理人的名稱。

圖 4- 1 核心類別接下來必須從軟體代理人程式碼找出該軟體代理人所具有的 特性,軟體代理人之特性與程式碼之關係性討論如下:

i. 行動力:以 IBM Aglets 為例,如圖 4- 2 所示,程式碼中有 Dispatch 指令,表示軟體代理人具有行動力的特性,將其程式碼位置與遷徙 地點(變數或常數)存入行動力資料表中,如表 4- 1 所示。

表 4- 1 行動力資料表

圖 4- 2 行動力程式範例

ii. 合作能力,可以分成三個合作的方式來討論:

a. 產生子軟體代理人:如圖 4- 3 所示,以 IBM Aglets 之 createAglet

圖 4- 3 產生者的程式範例

指令執行時將產生軟體代理人,它的三個參數,分別代表被產 生者程式碼所在路徑、被產生者核心類別名稱、輸入給被產生 者的資料,而從被產生者核心類別名稱代表被產生的軟體代理 人名稱,產生動作代表軟體代理人間的主從關係。由此指令,

可將被產生的對應軟體代理人名稱、程式碼的位置以及輸入給 被產生者的資料存入產生資料表中,如表 4-2 所示,另外,藉 由產生的指令可以得到被產生軟體代理人的 Proxy,因此可以

將 Proxy 名稱與所對應的軟體代理人名稱存入 Proxy-軟體代 理人對應資料表中,如表 4- 3 所示。

表 4- 2 產生資料表

表 4- 3 Proxy-軟體代理人對應資料表 b. 訊息傳遞分成兩個部分:

(1) 訊息傳遞的動作,可分成傳送跟接收:

甲、傳送:

同步傳送:圖 4- 4 所示為 sendMessage 同步傳送的指令,

根據左邊是否回應(Reply)物件可來判斷是否會回傳結 果,可將動作指令(sendMessage)、回傳物件名稱 (reply)、Proxy 名稱(proxy)、訊息(Hello),以及程式 碼位置存入傳送資料表,如表 4- 4 所示。

圖 4- 4 同步傳送的程式範例

表 4- 4 傳送資料表

非同步傳送:圖 4- 5 所示為 sendFutureMessage 非同步傳 送指令,根據左邊是否(FutureReply)物件可來判斷是否 會回傳結果,可將動作指令(sendFutureMessage)、回傳

物件名稱(reply)、Proxy 名稱(proxy)、訊息(Hello),

以及程式碼位置存入傳送資料表。

圖 4- 5 非同步傳送的程式範例

群播:如圖 4- 6 所示之 multicastMessage

圖 4- 6 群播的傳送者與接收者程式範例

群播指令,根據左邊是否有宣告非同步回應(FutureReply) 物件來判斷是否會回傳結果,若沒有的話,將動作指令 (sendFutureMessage)、回傳物件名稱(reply)、message (Hello),以及程式碼位置存入傳送資料表。

乙、接收:如圖 4- 7 所示,根據 exitMonitor,可找出 handleMessage 函式內的那些路徑為並行式的處理路

徑,將所有的 message 以及是否並行存入接收資料表,如 表 4- 5 所示。

圖 4- 7 並行式訊息處理的程式範例

表 4- 5 接收資料表

(2) 建立訊息傳遞的管道的方式,可分成兩種:

甲、利用 Proxy 來建立,只要用到有宣告 Proxy 的指令,將該 Proxy 的名稱加入 Proxy-軟體代理人對應資料表,由取得 Proxy 的方法來討論:

由產生其他軟體代理人得來的 Proxy,前面討論產生 時已經說明,如何加入 Proxy-軟體代理人資料表。

如圖 4- 8 所示,由 proxy 的物件宣告可知是由起始物 件取得的,表示由產生者在產生時利用參數輸入,但單只 有剖析該軟體代理人無法得知 Proxy 對應的軟體代理

人,則先建立該軟體代理人的起始 Proxy 資料表,如表 4- 6 所示,將自己的軟體代理人名稱以及 Proxy 名稱存入 其中。

圖 4- 8 起始 Proxy 的程式範例

表 4- 6 起始 Proxy 資料表

如圖 4- 9(A)所示,由 proxy 的物件宣告的等式中可 知是由利用 getProperty 和 key 來取得,並透過建立參數 的宣告資料表,比對出 key 為變數或常數,將 key(參數 或常數)、proxy 的名稱存入該軟體代理人的 get 資料表 中,如表 4- 7 所示;或是如圖 4- 9(B)所示,利用

setProperty 和 key 來註冊自己的 Proxy,並透過建立參 數的宣告資料表,比對出 key 為變數或常數,將 key(參 數或常數)存入該軟體代理人的 set 資料表中,如表 4- 8 所示。

表 4- 7get 資料表

表 4- 8set 資料表

圖 4- 9 get-set 的程式範例

透過訊息傳遞得來,只針對利用 sendMessage 去要 proxy 的方式來處理,如圖 4- 10 所示,則建立 ask 資料 表,將被要求的 Proxy 名稱,與回傳 Proxy 的名稱存入 ask 資料表,如表 4- 9 所示。

圖 4- 10 要求回傳 Proxy 的程式範例

表 4- 9 ask 資料表 乙、利用訊息來建立

只有 multicastMessage 可以利用訊息來建立訊息傳

遞的管道,而 multicastMessage 的指令皆已儲存在軟體 代理人的傳送資料表中,所以只需建立訂閱資料表,如表 4- 10 所示,來紀錄軟體代理人程式碼中所訂閱的訊息(變 數或常數)。

表 4- 10 訂閱資料表

(3) 發送:可找出透過 Proxy 執行 dispath 的指令,且可知發送指 令都是由產生者發送給被產生者,因此可以得知被發送的軟體 代理人,所以建立發送資料表,如表 4- 11 所示,來儲存被發 送軟體代理人名稱、發送地點(變數或常數),以及程式碼位置。

表 4- 11 發送資料表

3. 因為學習能力並非軟體代理人的標準指令,所以無法從程式碼的剖析中 得知軟體代理人是否具有學習能力,當剖析完一個軟體代理人後,則詢 問測試者,該軟體代理人是否具有學習能力以及它的知識庫名稱,並將 知識庫名稱儲存在學習能力資料表中,如表 4- 12 所示。

表 4- 12 學習能力資料表

4. 建立軟體代理人 Node 的資料結構,如表 4- 13 所示,包含:

ii. 軟體代理人名稱為軟體代理人的核心類別名稱。

iii. 主從位元為 0 或 1,起始值皆為 0,一旦成為其他軟體代 理人的 Slave 則變為 1,所以只有主從關係架構最上層的軟體 代理人會為 0。

iv. 行動力:為一個連結,負責連結到行動力資料表。

v.學習能力:為一個連結,負責連結到學習能力資料表。

vi. 合作能力:可分成四種連結:產生、發送、傳送以及接收,分 別連接到對應的資料表。

vii. Proxy:負責儲存所有取得的 Proxy 相關的資料,可分成 六種連結:起始、get、set、ask、訂閱以及 Proxy,分別連 接到對應的資料表。

viii. Slave List:存放與被該軟體代理人產生的 Slave 的 Node 之連結(Slave Link),若有多個則產生對應的連結數目。

ix. Provider List:存放被該軟體代理人傳送的 Provider 的 Node 之連結(Provider Link),若有多個則產生對應的連結數目。

表 4- 13 軟體代理人的資料結構

5. 根據軟體代理人是否具有行動力、學習能力、合作能力的資料連結,可 判斷軟體代理人具有哪些特性。

6. 因為除了產生以外,其他取得 Proxy 的方式皆無法只單由剖析單一軟體

代理人程式就可得知 Proxy 對應的軟體代理人,所以等到所有軟體代理 Proxy-軟體代理人對應資料表,找出所有對應這個 Proxy 名稱 的軟體代理人名稱,依據軟體代理人名稱取出從它的

Link,則產生樹狀的主從關係架構,由有多少個主從位元為 0 的 Node,

便可知道有多少個主從關係架構。

8. 根據傳送的資料表,取出對應的 Proxy 名稱,來與 Proxy-軟體代理人 對應資料表比對,找出所有對應這個 Proxy 名稱的軟體代理人,來建立 Provider Link。藉由每個軟體代理人的傳送資料表取出群播的訊息,

與其他軟體代理人的訂閱資料表比對訊息,若訊息為常數則找出所有訊 息相同的軟體代理人,來建立 Provider Link,若訊息為變數,則找出 所有具有訂閱訊息的軟體代理人,來建立 Provider Link。

10. 若有多個主從位元為 0 的 Node,則檢查它們的主從關係架構內 Slave 間是否具有供需關係,若有則建立兩個 Node 間的 Provider Link。

相關文件