334

コードカバレッジとは何ですか? また、それをどのように測定しますか?

テスト コード カバレッジの自動化に関して、この質問を受けました。自動化されたツール以外では、科学というよりはアートのようです。コード カバレッジの使用方法の実例はありますか?

4

10 に答える 10

293

コード カバレッジは、自動テストの実行中に実行されたコードの行数/ブロック数/アーク数の測定値です。

コード カバレッジは、特殊なツールを使用してバイナリを計測し、トレース呼び出しを追加して、計測された製品に対して自動テストの完全なセットを実行することによって収集されます。優れたツールは、実行されたコードのパーセンテージを提供するだけでなく、データを掘り下げて、特定のテスト中に実行されたコード行を正確に確認することもできます。

私たちのチームは、社内のコード カバレッジ ツール セットであるMagellanを使用しています。.NET ショップの場合、Visual Studio にはコード カバレッジを収集するためのツールが統合されています。この記事で説明されているように、いくつかのカスタム ツールをロールすることもできます。

あなたが C++ ショップなら、Intel にはWindows と Linux で動作するツールがいくつかありますが、私はそれらを使用していません。また、GCC 用の gcov ツールがあると聞いたことがありますが、それについては何も知らないので、リンクを提供することはできません。

使用方法については、コード カバレッジは各マイルストーンの終了基準の 1 つです。実際には、単体テスト (開発チームによる) のカバレッジ、(テスト チームによる) シナリオ テストによるカバレッジ、および組み合わせたカバレッジの 3 つのコード カバレッジ メトリクスがあります。

ところで、コード カバレッジはどれだけのテストを行っているかを示す良い指標ですが、製品をどれだけうまくテストしているかを示す良い指標とは限りません。品質を確保するために、コード カバレッジと共に使用する必要がある他の指標があります。

于 2008-10-12T02:54:43.887 に答える
260

コード カバレッジは基本的に、テストでカバーされているコードの量を示します。たとえば、コード カバレッジが 90% の場合、コードの 10% がテストでカバーされていないことを意味します。

コードの 90% がカバーされていればそれで十分だと考えているかもしれませんが、別の角度から見る必要があります。100% のコード カバレッジを得ることを妨げているものは何ですか?

良い例は次のとおりです。

if(customer.IsOldCustomer()) 
{
}
else 
{
}

上記のコードには、2 つのパス/分岐があります。常に "YES" ブランチをヒットしている場合は、"else" 部分をカバーしていないため、コード カバレッジの結果に表示されます。カバーされていないことがわかり、「else」部分をカバーするテストを作成できるため、これは良いことです。コード カバレッジがなければ、時限爆弾の上に座って、爆発するのを待っているだけです。

NCoverは、コード カバレッジを測定するための優れたツールです。

于 2008-10-12T03:11:42.073 に答える
73

「100%コードカバレッジ」があるからといって、すべてが完全にテストされるわけではありません。つまり、コードのすべての行がテストされるということですが、すべての(一般的な)状況でテストされるわけではありません。

コードカバレッジを使用して、おそらくテストを作成する必要があるコードのビットを強調します。たとえば、現在の単体テストの実行中にmyImportantFunction()が実行されないことを示すコードカバレッジツールがあれば、おそらく改善する必要があります。

基本的に、100%のコードカバレッジは、コードが完璧であることを意味するわけではありません。より包括的な(単体)テストを作成するためのガイドとして使用してください。

于 2008-10-12T03:24:38.117 に答える
62

以前の回答の多くにいくつかの点を補足します。

コード カバレッジとは、テスト セットがソース コードをどの程度カバーしているかを意味します。つまり、一連のテスト ケースでソース コードがどの程度カバーされているかということです。

上記の回答で述べたように、パス、条件、関数、ステートメントなど、さまざまなカバレッジ基準があります。ただし、カバーされる追加の基準は次のとおりです。

  1. 条件範囲: true と false について評価されるすべてのブール式。
  2. 判定カバレッジ: ブール式が true と false について 1 回評価されるだけでなく、後続のすべての if-elseif-else 本体をカバーします。
  3. ループ カバレッジ: 考えられるすべてのループが 1 回、複数回、0 回実行されたことを意味します。また、最大制限を想定している場合は、実行可能であれば、最大制限時間をテストし、最大制限時間を 1 つ増やします。
  4. Entry and Exit Coverage: すべての可能な呼び出しとその戻り値をテストします。
  5. パラメータ値範囲 (PVC)。パラメータのすべての可能な値がテストされているかどうかを確認します。たとえば、文字列は通常、次のいずれかになります。a) null、b) 空、c) 空白 (スペース、タブ、改行)、d) 有効な文字列、e) 無効な文字列、f) 1 バイト文字列、g ) 2 バイト文字列。可能な各パラメーター値をテストしないと、バグが残る可能性があります。これらの 1 つだけをテストすると、各行がカバーされるため 100% のコード カバレッジになる可能性がありますが、7 つのオプションのうち 1 つだけがテストされるため、パラメーター値のカバー率は 14.2% しかありません。
  6. 継承カバレッジ: オブジェクト指向ソースの場合、基本クラスによって参照される派生オブジェクトを返すときに、兄弟オブジェクトが返された場合に評価するカバレッジをテストする必要があります。

注: 静的コード分析では、到達不能なコードやぶら下がっているコード (つまり、他の関数呼び出しでカバーされていないコード) があるかどうかが検出されます。また、他の静的カバレッジ。静的コード分析で 100% のコードがカバーされていることが報告されたとしても、考えられるすべてのコード カバレッジがテストされている場合、テスト セットに関するレポートは提供されません。

于 2013-10-28T07:53:33.660 に答える
17

コードカバレッジは、以前の回答で十分に説明されています。したがって、これは質問の2番目の部分に対する答えです。

コードカバレッジを決定するために3つのツールを使用しました。

  1. JTest -JUnit上に構築された独自のツール。(単体テストも生成します。)
  2. Cobertura-レポートを生成するためにJUnitテストと簡単に組み合わせることができるオープンソースコードカバレッジツール。
  3. エマ -別の-これは、ユニットテストとは少し異なる目的で使用しました。これは、エンドユーザーがWebアプリケーションにアクセスしたときにカバレッジレポートを生成するために使用されています。これをWebテストツール(例:Canoo)と組み合わせると、一般的なエンドユーザーの使用中にカバーされるコードの量を示す非常に便利なカバレッジレポートが得られます。

これらのツールを使用して

  • 開発者が優れた単体テストを作成したことを確認します
  • ブラックボックステスト中にすべてのコードがトラバースされることを確認します
于 2008-10-12T03:59:00.963 に答える
7

コード カバレッジは、テストされるコードの単なる尺度です。測定可能なカバレッジ基準にはさまざまなものがありますが、通常は、プログラム内のさまざまなパス、条件、関数、およびステートメントによって、カバレッジ全体が構成されます。コード カバレッジ メトリックは、これらのカバレッジ基準のそれぞれを実行するテストの割合です。

プロジェクトの単体テスト カバレッジを追跡する方法に関しては、静的コード分析ツールを使用して追跡しています。

于 2008-10-12T02:47:05.120 に答える
5

Perl には、モジュールで定期的に使用する優れたDevel::Coverモジュールがあります。

ビルドとインストールが Module::Build によって管理されている場合は、実行するだけで./Build testcover、サブ、行、および条件ごとのカバレッジを示す素敵な HTML サイトを取得できます。きれいな色で、カバーされていないコード パスを簡単に確認できます。

于 2008-10-12T11:56:19.800 に答える