私の長年のソフトウェア開発経験は、実際には機能しないことを示唆しています。
試しましたか?デイブと私は、私たち自身とThoughtWorksの他の年長者の両方の長年の経験に基づいて本を書き、実際に私たちが議論したことをやっています。この本には投機的なものはありません。私たちが議論するすべては、大規模な分散プロジェクトでも試され、テストされています。しかし、私たちはあなたがそれを信仰にとることを勧めません。もちろん、自分で試してみて、他の人があなたの経験から学ぶことができるように、関連するコンテキストを含めて、見つけたものとそうでないものを書き留めてください。
継続的デリバリは、自動化されたテストに重点を置いています。本の約3分の1を費やして話しています。これは、代替手段(手動テスト)が高価でエラーが発生しやすく、実際には高品質のソフトウェアを構築するのに最適な方法ではないためです(デミングが述べたように、「品質を達成するために質量検査に依存しないでください。そもそも製品」)
完全なテストカバレッジは不可能です。あなたは多くの時間を費やす必要があります-そして、時間はお金です-すべての小さなもののために。これは貴重ですが、他の方法で品質に貢献するために時間を費やすことができます。
もちろん、完全なテストカバレッジは不可能ですが、代替手段は何ですか?テストカバレッジはゼロですか?トレードオフがあります。その間のどこかがあなたのプロジェクトの正解です。一般に、自動化されたテストの作成または保守に費やす時間の約50%を費やすと予想されるはずです。包括的な手動テストのコストと、ユーザーに伝わるバグを修正するコストを考慮するまで、それは高価に聞こえるかもしれません。
自動的にテストするのが難しいものもあります。たとえば、GUI。Seleniumでさえ、GUIが不安定かどうかはわかりません。
もちろん。ブライアンマリックのテスト作業領域をご覧ください。探索的テストとユーザビリティテストを手動で実行する必要があります。しかし、それは、回帰テストではなく、高価で価値のある人間を使用するべきものです。重要なのは、包括的な自動テストスイートに合格したビルドに対して、高価な手動検証のみを実行するように、展開パイプラインを配置する必要があることです。したがって、手動テストに費やすお金の量と、手動テストまたは実稼働に至るまでのバグの数を減らすことができます(それまでに修正するには非常に費用がかかります)。自動化されたテストは、製品のライフサイクル全体ではるかに安くなりますが、当然のことながら、時間の経過とともに償却される設備投資です。
かさばるフィクスチャがないと、データベースアクセスをテストするのが難しく、データストレージの奇妙なコーナーケースをカバーすることさえできません。同様に、セキュリティや他の多くのもの。事実上単体テストが可能なのは、ビジネスレイヤーコードのみです。
データベースアクセスは、エンドツーエンドのシナリオに基づく機能的受け入れテストによって暗黙的にテストされます。セキュリティには、自動化されたテストと手動のテストの組み合わせが必要になります-自動化された侵入テストと静的解析(たとえば、バッファオーバーラン)。
ビジネス層でも、テスト目的で引数と戻り値を簡単に分離できる単純な関数はありません。モックオブジェクトの作成に多くの時間を費やすことができますが、これは実際の実装とは異なる場合があります。
もちろん、ソフトウェアとテストをひどくビルドすると、自動化されたテストは高価になります。「テストによって導かれるオブジェクト指向ソフトウェアの成長」という本を読んで、テストとコードを長期間維持できるようにする方法を理解することを強くお勧めします。
統合/機能テストは単体テストを補完しますが、通常は各テストでシステム全体を再初期化する必要があるため、実行に時間がかかります。(再初期化しないと、テスト環境に一貫性がなくなります。)
私が取り組んでいた製品の1つには、実行に18時間かかる3,500のエンドツーエンドの受け入れテストがあります。70個のボックスのグリッドで並行して実行し、45mでフィードバックを取得します。本当に理想よりも長いため、ユニットテストが数分で実行された後、パイプラインの第2ステージとして実行するため、基本レベルのないビルドでリソースを無駄にしない信じる。
リファクタリングまたはその他の変更により、多くのテストが中断されます。それらを修正するのに多くの時間を費やします。意味のある仕様の変更を検証することであれば問題ありませんが、実際には重要な情報を提供するものではなく、意味のない低レベルの実装の詳細のためにテストが中断することがよくあります。多くの場合、微調整は、テスト対象の機能を真に確認することではなく、テストの内部構造を修正することに焦点を当てています。
コードとテストが適切にカプセル化され、疎結合されている場合、リファクタリングは多くのテストを中断しません。機能テストでも同じことを行う方法を本で説明しています。受け入れテストが失敗した場合、それは1つまたは複数の単体テストが欠落していることを示しています。そのため、CDの一部には、テストがよりきめ細かく配信プロセスの早い段階でバグを見つけて見つけるために、テストカバレッジを絶えず改善することが含まれますバグの修正は安価です。
バグに関するフィールドレポートは、コードの正確なマイクロバージョンと簡単には一致しません。
より頻繁にテストしてリリースする場合(CDのポイントの一部)、バグの原因となった変更を特定するのは比較的簡単です。CDの重要なポイントは、フィードバックサイクルを最適化して、バグをバージョン管理にチェックインした後、できるだけ早くバグを特定できるようにすることです。実際、バグをチェックインする前に(これがビルドテストとユニットテストを実行する理由です)チェックイン前)。