単体テストを非常に有用にする重要な要素の1つは、高速フィードバックです。
統合/システム/機能テストでアプリを完全にカバーしたときに何が起こるかを考えてください(ほとんどの開発現場では現実からは程遠い理想的な状況です)。これらは多くの場合、専用のテストチームによって実行されます。
- SCMリポジトリに変更をコミットし、
- しばらくして(おそらく数日後)テスト担当者が新しい内部リリースを取得し、テストを開始します。
- バグを見つけてバグレポートを提出します。
- (理想的な場合)誰かがバグ報告をあなたに割り当てます。
これには数日から数週間かかる場合があります。この時点で、すでに他のタスクに取り組んでいるので、以前に書いたコードの詳細は頭にありません。さらに、通常、バグが実際に存在する場所を直接証明することさえできないため、バグを見つけて修正するにはかなりの時間がかかります。
一方、単体テスト(TDD)では
- あなたはテストを書きます
- テストを満たすためにいくつかのコードを書いて、
- テストはまだ失敗します、
- コードを見ると、通常は数秒で「おっと」体験ができます(「おっと、その状態を確認するのを忘れた!」など)
- すぐにバグを修正してください。
これはすべて数分で起こります。
これは、統合/システムテストが役に立たないと言っているわけではありません。それらは異なる目的を果たすだけです。よく書かれたユニットテストを使用すると、コードのバグの大部分をキャッチすることができます前に、彼らはそれがそれらを見つけて修正するために、すでにかなり高価である統合相に取得します。ユニットテストでは検出が困難または不可能な種類のバグを検出するには、統合テストが必要であることは間違いありません。ただし、私の経験では、これらはまれな種類です。私が見たバグのほとんどは、メソッド内のどこかにある単純な、あるいは些細な省略によってさえ引き起こされています。
ユニットテストでは、ユーザビリティ/安全性などのインターフェイスもテストされることは言うまでもありません。したがって、デザインとAPIを改善するために非常に重要なフィードバックを提供します。どのIMHOがモジュール/サブシステム統合バグの可能性を大幅に削減できるか:APIがより簡単でクリーンなほど、誤解や省略の可能性が少なくなります。
自動化された単体テスト、自動化された統合テスト、および自動化された受け入れテストでどのような経験がありますか?なぜ?
ROIは多くの要因に依存します。おそらく最も重要なのは、プロジェクトがグリーンフィールドかレガシーかです。グリーンフィールド開発では、私のアドバイス(およびこれまでの経験)は、TDDスタイルを最初から単体テストすることです。この場合、これが最も費用対効果の高い方法であると確信しています。
ただし、従来のプロジェクトでは、十分な単体テストのカバレッジを構築することは大きな成果であり、利益を得るのに非常に時間がかかります。可能であれば、UIを介してシステム/機能テストで最も重要な機能をカバーしようとする方が効率的です。(デスクトップGUIアプリは、GUIを使用して自動的にテストするのが難しい場合がありますが、自動テストサポートツールは徐々に改善されています...)。これにより、粗いが効果的なセーフティネットが迅速に得られます。その後、アプリの最も重要な部分を中心にユニットテストを徐々に構築していきます。
次のプロジェクトで自動化するテストの形式を1つだけ選択しなければならなかった場合、どちらになりますか?
それは理論的な質問であり、私はそれが無意味だと思う。すべての種類のテストは、優れたソフトウェアエンジニアのツールボックスで使用され、これらすべてには、かけがえのないシナリオがあります。