CMakeでコードカバレッジカバレッジを簡単に収集:CTestCoverageCollectGCOVモジュール
CTestCoverageCollectGCOV
は CMake のモジュールであり、テスト実行後に生成された .gcda
ファイルを使用してコードカバレッジ情報を収集し、圧縮アーカイブ (.tar) ファイルにパッケージ化します。このアーカイブは、CDash などの継続的統合ツールで使用して、コードカバレッジ結果を分析するために使用できます。
機能
- オプションで、ラベル情報を含む
Labels.json
ファイルをアーカイブに追加します。 data.json
ファイルと.gcda
ファイルを圧縮アーカイブ (.tar) にパッケージ化します。- 収集した情報を
data.json
ファイルに保存します。 .gcda
ファイルからコードカバレッジ情報を収集します。
使用方法
CTestCoverageCollectGCOV
モジュールを使用するには、以下の手順に従います。
- CMakeLists.txt ファイルに次の行を追加します。
load_module(CTestCoverageCollectGCOV)
- テストを実行します。
ctest
- 以下のコマンドを実行して、圧縮アーカイブ (.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
このコードは、以下のことを行います。
- CMake のバージョン 3.2 以降を必要とします。
MyProject
という名前のプロジェクトを作成します。main.cpp
ファイルからMyProgram
という名前の実行可能ファイルをビルドします。MyTest
という名前のテストを追加します。CTestCoverageCollectGCOV
モジュールをロードします。- テストを実行します。
- 圧縮アーカイブ (.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 形式のコードカバレッジレポートを生成します。
独自のコードカバレッジ収集ツールを使用する
lcov
や coveralls
などの独自のコードカバレッジ収集ツールを使用することもできます。これらのツールは、CTestCoverageCollectGCOV
モジュールよりも機能が豊富で、より多くのオプションを提供している場合があります。
例
lcov を使用する
lcov
をインストールします。- テストを実行します。
- 以下のコマンドを実行して、コードカバレッジ情報を収集します。
lcov -c build/CMakeFiles/MyProject.dir
- 以下のコマンドを実行して、HTML 形式のコードカバレッジレポートを生成します。
genhtml -o coverage-report build/CMakeFiles/MyProject.dir
coveralls を使用する
coveralls
をインストールします。- テストを実行します。
- 以下のコマンドを実行して、コードカバレッジ情報を coveralls に送信します。
coveralls
このコマンドは、coveralls ウェブサイトにコードカバレッジレポートをアップロードします。
テストフレームワーク固有のコードカバレッジ機能を使用する
多くのテストフレームワークには、独自のコードカバレッジ機能が組み込まれています。これらの機能は、フレームワークに特化した機能を提供することがあります。
例
Google Test を使用する
- Google Test をインストールします。
- テストを実行します。
- 以下のコマンドを実行して、HTML 形式のコードカバレッジレポートを生成します。
gtest_filter_test_output > coverage.out
python src/gtest/coverage_output_generator.py coverage.out
このコードは、build
ディレクトリに coverage.html
という名前の HTML 形式のコードカバレッジレポートを生成します。