5

私はブラウンフィールド アプリケーション開発の大ファンです。間違いなく素晴らしい本であり、世界中のすべての開発者にお勧めします。私がここにいるのは、コード カバレッジに関する本の要点に到達したからです。私の新しいショップでは、自動ビルド/継続的インテグレーションに Team City を使用しており、ビルドが完了するまでに約 40 分かかります。ブラウンフィールドの本は、摩擦のない開発と、開発者が耐えなければならない一般的な負担をどのように軽減したいかについて語っています。私が読んだのは130ページです。

「コード カバレッジ: 1 つの価格で 2 つのプロセス? リスト 5.2 のサンプル ターゲットからわかるように、最終的に 2 つの出力ファイルになります。1 つはテスト結果で、もう 1 つはコード カバレッジ結果です。これは、実際にこのタスク中にテストを実行しています。

コード カバレッジ タスクを実行している場合、技術的には別のタスクでテストを実行する必要はありません。このため、多くのチームはテスト タスクの代わりに自動化されたコード カバレッジ タスクを使用し、基本的に CI プロセスで両方のアクションを実行します。CI サーバーはコードをコンパイルしてテストし、チェックインごとにコード カバレッジ統計を生成します。

このアプローチに概念的な問題はありませんが、いくつかの欠点に注意してください。まず、コード カバレッジ統計の生成にはオーバーヘッドがあります。多くのテストがある場合、このオーバーヘッドは、長時間実行される自動ビルド スクリプトの形で摩擦を引き起こすのに十分なほど大きくなる可能性があります。メイン ビルド スクリプトは、チーム メンバーが頻繁に実行できるように、できるだけ速く実行する必要があることに注意してください。実行に時間がかかりすぎる場合、開発者が回避策を探していることがあります。

これらの理由から、ビルド スクリプトのデフォルト タスクとは別にコード カバレッジ タスクを実行することをお勧めします。これは定期的に実行する必要があります。おそらくビルド ファイル内で、隔週または月 1 回実行される別のスケジュールされたタスクとして実行する必要がありますが、チェックごとに実行することによる余分なオーバーヘッドを保証するほど、メトリクスには十分なメリットがあるとは思えません。の。"

これは、ビルドごとに NCover を実行する現在のショップでの慣行に反しています。私は主任に行き、これをしないように要求したいのですが、私にできる最善のことは、「これはブラウンフィールドの本が言っていることです」と彼に伝えることです. それだけでは十分ではないと思います。ですから、このトピックに関するあなたの個人的な経験とアドバイスを私に記入してくれることに頼っています. ありがとう。

4

4 に答える 4

3

継続的インテグレーション/自動ビルドシステムには、常に2つの競合する利益があります。

  1. ビルドをできるだけ早く実行する必要があります
  2. 可能な限り多くのフィードバックを使用してビルドを実行する必要があります(たとえば、実行するテストの数が最も多い、ビルドの安定性とカバレッジに関して利用可能な情報の量が最も多いなど)

常にトレードオフを行い、これらの競合する利益の間のバランスを見つける必要があります。私は通常、ビルド時間を10分未満に保つように努めており、ビルドの安定性について何らかの意味のあるフィードバックを提供するのに約20分以上かかる場合は、ビルドシステムが壊れていると見なします。ただし、これはすべてのケースをテストする完全なビルドである必要はありません。システムをさらにテストするために、後でまたは他のマシンで並行して実行される追加のテストがある場合があります。

ビルド時間が40分である場合は、できるだけ早く次のいずれかを実行することをお勧めします。

  • ビルド/テストを複数のマシンに分散して、テストを並行して実行し、より迅速なフィードバックを得ることができるようにします
  • ビルドに多くの時間を費やしているが、大きなメリットをもたらしていないものを見つけ、それらのタスクはナイトリービルドの一部としてのみ実行してください

可能であれば、最初の解決策を100%お勧めします。ただし、ハードウェアがすぐに利用できない場合があり、犠牲を払わなければなりません。

