もともとTDDはアジャイルムーブメントから来たもので、テストコードで明確に定義された仕様を前提として、コーディングした内容が正しいことを確認する方法として、テストが前もって作成されました。これは、リファクタリングの非常に重要な側面としても現れました。コードを変更したときに、テストに依存して、コードの動作を変更していないことを証明できるからです。
それから人々がやって来て、彼らがあなたのコードについての情報を知っていて、それからあなたがあなたのユニットテストを書くのを助けるためにテストスタブを生成できると思ったツール、そして私はそれがすべてうまくいかなかったと私は思います。
テストスタブは、何をしているのかまったくわからないコンピューターによって生成されます。すべてのメソッドに対してスタブを生成するのは、それが指示されているためです。つまり、メソッドの複雑さや、単独でのテストに適しているかどうかに関係なく、各メソッドにテストケースがあります。
これは、TDD方法論の間違った端からのテストに来ています。TDDでは、コードが何をすべきかを理解し、それを実現するコードを生成する必要があります。これは、コードが実行するはずの動作ではなく、コードが実行する動作を証明するテストを作成することになるので、自己実現的です。メソッドベースのテストスタブの自動生成と組み合わせると、コードの小さな各側面を証明するのにかなりの時間を浪費し、小さな部分をすべて組み合わせると簡単に間違っていることがわかります。
ファウラーが本でテストについて説明したとき、彼は独自のメインメソッドで各クラスをテストすることを言及しました。彼はこれを改善しましたが、概念は同じです。クラス全体をテストして全体として機能します。すべてのテストをまとめて、これらすべてのメソッドの相互作用を証明し、定義された期待に応じてクラスを再利用できるようにします。
テストツールキットは私たちに不幸を与えたと思います。ツールキットが実際にコードで最良の結果を得るために自分でもっと考える必要があるときに物事を行う唯一の方法であると考える道に私たちを導いた。小さな部分のテストスタブに盲目的にテストコードを配置するということは、とにかく統合テストで作業を繰り返す必要があることを意味します(そして、そうする場合は、冗長なユニットテスト段階を完全にスキップしないでください)。また、100%のテストカバレッジを取得するために多くの時間を浪費し、大量のモックコードとデータの作成に多くの時間を費やして、コードを統合テストしやすくするために費やした方がよいことも意味します(つまり、データの依存関係、単体テストは最適なオプションではない場合があります)
最後に、メソッドベースの単体テストの脆弱性が問題を明らかにしているだけです。リファクタリングはユニットテストで使用するように設計されています。リファクタリングを行っているためにテストが常に失敗する場合は、アプローチ全体で何かが深刻な問題を起こしています。リファクタリングはメソッドの作成と削除を好むので、メソッドごとのブラインドベースのテストアプローチは本来意図されたものではありません。
多くのメソッドがテストを作成することは間違いありません。クラスのすべてのパブリックメソッドをテストする必要がありますが、単一のテストケースの一部としてそれらを一緒にテストするという概念から逃れることはできません。たとえば、setメソッドとgetメソッドがある場合、データを入力して内部メンバーが正常に設定されていることを確認するテストを作成できます。または、それぞれを使用してデータを配置し、それを再度取り出して、それが正しいかどうかを確認できます。まだ同じで文字化けしていません。これは、各メソッドを個別にではなく、クラスをテストしています。セッターがヘルパーのプライベートメソッドに依存している場合は問題ありません。クラス全体をテストする場合ではなく、プライベートメソッドをモックしてセッターが機能していることを確認する必要はありません。
私は宗教がこのトピックに参入していると思います。したがって、「行動主導型」および「テスト主導型」の開発として現在知られているものへの分裂がわかります。ユニットテストの元の概念は、行動主導型の開発でした。