「書き込みテスト+合格するまでリファクタリングする」アプローチは、信じられないほどアンチエンジニアリングに見えます。
リファクタリングとTDDの両方について誤解しているようです。
コードリファクタリングとは、ソフトウェアの非機能属性の一部を改善するために、外部機能動作を変更せずにコンピュータープログラムのソースコードを変更するプロセスです。
したがって、合格するまでコードをリファクタリングすることはできません。
そして、TDD、特にユニットテスト(他のテストはかなり妥当と思われるため、コアの改善と考えています)は、機能するまでコンポーネントを再設計することではありません。コンポーネントが設計どおりに機能するまで、コンポーネントを設計し、実装に取り組みます。
また、それは本当に把握することが重要で、そのユニットテストはおよそテストしている単位を。常にゼロから多くのことを書く傾向があるため、そのようなユニットをテストすることが重要です。土木技師は、使用しているユニットの仕様(さまざまな材料)をすでに知っており、動作することを期待できます。これらは多くの場合ソフトウェアエンジニアには当てはまらない2つのことです。テスト済みの高品質のコンポーネントを使用することを意味するため、ユニットを使用する前にテストすることは非常にプロエンジニアリングです。
土木技師がスタジアムを覆う屋根を作るために新しい繊維ティッシュを使用するというアイデアを持っていた場合、彼はそれをユニットとしてテストすることを期待します。その後、それらが満たされるまでテストと改良を行います。
それがTDDが機能する理由です。テストされたユニットのソフトウェアを構築する場合、それらを一緒に接続し、そうでない場合、テストのカバレッジが良好であると仮定して、グルーコードに問題があると予想できる可能性がはるかに優れています。
編集:
リファクタリングとは、機能に変更がないことを意味します。単体テストを記述する1つのポイントは、リファクタリングによってコードが破損しないことを確認することです。TDDは、リファクタリングに副作用がないことを保証するためのものです。
先ほど言ったように、粒度は正確には定義されていないため、システムではなくユニットをテストするため、粒度は観点の対象ではありません。
TDDは優れたアーキテクチャを促進します。すべてのユニットの仕様を定義および実装する必要があり、実装前にそれらを設計する必要がありますが、これはあなたが考えていることとはまったく反対です。TDDはユニットの作成を指示します。ユニットは個別にテストできるため、完全に分離されます。
TDDは、スパゲッティコードでソフトウェアテストを投げ、パスタがパスするまで攪拌するという意味ではありません。
土木工学とは対照的に、ソフトウェア工学では通常、プロジェクトは常に進化しています。土木工学では、位置Aに橋を建設する必要があります。橋はxトンを運ぶことができ、1時間にn台の車両に十分な幅があります。
ソフトウェアエンジニアリングでは、顧客は基本的に任意の時点(おそらく完成後)で、ダブルデッキブリッジを望み、最寄りの高速道路に接続することを望みます。最近、帆船を使い始めました。
ソフトウェアエンジニアは、設計を変更する必要があります。彼らのデザインに欠陥があるからではなく、それが手口だからです。ソフトウェアが適切に設計されていれば、低レベルのコンポーネントをすべて書き直すことなく、高レベルで再設計できます。
TDDは、個別にテストされ、高度に分離されたコンポーネントを使用してソフトウェアを構築することです。適切に実行されると、要件の変更に対応するのに役立ちます。
TDDは開発プロセスに要件を追加しますが、品質保証の他の方法を禁止しません。確かに、TDDはフォーマル検証と同じセキュリティを提供しませんが、フォーマル検証は非常にコストがかかり、システムレベルで使用することは不可能です。それでも、必要に応じて、両方を組み合わせることができます。
TDDには、システムレベルで実行される単体テスト以外のテストも含まれます。これらは説明しやすいが、実行するのが難しく、測定するのが難しいと思う。また、彼らは非常に妥当です。私は彼らの必要性を絶対に見ていますが、私はそれらをアイデアとして本当に評価していません。
最終的に、実際に問題を解決するツールはありません。ツールは問題の解決を容易にするだけです。あなたは尋ねることができます:ノミはどのように素晴らしい建築で私を助けますか?まっすぐな壁を作るつもりなら、まっすぐなレンガが助けになります。確かに、そのツールをバカに渡せば、彼は最終的に彼の足を叩くでしょうが、それはノミのせいではありません。初心者に誤ったセキュリティを与えるのはTDDの欠陥ではないからです良いテストを書かない人。
結論として、TDDはTDDを使用しないよりもはるかに優れていると言えます。