CIサーバーで単体テストを実行するのはなぜですか?
確かに、何かがマスターにコミットされる頃には、開発者はすでにすべての単体テストを実行し、新しいコードで発生した可能性のあるエラーを修正しています。それは単体テストのポイントではありませんか?そうでなければ、彼らは壊れたコードをコミットしたばかりです。
master
常に正常であり、できれば内部QAとテスト用のステージング環境への各マージで自動的に展開する必要があります。
CIサーバーで単体テストを実行するのはなぜですか?
確かに、何かがマスターにコミットされる頃には、開発者はすでにすべての単体テストを実行し、新しいコードで発生した可能性のあるエラーを修正しています。それは単体テストのポイントではありませんか?そうでなければ、彼らは壊れたコードをコミットしたばかりです。
master
常に正常であり、できれば内部QAとテスト用のステージング環境への各マージで自動的に展開する必要があります。
回答:
確かに、何かがマスターにコミットされる頃には、開発者はすでにすべての単体テストを実行し、新しいコードで発生した可能性のあるエラーを修正しています。
か否か。これが発生する理由はさまざまです。
しかし、本当のポイントは、開発者のマシンではないマシンでテストを実行することです。構成が異なるもの。
これにより、テストやコードが開発者ボックスに固有の何か(構成、データ、タイムゾーン、ロケールなど)に依存する問題を見つけることができます。
CIビルドがテストを実行するその他の理由:
ソース管理にコミットする前にすべての統合テストと単体テストを実行するわけではない開発者として、ここで防御を提供します。
アプリケーションが以下で正常に動作することを構築、テスト、検証する必要があります。
Fortran(IntelコンパイラとGNUコンパイラの両方)、Python(およびOSに応じてさまざまなバージョン)、およびbash / batスクリプトコンポーネントを追加します。
つまり、1日に2、3回テストを実行するために必要な16台のマシンです。そのためのインフラストラクチャを管理するだけでも、ほぼフルタイムの仕事になります。私はほとんど誰もがそれを不合理であることに同意するだろうと思う、特にそれをプロジェクトの人々の数に乗じる。したがって、CIサーバーに作業を任せます。
単体テストでは、壊れたコードのコミットを停止することはありません。何かを壊したことがわかっているかどうかを教えてくれます。人々は「ユニットテストは高速であるべきだ」と言うことができ、原則と設計パターンと方法論に進むことができますが、実際には、反復的で単調なタスク用に設計したコンピューターにそれらを実行させ、それらが関与する場合にのみ関与させる方が良い場合があります彼らが何かを見つけたと教えてください。
優れたOdedの回答とは別に:
私はかつて、マージおよび展開プロセスのために展開に多くのバグがあった会社で働いていました。これは、テストとCIを難しくする奇妙な所有フレームワークが原因でした。開発で完全に機能するコードが本番環境に届かなかったことを知るのは、幸せな経験ではありませんでした。
あなたはそうは思わないでしょう-しかし、開発者は人間であり、彼らは時々忘れます。
また、開発者は最新のコードをプルできないことがよくあります。最新のテストは問題なく実行され、チェックインの時点で他の誰かが重大な変更をコミットします。
テストは、ローカル(チェックインされていない)リソースに依存する場合もあります。あなたのローカルユニットテストが拾わないもの。
上記のすべてが空想的だと思う場合、Gatedと呼ばれるCI(少なくともTFS上)のレベルがあり、テストに失敗したビルドは保留され、コードベースにコミットされません。
何かがマスターにコミットする時までに
通常、単一のコミットごとに実行するようにCIをセットアップします。ブランチは、ブランチがテストされるまでマスターにマージされません。マスターでのテストの実行に依存している場合、ビルドが壊れるウィンドウが開きます。
CIマシンでテストを実行すると、再現可能な結果が得られます。CIサーバーにはVCSから取得した既知のクリーンな環境があるため、テスト結果が正しいことがわかります。ローカルで実行する場合、パスするために必要ないくつかのコードをコミットするのを忘れたり、失敗する必要があるときにパスするようにするコミットされていないコードを持つことができます。
また、異なるスイートを並行して実行することにより、特に各変更後にローカルで実行される可能性がない低速で数分間のテストの場合、開発者の時間を節約できます。
私の現在の仕事では、実稼働展開はすべてのテストに合格したCIに基づいています。デプロイスクリプトは、パスしない限りデプロイを防ぎます。これにより、誤ってそれらの実行を忘れることができなくなります。
CIはワークフローの一部であるため、開発者の負担も軽減されます。開発者として、通常、変更ごとにリンター、静的アナライザー、単体テスト、コードカバレッジ、統合テストを実行しますか?CIは、完全に自動的に、それについて考える必要なく、意思決定の疲労を軽減できます。
(他の答えとは反対に)開発者は非常に規律があり、コミットする前に単体テストを実行すると仮定すると、いくつかの理由があります。
同等の質問をしてみましょう。
CIサーバーでコードをビルドするのはなぜですか?
確かに、何かがマスターにコミットされるまでに、開発者はすでにコードを構築しており、新しいコードで発生した可能性のあるエラーを修正しています。それはコードを構築するポイントではありませんか?そうでなければ、彼らは壊れたコードをコミットしたばかりです。
CIを実行する理由はいくつかありますが、CIの主なポイントは、コードの状態が時間とともにどのようなものかを把握することです。これが提供する主な利点(いくつかあります)は、ビルドがいつ壊れるかを見つけ、何が壊れたのかを把握してから修正できることです。
コードが破損しない場合、なぜCIを使用するのでしょうか?テスト用のビルドを提供するには、ナイトリービルドで十分です。