CMakeでコードカバレッジカバレッジを簡単に収集:CTestCoverageCollectGCOVモジュール


CTestCoverageCollectGCOV は CMake のモジュールであり、テスト実行後に生成された .gcda ファイルを使用してコードカバレッジ情報を収集し、圧縮アーカイブ (.tar) ファイルにパッケージ化します。このアーカイブは、CDash などの継続的統合ツールで使用して、コードカバレッジ結果を分析するために使用できます。

機能

  • オプションで、ラベル情報を含む Labels.json ファイルをアーカイブに追加します。
  • data.json ファイルと .gcda ファイルを圧縮アーカイブ (.tar) にパッケージ化します。
  • 収集した情報を data.json ファイルに保存します。
  • .gcda ファイルからコードカバレッジ情報を収集します。

使用方法

CTestCoverageCollectGCOV モジュールを使用するには、以下の手順に従います。

  1. CMakeLists.txt ファイルに次の行を追加します。
load_module(CTestCoverageCollectGCOV)
  1. テストを実行します。
ctest
  1. 以下のコマンドを実行して、圧縮アーカイブ (.tar) ファイルを生成します。
ctest_coverage_collect_gcov

オプション

CTestCoverageCollectGCOV モジュールは、以下のオプションを提供します。

  • CTEST_COVERAGE_COLLECT_GCOV_LABELS: ラベル情報を含む Labels.json ファイルをアーカイブに追加するかどうかを指定します。
  • CTEST_COVERAGE_COLLECT_GCOV_COMPRESSION: 圧縮アーカイブ (.tar) ファイルの圧縮方法を指定します。
  • CTEST_COVERAGE_COLLECT_GCOV_OPTIONS: gcov コマンドに渡されるオプションを指定します。

以下の例は、gcov コマンドに -f オプションを渡し、圧縮アーカイブ (.tar) ファイルを gzip で圧縮する方法を示しています。

load_module(CTestCoverageCollectGCOV)

set(CTEST_COVERAGE_COLLECT_GCOV_OPTIONS "-f")
set(CTEST_COVERAGE_COLLECT_GCOV_COMPRESSION "GZIP")

ctest
ctest_coverage_collect_gcov

CTestCoverageCollectGCOV モジュールの詳細については、以下のリソースを参照してください。

  • 圧縮アーカイブ (.tar) ファイルは、CDash などの継続的統合ツールで使用して、コードカバレッジ結果を分析するために使用できます。
  • コードカバレッジ情報を収集するには、テストが gcov でインストルメント化されている必要があります。
  • CTestCoverageCollectGCOV モジュールは、CMake 3.2 以降で使用できます。


cmake_minimum_required(VERSION 3.2)

project(MyProject)

add_executable(MyProgram main.cpp)

# テストを追加します
add_test(MyTest MyProgram)

# CTestCoverageCollectGCOV モジュールをロードします
load_module(CTestCoverageCollectGCOV)

# テストを実行します
ctest

# 圧縮アーカイブ (.tar) ファイルを生成します
ctest_coverage_collect_gcov

このコードは、以下のことを行います。

  1. CMake のバージョン 3.2 以降を必要とします。
  2. MyProject という名前のプロジェクトを作成します。
  3. main.cpp ファイルから MyProgram という名前の実行可能ファイルをビルドします。
  4. MyTest という名前のテストを追加します。
  5. CTestCoverageCollectGCOV モジュールをロードします。
  6. テストを実行します。
  7. 圧縮アーカイブ (.tar) ファイルを生成します。

圧縮アーカイブ (.tar) ファイルは、build ディレクトリに MyProject-coverage.tar.gz という名前で生成されます。このアーカイブには、以下のファイルが含まれます。

  • .gcda ファイル: テスト実行後に生成されたカバレッジデータファイル
  • data.json: コードカバレッジ情報を含む JSON ファイル
  • 圧縮アーカイブ (.tar) ファイルを別の場所に保存するように、ctest_coverage_collect_gcov コマンドの引数を変更します。
  • CTEST_COVERAGE_COLLECT_GCOV_OPTIONS などのオプションを使用して、CTestCoverageCollectGCOV モジュールの動作をカスタマイズします。
  • テストのフレームワークに応じて、テストを追加するためのコードを変更します。


  • コードが複雑です。
  • オプションが限られています。
  • すべてのテストフレームワークで動作するとは限りません。

これらの欠点を補うために、CTestCoverageCollectGCOV の代替方法をいくつか紹介します。

CMake 内蔵のコードカバレッジ機能を使用する

CMake には、ctest_coverage_report コマンドを使用してコードカバレッジ情報を生成する機能が組み込まれています。この機能は、CTestCoverageCollectGCOV モジュールよりもシンプルで汎用性があります。

cmake_minimum_required(VERSION 3.10)

project(MyProject)

add_executable(MyProgram main.cpp)

# テストを追加します
add_test(MyTest MyProgram)

# テストを実行します
ctest

# HTML 形式のコードカバレッジレポートを生成します
ctest_coverage_report

このコードは、build ディレクトリに MyProject-coverage.html という名前の HTML 形式のコードカバレッジレポートを生成します。

独自のコードカバレッジ収集ツールを使用する

lcovcoveralls などの独自のコードカバレッジ収集ツールを使用することもできます。これらのツールは、CTestCoverageCollectGCOV モジュールよりも機能が豊富で、より多くのオプションを提供している場合があります。

lcov を使用する

  1. lcov をインストールします。
  2. テストを実行します。
  3. 以下のコマンドを実行して、コードカバレッジ情報を収集します。
lcov -c build/CMakeFiles/MyProject.dir
  1. 以下のコマンドを実行して、HTML 形式のコードカバレッジレポートを生成します。
genhtml -o coverage-report build/CMakeFiles/MyProject.dir

coveralls を使用する

  1. coveralls をインストールします。
  2. テストを実行します。
  3. 以下のコマンドを実行して、コードカバレッジ情報を coveralls に送信します。
coveralls

このコマンドは、coveralls ウェブサイトにコードカバレッジレポートをアップロードします。

テストフレームワーク固有のコードカバレッジ機能を使用する

多くのテストフレームワークには、独自のコードカバレッジ機能が組み込まれています。これらの機能は、フレームワークに特化した機能を提供することがあります。

Google Test を使用する

  1. Google Test をインストールします。
  2. テストを実行します。
  3. 以下のコマンドを実行して、HTML 形式のコードカバレッジレポートを生成します。
gtest_filter_test_output > coverage.out
python src/gtest/coverage_output_generator.py coverage.out

このコードは、build ディレクトリに coverage.html という名前の HTML 形式のコードカバレッジレポートを生成します。