コードカバレッジは比較的安定したメトリックであり、コードカバレッジ数が1日以内に劇的に悪化することは比較的まれです。したがって、コードカバレッジの実行に長い時間がかかる場合は、ビルドごとにコードカバレッジが発生することはそれほど重要ではありません。ただし、少なくとも1晩に1回は、コードカバレッジ番号を取得するようにしてください。ナイトリービルドは(おそらく)誰も待っていないので、もう少し時間がかかることがありますが、それでもプロジェクトのステータスに関する定期的なフィードバックを提供し、予期しない問題が多く発生しないようにします。

とは言うものの、ハードウェアに分散型または並列型の構築/テストを実行させることができる場合は、必ずそのルートを選択する必要があります。これにより、開発者が何かを壊したり、システムに問題を引き起こしたりしたかどうかをできるだけ早く知ることができます。 。ハードウェアのコストは、ビルドシステムの迅速なフィードバックによって生じる生産性の向上にすぐに還元されます。

また、ビルドマシンが常に機能していない場合(つまり、アイドル状態の時間が長い場合)、次のように設定することをお勧めします。

  • コードが変更された場合は、ビルドとテストを行ってください。コードカバレッジの可能性を含め、実行時間の長いタスクの一部を除外します。
  • このビルド/テストサイクルが完了すると(または並行して)、物事をより徹底的にテストし、コードカバレッジなどを行うより長いビルドを開始します
  • これらのビルドは両方とも、システムの状態に関するフィードバックを提供する必要があります

そうすれば、迅速なフィードバックを得るだけでなく、ビルドマシンにその容量がある限り、ビルドごとにさらに拡張されたテストを取得できます。

于 2011-06-29T02:32:47.100 に答える
2

私はこれを修正する方法については何も推測しません-あなたはここで少し馬の前にカートを置いています。ビルドに時間がかかりすぎるという苦情があります。そのため、それを行う方法についての先入観を持たずに、解決を求めたい問題です。この問題には他にも多くの潜在的な解決策があり(より高速なマシン、さまざまなプロセスなど)、それらのいずれも除外しないのが賢明です。

最終的に、これは、管理者がビルドシステムの出力を、それにかかる時間を正当化するのに十分に評価しているかどうかの問題です。(そして、時間の消費を改善するためにあなたが取るかもしれない行動が出力において許容できる忠実度を持っているかどうか)。

于 2011-06-27T20:09:37.813 に答える
1

これは、チームごとおよび環境ごとの決定です。最初にビルド期間のしきい値を決定し、それが決定されたら、実行時間の長いプロセスを頻度の低い発生 (理想的には CI で 1 日に 1 回または 2 回以上) に分解する必要があります。

于 2011-06-27T20:10:27.180 に答える
0

反対意見は、すべてのテストを実行し、コードカバレッジを収集するのは費用がかかることであり、ビルドごとにその価格を支払いたくない(まあ、誰かが望んでいない)ということのようです。

いったいなぜあなた(または誰か)がカバレッジステータスが何であるかを常に知りたくないのか想像できません。

ビルドマシンが他に何もすることがない場合、それがこれを行うかどうかは問題ではありません。ビルドマシンがビルドの実行で忙しすぎる場合は、あまりにも多くのマスターにサービスを提供するように要求してオーバーロードしたか、ビルドが多すぎます(なぜこれほど多くの変更を行うのですか?うーん、テストはあまり良くないかもしれません!) 。

テスト自体に実際に長い時間がかかることが問題である場合は、テストを最適化する方法を見つけることができます。特に、変更されなかったコードの部分に対してテストを再実行する必要はありません。これを行う方法を理解する(そしてそれを信頼する)のは難しいかもしれません。

一部のテストカバレッジツール(当社など)を使用すると、コードのどの部分をカバーするテストを追跡でき、コードが変更された場合は、どのテストを再実行する必要があるかを追跡できます。いくつかの追加のスクリプトを使用すると、最初に影響を受けるテストを簡単に再実行できます。これにより、すべてのテストを実行しなくても、完全なテスト結果を早期に/迅速に取得できます。次に、ビルドに問題がある場合は、できるだけ早く見つけます。

[あなたが妄想的で、インクリメンタルテストプロセスを本当に信頼していない場合は、初期のフィードバックのためにそれらを実行してから、すべてのテストを再度実行して、完全な結果を得ることができます。]

于 2011-06-27T21:00:51.277 に答える