方法論であるTDDが次のケースをどのように処理するかはわかりません。Pythonでmergesortアルゴリズムを実装するとします。私は書くことから始めます
assert mergesort([]) === []
そしてテストは失敗します
NameError:名前 'mergesort'は定義されていません
次に追加します
def mergesort(a):
return []
テストに合格しました。次に追加します
assert mergesort[5] == 5
そして私のテストは失敗します
AssertionError
私はパスします
def mergesort(a):
if not a:
return []
else:
return a
次に、追加します
assert mergesort([10, 30, 20]) == [10, 20, 30]
そして今、私はこの合格を試みなければなりません。mergesortアルゴリズムを「知っている」ので、次のように記述します。
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
そして、これは失敗します
NameError:名前 'merge'は定義されていません
ここで質問です。どうすればmerge
TDDを使用して実装を開始できますか?この「ハング」が満たされていないためmergesort
、テストが失敗し、終了するまで合格しmerge
ないため、私はできないようです!このテストがぶらぶらしていると、TDDの反復構築中に「グリーン」にならないため、TDDを実際に実行することはできませんmerge
。
私は次の3つのいシナリオに固執しているようで、(1)TDDコミュニティがこれらのどれを好むか、(2)私が見逃している別のアプローチがありますか?ボブおじさんのTDDのチュートリアルを何度か見たことがありますが、以前にこのようなケースを見たことを覚えていません!
以下に3つのケースを示します。
- 別のテストスイートを使用して、別のディレクトリにマージを実装します。
- ヘルパー関数を開発する際に環境に配慮する必要はありません。実際に合格したいテストを手動で追跡するだけです。
- コメントアウト(GASP!)または
mergesort
その呼び出しの行を削除しますmerge
。merge
仕事を始めたら、元に戻します。
これらはすべて私には馬鹿げているように見えます(または、私はこれを間違って見ていますか?)。誰もが好ましいアプローチを知っていますか?
mergesort
ます。これを行うための「正しい」方法を探している場合、mergesort
アルゴリズムの一連の単体テストへのマッピングについて正確にする以外に、それはありません。すなわち、彼らはmergesort
実際に何をすべきかを反映すべきです。
mergesort
デザインがred-green-refactorから自然に出現することを期待している場合、既存の知識に基づいてプロセスをガイドしない限り、それは起こりませんmergesort
。
merge
では、「リファクタリング」段階でのみ発明する必要があります。merge
テストに合格するためにメソッドを導入できる場合は、mergesort
最初にmerge
メソッドなしでテストに合格させます。次に、merge
メソッドを導入して実装をリファクタリングします。
mergesort
すでに非常に明確に定義されたアルゴリズムであるため、この発見プロセスは不要であり、設計であることがすでにわかっているものを一連の単体テストにマッピングする問題になります。おそらく、あなたのトップレベルのテストでは、テスト中のあなたの方法でソートされていないコレクションを受け入れて... 1ソート返すことを主張