我是TDD的忠實粉絲,現在用於我的絕大多數開發。然而,我經常遇到的一種情況是,從來沒有找到我認爲是「好」的答案,就像下面的(做作的)例子。開發TDD接口
假設我有一個接口,這樣的(用Java編寫,但實際上,這適用於任何面向對象的語言):
public interface PathFinder {
GraphNode[] getShortestPath(GraphNode start, GraphNode goal);
int getShortestPathLength(GraphNode start, GraphNode goal);
}
現在,假設我要創建此接口的三種實現。我們稱它們爲DijkstraPathFinder
,DepthFirstPathFinder
和AStarPathFinder
。
問題是,我如何使用TDD開發這三種實現?他們的公共接口將是相同的,並且,大概我會爲每個接口編寫相同的測試,因爲getShortestPath()和getShortestPathLength()的結果應該在所有三種實現中保持一致。
我的選擇似乎是:
寫一組針對
PathFinder
測試,我編寫了第一個實現。然後寫另外兩個實現「盲」,並確保他們通過了PathFinder
測試。這看起來不對,因爲我沒有使用TDD開發第二個實現類。以測試優先的方式開發每個實現類。這看起來不對,因爲我會爲每個班級編寫相同的測試。
結合以上兩種技術;現在我有一套針對接口的測試和一套針對每個實現類的測試,這很好,但測試都是一樣的,這並不好。
這似乎是一個相當常見的情況,特別是在實施策略模式時,當然實現之間的差異可能不僅僅是時間複雜性。其他人如何處理這種情況?有沒有一種針對我不知道的界面進行測試優先開發的模式?
我仍然有問題。我採取了測試駕駛兩個相同類的方法,然後重構爲一個通用接口。在添加第三個類時,我剪切了n-pasted測試,並通過將接口添加到類中來進行每次編譯並轉爲綠色。如果我的cut-n-pasting出錯了,這很容易出錯,但那不是我的問題。 現在我處於可以使用測試向一個類的接口添加功能的情況,但是該功能在其他類中將沒有測試來支持它。我必須記住要複製測試。這看起來不正確? – tenpn 2009-08-27 12:03:16