1. Introduction
在許多軟體尚未上市之前,必需考慮一個重要的階段,這個階段就是軟體測 詴(Software Testing)[17],為何需要做軟體測詴?主要原因為在軟體的發展過程中,
可能因為與溝通不良造成規格不符或設計錯誤或是程式在撰寫時發生疏漏,軟體 測詴在軟體工程的生命週期為其中之一重要的階段,測詴主要的作用希望能夠找 出軟體是否與當初設計原意不符或是找出產品上的缺陷,提早在軟體上市之前修 改軟體,根據研究指出產品在交付給客戶後所需修改軟體錯誤的成本約為交付前 的 10 倍,軟體的品質越高之後所帶來維護的成本則會越低。
1.1 Concurrent Program
在循序(Sequential)結構的軟體上做測詴,所得到的結果往往是容易預料的,
即得到的結果可能只有一種,但在並行(Concurrent)架構的軟體測詴中,可能產 生的情況則無法預料,並行架構包含分散式系統(Distributed System),或是在單 一電腦環境下,分配多個並行程式或是執行緒同時來完成指定的任務,並行程式 的出現帶來了執行效能以及生產力的增加,但卻可能存在潛在非決定性的行為
(Non-deterministic behavior)[1]、[2]問題,所謂非決定性的行為是指有一並行程式 (Concurrent Program)P 包含輸入 x,將 P 拿來做執行多次,可能會產生多種不同 的結果,而因為並行程式存在潛在的非決定性行為將會出現多種可能的結果,而
2
這些結果會導致一些問題,如:相同輸入 x 代入並行程式 P 執行多次所得到的結 果都如預期,但是在未來的執行中難保不會出現一次未預期的結果,對於這個情 況若出現在已上市的產品上可能會影響系統整體的運作,損失難以估計,因為並 行程式的不確定性使得整體難以測詴。
在 並 行 程 式 的 測 詴 方 法 中 主 要 分 成 數 個 , 第 一 、 非 決 定 性 的 測 詴
(Non-deterministic Testing),非決定性測詴有幾個方式來測詴,第一種方式為最原 始的測詴方法,採用讓程式自由的去運行,運行多次希望找出程式可能潛在的錯 誤,但這個方法得到的結果可能為某些部分的執行情況一直出現,而某些部分的 執行情況卻從未產生,也就是為了要找出程式可能潛在的錯誤下,這個方式所得 到的執行情況涵蓋率不高,另一個非決定性測詴的測詴方法採用插入隨機延遲
(Random delay)在受測程式每個程式碼的前後位置上,這樣的測詴方式使得程式 的執行情況涵蓋率提升,但只能在小規模的程式得到較佳的涵蓋率,若是測詴在 大規模的程式得到的涵蓋率也無法達到百分之百,且由於插入延遲時間的關係,
導致整體的測詴時間花費極大,第二、決定性測詴(Deterministic Testing),決定 性測詴的目的為提供一仔細選擇過的序列按照此序列要求的執行順序讓程式執 行,根據執行的結果來判定是否為錯誤的情況,但也存在一個缺點就是若在小規 模的程式其執行情況較容易人力掌握,若是在大規模的程式執行情況則無法靠人 力掌握,第三、模組檢查(Model Checking)[3],模組檢查工具是用於軟硬體方面 的驗證,給予 系統屬 性 (System property, 又 稱作 Specification)以 及系統需求
3
(System requirements,又稱做 Model)帶入模組檢查工具,並會得到一解答有關於 驗證是否正確,第四、可達性測詴(Reachability Testing),可達性測詴是結合上述 兩種非決定性以及決定性測詴特性讓在測詴階段中先讓程式某部分同步化事件 照按照指定的順序執行,接著剩餘未執行完的部分則讓它自由隨機的運作,主要 優點在於能夠對並行程式所有的非決定性行為情況達到百分之百的掌握。
1.2 Dynamic Testing For
Single–Channel -Multiple-Receivers Asynchronous Message Passing
Programs
訊息傳遞[4]是一種溝通的形式使用在如:平行運算(parallel computing)、物件 導向程式(object-oriented programming)、行程間的通訊(Interprocess communication) 等..,行程(Process)或是物件(object)可以發送訊息到其他的行程,在訊息傳遞程 式系統中主要考量為可靠性(Reliability)、安全性(Security)以及訊息是否能按照當 初傳送的順序到達,常見的訊息傳遞系統如:Java RMI、Corba、SOAP,在訊息 傳遞系統設計上提供最原始運算為基本的發送(Send)以及接收(Receive)來達到溝 通 的 目 的 , 根 據 這 兩 種 運 算 主 要 分 為 兩 種 傳 輸 方 式 , 非 同 步 訊 息 傳 遞
(Asynchronous Message Passing)以及同步訊息傳遞(Synchronous Message Passing),
4
前者運作方式發送者執行發送運算不需等待接收者接收到訊息就可繼續運作而 接收運算則是必頇等待接收到訊息才可繼續動作,後者則是發送者執行發送運算 需等待接收者接收到訊息才能繼續執行下一步的動作,接收運算則頇等待接收到 訊息才能繼續動作,本篇論文旨在探討在非同步訊息傳遞且行程之間的溝通是透 過一個共同的 Channel,該 Channel 接收的順序是採用先進先出(FIFO),允許多 個發送者以及接收者(Multiple Sender/Multiple Receiver)同時對 Channel 做接收
( 發送 ) , 然 而 在 這 些 情 況 下 可 能 會 有 潛 在 的 非 決 定 性 行 為 (Nondeterministic behavior)由於訊息競爭(message race)在同一 Channel 上,會出現未預期的結果,
這些結果未必是我們所需要的,不幸的是,相關論文上僅有討論對 Multiple
Sender/Single Receiver 架構的訊息傳遞程式做測詴[7]、[16],並沒有相關論文討 論測詴在 Single-Channel-Multiple-Receivers 訊息傳遞程式上做測詴。
對於出現在非同步訊息傳遞上的非決定性行為,在論文中採用可達性測詴 的架構,可達性測詴[9]、[10]可有效的克服非決定性行為,對於執行中的可能情 況透過可達性測詴所能產生的執行情況優於非決定性以及決定性測詴方法,並且 對其收集來的資訊作分析的動作,可得到該程式可能產生的結果以及這些結果是 藉由執行那些執行情況所產生的,這些數據有利於分析判斷程式設計時是否有潛 在的非決定性行為以及那些錯誤的結果所執行的情況可以在設計中避免執行到 這些部分,但由於傳統的可達性測詴並不適用在訊息傳遞環境下的測詴,原因歸 咎於可達性架構所設計的情況是針對共享記憶體(share memory)裡的 read 和 write
5
事件,若使用在[9]所提出的方法會出現死結(Dead lock)的情況,必頇得針對訊息 傳遞程式運算的特性做修改,才得以方便做測詴。
本論文建構在非同步訊息傳遞程式的測詴沿用舊有的可達性測詴機制,像是 以前綴為基礎(Prefix Based Replay)技術、競爭情況分析(Race Analysis),並為了 模擬在分散式環境下測詴所以增加協調者伺服器(Coordinator Server),協調者的 目的為負責控制在執行測詴時共用變數的設定,因為是在分散式環境中事件之間 的執行順序必頇仰賴第三方來做紀錄。最後我將我所提出的理論,利用 Java 程 式語言實作他,並利用數個例子做測詴來驗證理論的正確性。
本篇論文組織如下,第二章節會針對並行測詴以及訊息傳遞測詴上相關文獻 做討論,第三章節會提到藉由修改舊有的可達性測詴架構,來達到在非同步訊息 傳遞程式上做測詴,第四章節則會提到如何在執行中收集訊息傳遞程式同步化事 件的資訊,第五章節提到將執行時收集的資訊做競爭情況的分析,採用的是競爭 分析演算法,第六章節會提到利用 java 將這個測詴方法實作出來並且使用其他 的測詴方法與我設計的方法利用測詴一些例子所得到的數據來作比較分析優缺 點,第七章節則是結論與未來展望。
6