web-dev-qa-db-ja.com

コードカバレッジとは何ですか?

コードカバレッジとは何ですか?

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

234
Brian G

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

コードカバレッジは、専用のツールを使用して収集され、バイナリをインスツルメントしてトレースコールを追加し、インスツルメントされた製品に対して完全な自動テストを実行します。優れたツールを使用すると、実行されるコードの割合だけでなく、データを掘り下げて特定のテスト中に実行されたコードの行を正確に確認できます。

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

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

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

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

209
Franci Penov

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

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

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

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

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

156
azamsharp

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

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

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

53
dbr

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

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

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

  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%のコードがカバーされていると報告された場合でも、可能なコードカバレッジがすべてテストされている場合、テストセットに関するレポートは提供されません。

41
Chand51

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

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

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

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

  • 開発者が適切な単体テストを作成したことを確認します
  • ブラックボックスのテスト中にすべてのコードがトラバースされるようにします
13
Vivek Kodira

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

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

6
SaaS Developer

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

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

5
moritz

以前の回答では、コードカバレッジが適切に説明されています。 iOSおよびOSXプラットフォームで作業している場合、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を使用したコードカバレッジの学習と調査に役立つリンクです。

0
taha027