📚

ROS+gcovによるカバレッジ計測

2024/04/30に公開

概要

コードカバレッジ計測ツールであるgcovをROS1のcatkin toolsと共に使用する方法を共有します。カバレッジ計測結果の生成先が特殊で、後は通常のgcovの使用方法と同じです。

catkinワークスペースの構成やCMake+gcovでカバレッジを計測する流れを理解している方にとっては新規性はあまり無いと思います。とはいえROS目線でのgcovの使用方法の記事がほとんど存在しなかったので、ニッチですがここにまとめておきます。

サンプルパッケージは以下です。
https://github.com/araitaiga/gcov_ros_sample/tree/main

CMake+gcovによるカバレッジ計測

CMake+gcovによるカバレッジ計測の方法については既存の記事が存在するので、詳しくはそちらをご参照下さい。ROS+gcovの場合も大枠は同じ作業となるため、まずCMake+gcovでカバレッジ計測が可能なことを確かめてから先に進むと良いと思います。

以下の記事が非常に参考になりました。
https://qiita.com/iydmsk/items/0021d1ef14660184f396

ここでは若干の補足に留めます。

フラグのセット

gcovを使用するために必要な作業はCMAKE_CXX_FLAGSとCMAKE_EXE_LINKER_FLAGSに--coverageをセットすることです。CMakeの話になりますが方法は幾つかあります。

ROS(catkin tools)+gcovによるカバレッジ計測

ROS(catkin tools)+gcovによるカバレッジ計測の手順は基本的に上記のCMake+gcovによる手順と同じです。ただし一点だけ注意が必要で、テスト実行時にカバレッジ計測結果が生成されるpathが少し特殊です。

カバレッジ計測結果の生成先

テスト実行時のカバレッジ計測結果の生成先は、
catkin_ws/build/<package名>/CMakeFiles/<ビルドターゲット名>.dir/<ソースファイルのディレクトリ名>
になります。これでは抽象的なのでもう少し詳しくcatkinワークスペースの構成を見ていきます。

catkinワークスペースは以下のような構成になっていて、この中で今回重要なのはbuildディレクトリです。buildディレクトリ内にはビルド済みの各packageのディレクトリが存在し、それぞれにCMake関連ファイル等が格納されています。

## catkin_ws

- build
  - package1
    - CMakeFiles # 生成先はこの中
    - CMakeCache.txt
    - etc.
  - package2
    - CMakeFiles
    - CMakeCache.txt
    - etc.
- devel
- logs
- src

catkin_ws/build/<package名>/CMakeFilesディレクトリ内は以下のようになっています。ビルドターゲット毎にディレクトリが存在し、更にその中に<ソースファイルのディレクトリ名>が存在します。

## catkin_ws/build/<package>/CMakeFiles

- <build_target名1>.dir
  - CMake生成ファイル
  - <ソースファイルのディレクトリ名> # 生成先はこの中
    - <まだ空>
- <build_target名2>.dir
- etc.

対象のpackageに対してcatkin testを実行すると、上記の<ソースファイルのディレクトリ名>内にカバレッジ計測結果.gcdaが生成されます。
対象のpackageが複数のテストコードをビルドする場合、それぞれのビルドターゲットに対応する<build_target名>.dirの中に.gcdaファイルが生成されることになります。

## catkin_ws/build/<package>/CMakeFiles

- <build_target名1>.dir
  - CMake生成ファイル
  - <ソースファイルのディレクトリ名>
    - <テストコードファイル名>.gcda # カバレッジ計測結果
    - <テストコードファイル名>.o
    - <テストコードファイル名>.gcno

サンプルパッケージ

https://github.com/araitaiga/gcov_ros_sample/tree/main

テストコードはgcov_test.cpp、テスト対象関数の実装はmyabs.hに書かれています。

- hoge_test
  - gcov_test.cpp # テストコード
- include/gcov_ros_sample
  - myabs.h # テスト対象関数の実装
- CMakeLists.txt
- package.xml

サンプルパッケージでの実行例

サンプルパッケージgcov_ros_sampleに対してgcovでカバレッジを計測する手順を示します。

  1. パッケージのビルドとテストの実行

    cd ~/catkin_ws/src/gcov_ros_sample
    catkin build --this
    catkin test --this
    

    catkin build/testを実行すると、buildディレクトリ内のgcov_ros_sample_test.dir/hoge_testディレクトリ内にカバレッジ計測結果が生成されます。

    ## ~/catkin_ws/build/gcov_ros_sample/CMakeFiles
    
    - gcov_ros_sample_test.dir
      - CMake生成ファイル
      - hoge_test
        - gcov_sample_test.cpp.gcda # カバレッジ計測結果
        - gcov_sample_test.cpp.o
        - gcov_sample_test.cpp.gcno
    
  2. gcovでカバレッジを表示

    cd ~/catkin_ws/build/gcov_ros_sample/CMakeFiles/gcov_ros_sample_test.dir/hoge_test
    gcov gcov_test.cpp.gcda
    
  3. (オプション) lcovでhtmlを作成

    lcov -d . -c --rc lcov_branch_coverage=1 -o LcovData.info && genhtml LcovData.info --branch-coverage -o ./info
    

    info/index.htmlというファイルをブラウザで開くと、GUIでカバレッジの計測結果を確認することができます。

    サンプルパッケージではテスト対象関数はmyabs.hに実装されており、そのリンクを開くと詳細なカバレッジ状況を確認できます。

備考

gccの最適化オプションが原因でカバレッジが正しく計測されず、常に0.0%になってしまうことがありました。その場合、最適化オプションを削除すれば正しく計測できました。

参考

Discussion