私は TDD の大ファンで、最近の開発の大部分で TDD を使用しています。ただし、私が頻繁に遭遇する状況の 1 つは、次の (不自然な) 例のようなものです。
次のようなインターフェースがあるとします (Java で記述していますが、実際には、これはどの OO 言語にも当てはまります)。
public interface PathFinder {
GraphNode[] getShortestPath(GraphNode start, GraphNode goal);
int getShortestPathLength(GraphNode start, GraphNode goal);
}
ここで、このインターフェースの 3 つの実装を作成したいとします。DijkstraPathFinder
それらを 、DepthFirstPathFinder
、および と呼びましょうAStarPathFinder
。
問題は、TDD を使用してこれら 3 つの実装をどのように開発するかということです。getShortestPath() と getShortestPathLength() の結果は 3 つの実装すべてで一貫している必要があるため、それらのパブリック インターフェイスは同じになります。おそらく、それぞれに同じテストを記述します。
私の選択は次のようです:
PathFinder
最初の実装をコーディングするときに、1 セットのテストを作成します。次に、他の 2 つの実装を「ブラインド」で記述し、それらがPathFinder
テストに合格することを確認します。2 番目の 2 つの実装クラスの開発に TDD を使用していないため、これは正しくないようです。テストファーストの方法で各実装クラスを開発します。クラスごとに同じテストを書くことになるので、これは正しくないようです。
上記の 2 つの手法を組み合わせます。これで、インターフェイスに対する一連のテストと、各実装クラスに対する一連のテストができました。これは良いことですが、テストはすべて同じであり、良いことではありません。
これは、特に Strategy パターンを実装する場合には、かなり一般的な状況のように思えます。もちろん、実装間の違いは時間の複雑さだけではありません。他の人はこの状況をどのように処理しますか? 私が認識していないインターフェイスに対するテスト ファースト開発のパターンはありますか?