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


275

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

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

回答:


241

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

コードカバレッジは、バイナリを計測するための専用ツールを使用して収集され、トレース呼び出しが追加され、計測された製品に対してフルセットの自動テストが実行されます。優れたツールを使用すると、実行されるコードの割合だけでなく、データをドリルダウンして、特定のテスト中に実行されたコード行を正確に確認することもできます。

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

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

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

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


40
「品質を保証するために、コードカバレッジとともに使用する必要のある他のメトリックがあります。」これらの他の指標は何ですか?
Troopers

Testwell CTC ++を使用することもできます。これは、C、C ++、C#、およびJava向けのかなり完全なコードカバレッジツールです
B_PRIEUR

1
@Abdulコードカバレッジを測定する場合、両方の種類のテストを実行し、それらのコードカバレッジを個別に測定する必要があります。「コードの弧」と同様に、それらはif / thenのようなコード実行ブランチです。
Franci Penov 2016

1
@Maverickほとんどの人はコードカバレッジについて話すときにユニットテストを想定していますが、マイクロソフトではユニットテストと統合テストの両方からコードカバレッジを測定していました。
Franci Penov 2017

1
@darth_coder一般的には何もありません。アプリも自動的に計測されることはなく、計測データを収集するものがない場合、新しいアプリの存在は無関係です。物事に影響を与える可能性がある唯一のケースは、自動テストの実行と同時にアプリが実行され、インストルメント化されたOSコードがテスト自動化と同じプロセス内で実行されるため、一部のOSコードがテストには触れません。
Franci Penov

189

コードカバレッジは基本的に、コードのどの程度がテストでカバーされているかをテストします。したがって、コードカバレッジが90%である場合、テストでカバーされていないコードが10%あることを意味します。コードの90%がカバーされていると思うかもしれませんが、別の角度から見る必要があります。100%のコードカバレッジを取得するのを止めている理由は何ですか?

これは良い例です:

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

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

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


5
ほぼ10年前の最良の答えです!くそー!:)
ニコス

4
シンプルで意味のある答え:)
Parveen

はい。意味のある唯一のもの。下にスクロールし続けることさえ気にしませんでしたが。ここが私が立ち寄った場所です。ブックマークしました。
TheRealChx101

64

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

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

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


1
-「100%コードカバレッジ」とは、すべてが完全にテストされることを意味するのではありません-すべてのコード行がテストされることを意味しますが、すべての(一般的な)状況でテストされることを意味するわけではありません。状況」は、データ入力とパラメータに関してですか?すべてをテストしても、完全にテストすることと同じではない理由を理解できません。
Abdul

20
コードのすべての行がテストのある時点で実行されるからといって、コードが実行される可能性のあるすべてのシナリオをテストしたわけではありません。関数を実行してx戻りx/x、my_func(2)を使用してテストを実行した場合、カバレッジは100%になります(関数のコードが実行されるため)が、パラメーターが0の場合は大きな問題を見逃してしまいます。つまり、カバレッジが100%であっても、必要なすべてのシナリオをテストしていません
2016

ユニットテストケースがすべてのメソッドに対して記述されていない場合、この状況を調べてください。コードカバレッジは100%のままです。 stackoverflow.com/questions/43395968/...
サチン・クマール

52

以前の回答の多くにいくつかのポイントを補足します。

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

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

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

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


2
ここに他の回答への素晴らしい追加
HDave

14

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

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

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

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

  • 開発者が優れた単体テストを作成したことを確認する
  • ブラックボックステスト中にすべてのコードがトラバースされることを確認する

6

コードカバレッジは、テストされるコードの単なる測定値です。測定できるカバレッジ基準はさまざまですが、通常は、プログラム内のさまざまなパス、条件、関数、およびステートメントによって、カバレッジ全体が構成されます。コードカバレッジメトリックは、これらの各カバレッジ基準を実行するテストのほんの一部です。

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


5

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

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


1

以前の回答では、コードカバレッジはよく説明されています。iOSOSXプラットフォームで作業している場合、ツールに関連するいくつかの知識を追加します。Xcodeは、コードカバレッジをテストおよび監視する機能を提供します。

参照リンク:

https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

どちらも、Xcodeを使用したコードカバレッジの学習と探索に役立つリンクです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.