ROS+gcovによるカバレッジ計測
概要
コードカバレッジ計測ツールであるgcovをROS1のcatkin toolsと共に使用する方法を共有します。カバレッジ計測結果の生成先が特殊で、後は通常のgcovの使用方法と同じです。
catkinワークスペースの構成やCMake+gcovでカバレッジを計測する流れを理解している方にとっては新規性はあまり無いと思います。とはいえROS目線でのgcovの使用方法の記事がほとんど存在しなかったので、ニッチですがここにまとめておきます。
サンプルパッケージは以下です。
CMake+gcovによるカバレッジ計測
CMake+gcovによるカバレッジ計測の方法については既存の記事が存在するので、詳しくはそちらをご参照下さい。ROS+gcovの場合も大枠は同じ作業となるため、まずCMake+gcovでカバレッジ計測が可能なことを確かめてから先に進むと良いと思います。
以下の記事が非常に参考になりました。
ここでは若干の補足に留めます。
フラグのセット
gcovを使用するために必要な作業はCMAKE_CXX_FLAGSとCMAKE_EXE_LINKER_FLAGSに--coverage
をセットすることです。CMakeの話になりますが方法は幾つかあります。
- CMakeLists.txtでset()を使用する
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
- cmake configure時に-Dオプションを使用する
cmake .. -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} --coverage"
- (catkin toolsでは、
catkin build -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} --coverage"
)
https://catkin-tools.readthedocs.io/en/latest/verbs/catkin_build.html#temporarily-changing-build-flags
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
サンプルパッケージ
テストコードはgcov_test.cpp、テスト対象関数の実装はmyabs.hに書かれています。
- hoge_test
- gcov_test.cpp # テストコード
- include/gcov_ros_sample
- myabs.h # テスト対象関数の実装
- CMakeLists.txt
- package.xml
サンプルパッケージでの実行例
サンプルパッケージgcov_ros_sampleに対してgcovでカバレッジを計測する手順を示します。
-
パッケージのビルドとテストの実行
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
-
gcovでカバレッジを表示
cd ~/catkin_ws/build/gcov_ros_sample/CMakeFiles/gcov_ros_sample_test.dir/hoge_test gcov gcov_test.cpp.gcda
-
(オプション) 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%になってしまうことがありました。その場合、最適化オプションを削除すれば正しく計測できました。
参考
- GCC Option
- https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/Instrumentation-Options.html
-
-DCMAKE_CXX_FLAGS="--coverage"
の挙動の詳細
- gcov/lcov
Discussion