何よりもまず、初期費用はあなたが思っているほど高くありません。はい。テストを行わない場合よりも、テストに対処するのに時間がかかります。しかし、「テスト後」メソッドを実行すると、実際に何が無駄になりますか?TDDに10時間かかり、DDTに6時間かかるとします。「追加の」初期費用はわずか4時間です。コードメトリックまたは90%カバレッジなどの要件を適用すると、TDDとDDTのコストがさらに近くなります。
TDDを使用すると、バグの少ないコードを記述できます。テストとして要件を詳しく説明したからといって、1日の終わりに、コードが意図したとおりに動作していることを証明できます。おそらく、あなたはそれが間違ったことをしたかったのかもしれませんが、それは変更要求であるバグではありません。これは重要。動作している製品を「販売」するのは簡単ですが、異なる/より良い動作をする可能性があります。次に、動作していないと思われる製品を販売することです。TDDでは、テストに合格して動作しないコードを書くことは文字通り不可能です。要件を理解していない可能性があり、間違っているが動作するコードを書いている可能性があります。
TDDは、コードベースが古いほど優れています。テストスイートなしで、または実装が不十分なリファクタリングを試してください。簡単な変更でもバグが発生する可能性があります。カバレッジが良好なテストスイートを用意することで、製品が進化しても機能し続けることが保証されます。また、競合するビジネスルール(長期間にわたって発生する)を強調するのにも役立ちます。
あなたはそれが機能しないことを知りません。テストスイートがないと、コードが思ったとおりに動作しているかどうか、または動作しているように見えるかどうかがわかりません。
var foo = function(in) {
if(in == 0) {
return true
}
}
これで、アプリケーション全体で、if(foo()){ doStuff() }
fooを修正するとどうなりますか?
var foo = function(in) {
if(in === 0) {
return true
}
}
テストもリファクタリングおよび乾燥する必要があります。優れたテストスイートを維持するのは難しくありません。よく書かれたアトミックテストを使用すると、一度に1〜2個以上戻って変更する必要はほとんどありませんでした。テストスイートに大きな変更が加えられたとき、それは何かが正しくないという大きな赤い旗です。
私は、自分のすべてのメソッドをどのように知るべきか、そしてコードがそこに到達するまで物事がどのように機能するかをただ見ていません。
まあ、あなたはするべきではありません。何らかの作業単位が完了したことをテストするテストを作成することになっています。あなたがおそらく知ることができないものをテストしているように感じるなら、あなたは大きすぎると考えています、またはテストは小さすぎます。
たとえば、ドアが閉じてロックされることを知る必要があります。door.close()とdoor.lock()をテストすると、ドアがロックされるとdoor.open()がfalseを返します。それだ。テストがdoor.lock()の場合、データベースにフラグを設定します。次に、テストが小さすぎます。テストではdoor.lock()がどのように機能するかを知る必要はありません。
ここで、すべてのドアと窓がロックされているときにhouse.isSecure()がtrueを返すというテストを書いている場合。最初にドアや窓を見ないで、大きすぎると考えています。
最後に、大きすぎる作業単位を見ている可能性があります。要件のリストを取得したら、最小単位で作業するように要件を整理する必要があります。そのユニットだけのテストを書き、次にコードを書き、すすぎ、繰り返します。
本質的に、TDDがどのように機能するかについての理解(リスト)はずれています。2/100パスすることはありません。1/1通過、2/2通過、3/3通過、4/4通過などのようになります。
改訂されたリスト
- すべての仕様を入手する
- 仕様を1つ選択してください
- 試して
- コーディングする
- 試して
- テストに合格した場合は7に進み、それ以外の場合は4に進みます
- すべての仕様を完了したら、8に進み、それ以外の場合は2に進みます
- 消費者と仕様を確認し、必要に応じて新しい仕様を追加します。正しく行われていれば、テストをまったく変更する必要はありません。新しいものを追加するだけです。要件の収集がバラバラになることがあり、以前のテストと競合するテストを追加する必要がありますが、テストを変更する必要はほとんどありません。