2010-10-27 75 views
1

我正在開發一個庫,需要測試它。在我的類中定義了幾個操作(作爲函數),可以按客戶端的任何順序調用它們。生成隨機測試用例

Operation1(param1, param2) 
Operation2(param3) 
. 
. 
. 
OperationN(paramX, paramY, paramZ) 

參數1,參數2等是整數/雙

現在,我想編寫一個測試代碼隨機化操作的執行,使得M動作的順序將隨機進行的。每次調用操作時,都需要隨機生成參數。

在Java中這樣做的最好方法是什麼?

+3

如果你確實按照隨機生成​​的測試路線走下去,重要的是它們仍然是可重複的。大多數隨機生成器允許您指定用於生成隨機性的種子,以便如果您的測試產生了錯誤,那麼可以通過爲它提供相同的種子來重新運行完全相同的測試。否則,你將運行不同的測試,並不知道你是否已經解決了問題。 – Nick 2010-10-27 10:16:00

+0

我正在計劃記錄隨機生成的序列。 – devnull 2010-10-27 10:17:29

+0

這是不夠的。你需要能夠在修復一個bug之後再運行*相同的「隨機」測試序列*,或者簡單地作爲迴歸。如果測試是真正的隨機測試,那麼您無法知道給定的運行是否會執行將會失敗的組合。 – 2010-10-27 10:39:20

回答

1

隨機化測試似乎很有吸引力,因爲它們似乎可以避免編寫大量單獨的測試。問題是,你永遠無法確定隨機序列會碰到可能失敗的邊緣情況等。國際海事組織他們不能取代精心設計和實施的白盒測試。

對於像您這樣的情況,我嘗試設計一堆測試助手,以便輕鬆構建輸入數據結構。例如一個簡單的語言+解析器,它允許我將輸入和期望的輸出表示爲文本,嵌入到單元測試用例中或作爲單獨的文件。

+0

「你永遠不能確定隨機序列會碰到邊緣情況」隨機測試數據的一個優點是,它使你有機會檢測邊緣情況的錯誤處理,這些邊緣情況你沒有想到。我同意他們不能替代良好的單元測試。 – Raedwald 2011-09-08 16:01:23

1

您需要的操作,如

public interface Operation { 
    public void do(); 
} 

創建要執行一個類實現該接口的每個操作的接口。各個參數可以傳遞給構造函數。

然後將所有實例放入類型操作的列表中,隨機化它並遍歷它。

List<Operation> ops = new Vector<Operation>(); 
ops.add(new ...); 
Collections.shuffle(); 
for (Operation o: ops) { 
    o.do(); 
}