コードカバレッジとは何ですか?また、どのように測定しますか?
-
10-07-2019 - |
質問
コードカバレッジとは何ですか。どのように測定しますか?
テストコードカバレッジの自動化に関してこの質問をされました。自動化ツールの外では、科学よりも芸術であるようです。コードカバレッジの使用方法の実例はありますか?
解決
コードカバレッジは、自動テストの実行中にコードの行/ブロック/アークが実行された回数の測定値です。
コードカバレッジは、専用のツールを使用して収集され、バイナリをインスツルメントしてトレースコールを追加し、インスツルメントされた製品に対して自動テストのフルセットを実行します。優れたツールを使用すると、実行されるコードの割合だけでなく、データを掘り下げて特定のテスト中に実行されたコードの行を正確に確認できます。
当社のチームは、 Magellan -コードカバレッジツールの社内セットを使用しています。 。 .NETショップの場合、Visual Studioにはコードカバレッジを収集するためのツールが統合されています。 この記事で説明されているようないくつかのカスタムツールを使用することもできます。
C ++ショップの場合、インテルには WindowsおよびLinuxで実行するツール。ただし、使用していません。 GCC用のgcovツールもあると聞きましたが、それについては何も知らず、リンクを提供できません。
使用方法について-コードカバレッジは、各マイルストーンの終了基準の1つです。実際には、3つのコードカバレッジメトリックがあります-単体テスト(開発チームから)、シナリオテスト(テストチームから)、および結合カバレッジからのカバレッジ。
ところで、コードカバレッジはどの程度のテストを行っているかを示す良い指標ですが、必ずしも製品をどの程度テストしているかを示す良い指標ではありません。品質を確保するために、コードカバレッジとともに使用する必要がある他のメトリックがあります。
他のヒント
コードカバレッジは、基本的にテストでカバーされるコードの量をテストします。したがって、コードカバレッジが90%である場合、テストでカバーされていないコードは10%あります。コードの90%はカバーされていると考えているかもしれませんが、別の角度から見る必要があります。 100%のコードカバレッジが得られない理由は何ですか?
良い例は次のとおりです:
if(customer.IsOldCustomer())
{
}
else
{
}
今、上記のコードには2つのパス/ブランチがあります。常に「はい」を押す場合ブランチの場合、else部分はカバーされず、コードカバレッジの結果に表示されます。これは、カバーされていないものがわかったので、else部分をカバーするテストを作成できるので便利です。コードカバレッジがなかった場合は、爆発するために時限爆弾の上に座っているだけです。
NCover は、コードカバレッジを測定するための優れたツールです。
「100%コードカバレッジ」があることを忘れないでください。すべてが完全にテストされるという意味ではありません-コードのすべての行がテストされることを意味しますが、すべての(一般的な)状況でテストされるという意味ではありません。
コードカバレッジを使用して、おそらくテストを記述する必要があるコードの一部を強調表示します。たとえば、現在のユニットテストの実行中にmyImportantFunction()が表示されるコードカバレッジツールが実行されない場合は、おそらく改善する必要があります。
基本的に、100%のコードカバレッジは、コードが完璧であることを意味しません。より包括的な(ユニット)テストを書くためのガイドとして使用します。
これまでの回答の多くにいくつかのポイントを補完する:
コードカバレッジとは、テストセットがソースコードをどれだけカバーしているかを意味します。つまり、テストコードのセットでカバーされるソースコードの範囲。
上記の回答で述べたように、パス、条件、関数、ステートメントなど、さまざまなカバレッジ基準があります。ただし、追加の基準は次のとおりです
- 条件カバレッジ:すべてのブール式はtrueおよびfalseで評価されます。
- デシジョンカバレッジ:trueとfalseを一度だけ評価するブール式だけでなく、後続のすべてのif-elseif-else本文をカバーします。
- ループカバレッジ:つまり、考えられるすべてのループが1回、1回以上、ゼロ回実行されました。また、上限に仮定がある場合、可能であれば、上限時間をテストし、上限時間より1つ多くテストします。
- 入口と出口のカバレッジ:すべての可能な呼び出しとその戻り値をテストします。
- パラメータ値カバレッジ(PVC)。パラメーターのすべての可能な値がテストされているかどうかを確認します。たとえば、文字列は一般的に次のいずれかです。a)null、b)空、c)空白(スペース、タブ、改行)、d)有効な文字列、e)無効な文字列、f)シングルバイト文字列、g )2バイト文字列。考えられる各パラメーター値のテストに失敗すると、バグが残る場合があります。これらの1つだけをテストすると、各行がカバーされるため、100%のコードカバレッジになりますが、7つのオプションのうち1つだけがテストされるため、パラメーター値のカバレッジは14.2%になります。
- 継承カバレッジ:オブジェクト指向ソースの場合、基本クラスによって参照される派生オブジェクトを返すとき、兄弟オブジェクトが返される場合、評価するカバレッジをテストする必要があります。
注:静的コード分析では、到達不能コードまたはハングコード、つまり他の関数呼び出しでカバーされていないコードがあるかどうかを検出します。また、その他の静的なカバレッジ。静的コード分析で100%のコードがカバーされていると報告された場合でも、可能なコードカバレッジがすべてテストされている場合、テストセットに関するレポートは提供されません。
コードカバレッジは、前の回答で詳しく説明されています。したがって、これは質問の2番目の部分に対するより多くの回答です。
コードカバレッジを決定するために3つのツールを使用しました。
- JTest -JUnit上に構築された独自のツール。 (単体テストも生成します。)
- Cobertura -JUnitテストと簡単に結合してレポートを生成できるオープンソースコードカバレッジツール。
- Emma -もう1つ-単体テストとは少し異なる目的で使用したもの。エンドユーザーがWebアプリケーションにアクセスしたときにカバレッジレポートを生成するために使用されています。これとWebテストツール(例:Canoo)を組み合わせると、一般的なエンドユーザーの使用中にカバーされるコードの量を示す非常に有用なカバレッジレポートが得られます。
これらのツールを使用して
- 開発者が優れた単体テストを作成したことを確認する
- ブラックボックステスト中にすべてのコードがトラバースされることを確認する
コードカバレッジは、テストされるコードの単なる尺度です。測定可能なカバレッジ基準はさまざまですが、通常は、カバレッジ全体を構成するのはプログラム内のさまざまなパス、条件、機能、およびステートメントです。コードカバレッジメトリックは、これらの各カバレッジ基準を実行するテストのほんの一部です。
プロジェクトの単体テストカバレッジの追跡方法については、静的コード分析ツールを使用して追跡します。
Perlには、定期的に使用する優れた Devel :: Cover モジュールがあります私のモジュール。
ビルドとインストールがModule :: Buildで管理されている場合は、 ./ Build testcover
を実行するだけで、サブ、行、条件ごとのカバレッジを示すnice HTMLサイトを取得できます。どのコードパスがカバーされていないかを簡単に確認できる色。
前の回答では、コードカバレッジについて詳しく説明しています。 iOS
および OSX
プラットフォームで作業している場合、Xcodeはコードカバレッジをテストおよび監視する機能を提供します。
参照リンク:
https://medium.com/zendesk-engineering/code -coverage-and-xcode-6b2fb8756a51
どちらも、Xcodeを使用したコードカバレッジの学習と調査に役立つリンクです。