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