「TDDについて話すことはほとんど効果がありません。誰かにTDDを説得したい場合は、結果を示してください」と人々は言います。ただし、TDDがなくても、すでにすばらしい結果が得られています。TDDを使用する人が良い結果を得ることが納得できないことを私に示すと、TDDとTDD以外の両方を書く人がTDDでより良い結果を得ることができるようにしたいと思います。
これらすべてにもかかわらず、私はTDDを試してみたいと思っています。しかし、私はこれから何かを得るとは確信していません。それが有用であることが判明した場合、私はそれを私のチームの他のメンバーにプッシュしようとします。
私の主な質問は次のとおりです。コードの正確さを既に証明できる場合、TDDはコードに何らかの目的を果たしますか?
明らかに、どちらも特効薬ではありません。詳細を逃したために証拠が間違っている可能性があり、テストでは、テストに失敗したバグを特定できない可能性があります。結局、私たちは人間であり、誰もが100%バグのないコードを永遠に作ることはできません。私たちはできるだけ近づくように努力することができます。
しかし、TDDは、その正確性が証明されたコードの時間を実際に節約するでしょうか?つまり、コードが動作するステートマシンで、有効なすべての状態とその範囲が開発者によって認識され、すべてが考慮され、コードがすべての例外を渡すホワイトリストスタイルのエラーチェックで設計されているコード予期しないリークがないことを確認するための上位ハンドラー->(理由内の)関連メッセージをクライアントに表示することも、ログ通知を管理者に送信することもありません。
実際の例での回答の方が良いでしょう。
いくつかの説明:
この質問は、コードの正当性を証明できるかどうかについてではありません。デフォルトでは、すべてのコードが妥当な時間枠内で正しいことが証明できるとは限らないが、一部のコードはそうであると想定します。たとえば、FizzBuzzモジュールの正当性を証明するのは非常に簡単です。クラウドベースのデータ同期サービスではそれほど簡単ではありません。
この制限内では、質問は次のように尋ねます。コードベースが2つの部分に分割されているという仮定から始めます。[I]正しいことが証明されている部分[II]正しく証明されていないが、手動で動作するようにテストされている部分。
今までTDDプラクティスがなかったこのコードベースにTDDプラクティスを適用したいと思います。質問は次のように質問します。TDDはすべての単一のモジュールに適用する必要がありますか、それとも、正しくないことが証明されたモジュールにのみ適用すれば十分でしょうか。
「実証済み」とは、このモジュールを完全に機能的なスタイルと見なすことができることを意味します。つまり、このモジュールは外部のグローバルまたは外部状態に依存せず、やり取りする他のモジュールが従う必要のあるI / O用の独自のAPIを完全に備えています。 。モジュールの外のコードを変更して「このモジュールを壊す」ことはできません。最悪の場合、コードを誤用して、フォーマットされたエラーメッセージを返す可能性があります。
明らかに、すべてのルールには例外があり、新しいコンパイラバージョンのコンパイラバグはこのモジュールにバグをもたらす可能性がありますが、同じバグがそれをテストしたテストに導入され、意図したとおりに機能しなくなったテストから誤った安全性をもたらす可能性があります。つまり、テストは魔法のようなソリューションではなく、保護の別のレイヤーであり、この質問は、この保護のレイヤーが、正しいことが証明されたモジュールの特定のケースで努力する価値があるかどうかの問題について説明します(それは確かに)でした。