背景と目的
前回の続きの記事です。
下記に対応します。
背景と目的
- ⑦カバレッジを行単位で表示できること(別途記載予定)
前回はユニットテストの実行環境を構築するだけで終わりましたが、それに加えて
htmlのカバレッジレポートを出力できるようにします。
サンプルコード
本記事は、ミニマムなサンプルコードを追っていけば目的を達成できるようになっています
といってもコードのほうに詳しいコメントを記述しているわけではないので、簡単に解説を下記に記述します。
サンプルコードはこちら
お試し環境
- os: Ubuntu 16.04 LTS
- tool: gcc-5.4.0, cmake-3.10.2, lcov-1.12
- lcovがインストールされていることが前提です
- lcovのインストール方法例(他の方法もあると思います):
$ mkdir ~/tmp
$ wget https://github.com/linux-test-project/lcov/releases/download/v1.12/lcov-1.12.tar.gz -O ~/tmp/lcov-1.12.tar.gz
$ tar xfz ~/tmp/lcov-1.12.tar.gz -C ~/tmp/
$ cd ~/tmp/lcov-1.12
$ sudo make install
解説
- 前回からの差分を説明していきます。
- まずは、test側のビルドオプションに「--coverage」を追加します。
- このオプションは、gcov用のファイルを出力するオプションで、build/test/CMakeFiles/UnitTestExecutor.dir配下に.gcnoというファイルが生成されます
- このオプションは、コンパイル時には「-fprofile-arcs -ftest-coverage」、リンク時には「-lgcov」に付けてくれる便利なものです。
test/CMakeList.txt
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") # 追加
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") # 追加
set(MY_SRCS_MINUS_MAIN ${MY_SRCS})
list(REMOVE_ITEM MY_SRCS_MINUS_MAIN ${PROJECT_SOURCE_DIR}/src/main.cpp)
# [以下、省略]
- ビルドする(前回を参照)
- 次にテストを実行してから、カバレッジ結果をhtmlで出力するまでの手順ですが、
- ①テスト実行
- ②lcov(gcov)でカバレッジ解析
- ③不要な情報を削除
- ③htmlを生成する
- 手順をスクリプトにすると、こんな感じです
runtest.sh
# run test to output gcov files
cd build/test
./UnitTestExecutor
# make coverage data
cd CMakeFiles/UnitTestExecutor.dir
lcov -d . -c -o coverage.info
# remove unnecessary file paths
lcov -r coverage.info */googletest/* test/* */c++/* -o coverageFiltered.info
# make html report
genhtml -o lcovHtml --num-spaces 4 -s --legend coverageFiltered.info
- テストを実行すると、gcnoファイルがあったディレクトリにgcdaファイルが出力されます。
- 次にlcovを実行すると、内部ではgcovが実行されカバレッジ解析されhtml化するための情報が生成されます。
- そのままだと、外部プロジェクト、testコード、C++標準ライブラリなどの結果も含まれているので、必要に応じて取り除きます。
- 必要なものだけ抽出する方法(-eオプション)もあります。自プロジェクトのソースファイルには接頭辞をつける規約があれば、このようなときに役立ちます。
- genhtmlでhtmlを生成します。lcovHtmlというフォルダが生成されて、そこにhtmlファイルが保存されて終了です。
- オプションは最低限にしています。
- ちなにみ、参考サイトにも書いてありますが、作業ディレクトリをどこにして、どこにファイルを出力すればいいのか、というところでハマりやすい気がします。
- 実行すると、
$ ./runtest.sh
- 結果は、build/test/CMakeFiles/UnitTestExecutor.dir/lcovHtmlに出力されてindex.htmlを開くと、無事にカバレッジ結果が表示されるはずです。
- それにしても、このデザイン、もう少しモダンにする方法ないですかね。。。