【初心者向け】CMake でコードカバレッジを簡単設定! CTEST_COVERAGE_EXTRA_FLAGS を使いこなそう


この変数の利点

  • コードカバレッジツールの設定: 使用しているコードカバレッジツールに固有のフラグを指定できます。
  • テストスイートのカバレッジ範囲の向上: テストスイート全体のカバレッジ範囲を向上させるために、特定のファイルや関数を除外するフラグを指定できます。
  • コードカバレッジレポートのカスタマイズ: 特定のニーズに合わせたレポートを生成するために、追加のフラグを指定できます。

CTEST_COVERAGE_EXTRA_FLAGS の使用方法

この変数は、ctest(1) コマンドラインツールまたは CMakeLists.txt ファイル内の ctest コマンドを使用して設定できます。


ctest --property CTEST_COVERAGE_EXTRA_FLAGS "-g --exclude-source /path/to/exclude"

上記の例では、-g フラグが CTest に渡され、ソースコードの行カバレッジレポートが生成されます。 また、/path/to/exclude ディレクトリ内のすべてのファイルがレポートから除外されます。

CMakeLists.txt ファイル内での設定

set(CTEST_COVERAGE_EXTRA_FLAGS "-g --exclude-source /path/to/exclude")

上記の例では、CTEST_COVERAGE_EXTRA_FLAGS 変数が -g --exclude-source /path/to/exclude に設定されます。 これにより、CTest が実行されるたびに、上記の例と同様の効果が得られます。

  • --exclude-line: 特定の行をレポートから除外します。
  • --exclude-source: 特定のファイルをレポートから除外します。
  • -b: ブランチカバレッジレポートを生成します。
  • -f: 関数カバレッジレポートを生成します。
  • -g: 行カバレッジレポートを生成します。


例 1: 行カバレッジレポートとソースコードの除外

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mycode.cpp)

target_link_libraries(mytarget mylib)

set(CTEST_COVERAGE_EXTRA_FLAGS "-g --exclude-source /path/to/exclude")

ctest_test(mytest
  COMMAND mytarget
)

この例では、以下のことが行われます。

  1. CMake のバージョン 3.10 以降が必要であることを指定します。
  2. myproject という名前のプロジェクトを作成します。
  3. mycode.cpp ファイルから mytarget という名前の実行可能ファイルを作成します。
  4. mytargetmylib ライブラリにリンクされるようにします。
  5. CTEST_COVERAGE_EXTRA_FLAGS 変数を -g --exclude-source /path/to/exclude に設定します。 これにより、行カバレッジレポートが生成され、/path/to/exclude ディレクトリ内のすべてのファイルがレポートから除外されます。
  6. mytest という名前のテストを作成し、mytarget 実行可能ファイルをコマンドとして実行します。

このテストを実行すると、CTest は /path/to/exclude ディレクトリを除いた mycode.cpp ファイルの行カバレッジレポートを生成します。

例 2: 関数カバレッジレポートとブランチカバレッジレポート

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mycode.cpp)

target_link_libraries(mytarget mylib)

set(CTEST_COVERAGE_EXTRA_FLAGS "-f -b")

ctest_test(mytest
  COMMAND mytarget
)
  1. CMake のバージョン 3.10 以降が必要であることを指定します。
  2. myproject という名前のプロジェクトを作成します。
  3. mycode.cpp ファイルから mytarget という名前の実行可能ファイルを作成します。
  4. mytargetmylib ライブラリにリンクされるようにします。
  5. CTEST_COVERAGE_EXTRA_FLAGS 変数を -f -b に設定します。 これにより、関数カバレッジレポートとブランチカバレッジレポートが生成されます。
  6. mytest という名前のテストを作成し、mytarget 実行可能ファイルをコマンドとして実行します。

このテストを実行すると、CTest は mycode.cpp ファイルの関数カバレッジレポートとブランチカバレッジレポートを生成します。

  • 使用しているコードカバレッジツールによっては、独自のフラグが必要になる場合があります。
  • 上記の例はあくまで基本的な例であり、ニーズに合わせて変更する必要があります。


コードカバレッジツール固有のオプションを使用する

多くのコードカバレッジツールは、CMake 以外の方法で設定できるオプションを提供しています。 これらのオプションを使用して、レポートのカスタマイズや特定のファイルの除外を行うことができます。 コードカバレッジツールのドキュメントを参照して、使用できるオプションを確認してください。

CMake ターゲットプロパティを使用する

CMake ターゲットプロパティを使用して、コードカバレッジツールの設定を指定することもできます。 これにより、CTEST_COVERAGE_EXTRA_FLAGS 変数を使用するよりも、コードをよりクリーンで整理しやすくなります。


cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mycode.cpp)

target_link_libraries(mytarget mylib)

target_compile_features(mytarget CXX_COVERAGE)

set_property(TARGET mytarget PROPERTY COVERAGE_FLAGS "-g --exclude-source /path/to/exclude")

ctest_test(mytest
  COMMAND mytarget
)

上記の例では、以下のことが行われます。

  1. CMake のバージョン 3.10 以降が必要であることを指定します。
  2. myproject という名前のプロジェクトを作成します。
  3. mycode.cpp ファイルから mytarget という名前の実行可能ファイルを作成します。
  4. mytargetmylib ライブラリにリンクされるようにします。
  5. mytarget ターゲットに CXX_COVERAGE ターゲットプロパティを設定します。 これにより、ターゲットがコードカバレッジ情報でコンパイルされるようになります。
  6. mytarget ターゲットの COVERAGE_FLAGS プロパティを -g --exclude-source /path/to/exclude に設定します。 これにより、行カバレッジレポートが生成され、/path/to/exclude ディレクトリ内のすべてのファイルがレポートから除外されます。
  7. mytest という名前のテストを作成し、mytarget 実行可能ファイルをコマンドとして実行します。

この例では、CTEST_COVERAGE_EXTRA_FLAGS 変数ではなく、ターゲットプロパティを使用してコードカバレッジ設定を指定しています。

CTest カスタムテストドライバーを使用する

CTest カスタムテストドライバーを使用して、コードカバレッジレポートの生成を完全に制御することもできます。 これにより、CTEST_COVERAGE_EXTRA_FLAGS 変数やターゲットプロパティよりも柔軟な方法でレポートをカスタマイズすることができます。

別のテストフレームワークを使用する

CMake 以外のテストフレームワークを使用することもできます。 多くのテストフレームワークは、組み込みのコードカバレッジ機能を提供しています。

  • コードの保守性
  • コードをどれだけ柔軟にカスタマイズしたいか
  • 使用しているコードカバレッジツール