ユニットテストは最近、それについて何か神秘的です。100%のテストカバレッジが聖杯であるかのように、また単体テストがソフトウェア開発の1つの真の方法であるかのように、人々はそれを扱います。
彼らはポイントを逃しています。
単体テストは答えではありません。 テストです。
さて、この議論が起こるたびに、誰か(私でさえも)がダイクストラの引用を無視します:「プログラムのテストはバグの存在を示すことができますが、バグがないことを示すことはありません。」ダイクストラは正しい。テストは、ソフトウェアが意図したとおりに機能することを証明するには不十分です。しかし、それは必要です。あるレベルでは、ソフトウェアがあなたが望むことをしていることを実証することが可能でなければなりません。
多くの人が手でテストします。頑固なTDD愛好家でさえ手動テストを行いますが、認めないこともあります。仕方がありません。ソフトウェアをクライアント/ボス/投資家などにデモするために会議室に行く直前に、それが動作することを確認するために手作業で実行します。それには何の問題もありません。実際、100%の単体テストのカバレッジとテストに最大限の自信がある場合でも、手動で実行せずにすべてをスムーズに実行すること(つまり、テストすること)を期待するのはおかしいでしょう。
ただし、ソフトウェアのビルドに必要であっても、手動テストで十分なことはめったにありません。どうして?手動テストは退屈で時間がかかり、人間が実行するためです。そして、人間は退屈で時間のかかるタスクを実行することで悪名が高いことで知られています。
一方、マシンは、退屈で時間のかかるタスクの実行に優れています。結局のところ、それがコンピューターが発明された理由です。
そのため、テストは非常に重要であり、自動テストは、テストが一貫して採用されることを保証する唯一の賢明な方法です。そして、ソフトウェアが開発されるにつれて、テストし、再テストすることが重要です。ここでの別の答えは回帰テストの重要性に注意します。ソフトウェアシステムは複雑であるため、システムのある部分に対する一見無害な変更が、システムの他の部分に意図しない変更(バグ)を引き起こすことがよくあります。何らかのテストを行わないと、これらの意図しない変更を発見することはできません。また、テストに関する信頼できるデータを取得するには、体系的な方法でテストを実行する必要があります。つまり、何らかの自動テストシステムが必要です。
これはすべて単体テストと何の関係がありますか?まあ、その性質上、単体テストは人間ではなくマシンによって実行されます。そのため、多くの人は、自動化されたテストが単体テストに等しいという誤った印象を受けています。しかし、それは真実ではありません。ユニットテストは、非常に小さな自動テストです。
さて、非常に小さな自動テストの価値は何ですか?利点は、彼らがソフトウェアシステムのコンポーネントをテストすることである分離でき、より正確な試験の標的、およびデバッグに助。しかし、単体テストは本質的に高品質のテストを意味するものではありません。多くの場合、ソフトウェアをより詳細なレベルでカバーするため、テストの品質が向上します。ただし、複合部品ではなく、完全なシステムのみの動作を完全にテストし、それでも完全にテストすることは可能です。
しかし、100%の単体テストの範囲であっても、システムはまだ完全にテストされていない場合があります。個々のコンポーネントは単独で完全に動作する可能性がありますが、一緒に使用すると失敗します。そのため、単体テストは非常に便利ですが、ソフトウェアが期待どおりに動作することを確認するには不十分です。実際、多くの開発者は、自動化された統合テスト、自動化された機能テスト、および手動テストでユニットテストを補完しています。
単体テストに価値が見られない場合は、おそらく別の種類の自動テストを使用することから始めるのが最善の方法です。Web環境では、Seleniumのようなブラウザ自動化テストツールを使用すると、比較的小さな投資で大きな勝利を得ることができます。つま先を水に浸すと、自動化されたテストの有用性をより簡単に確認できるようになります。自動化されたテストを実行すると、ユニットテストは大きな統合テストやエンドツーエンドテストよりも迅速なターンアラウンドを提供し、現在作業中のコンポーネントのみをテストの対象とすることができるため、はるかに理にかなっています。
TL; DR:単体テストについてはまだ心配しないでください。最初にソフトウェアをテストすることを心配するだけです。