単体テストコード、書いてはいるけど本当にテストケースは足りてるかな?
そんな時の目に見える指標であるカバレッジ、Linuxには標準でgcov
というライブラリが含まれています。
せっかくなのでビルドオプションで切り替えていつでも利用出来るようにしましょう!
カバレッジ取得: gcov
使い方
手順は簡単です。
- ビルドオプションに
-fprofile-arcs -ftest-coverage
を付ける。 - ライブラリリンク
-lgcov
を設定する。
これでビルドしなおせばOKです。
ビルドオプションに追加しよう!
色々なビルドオプションによる切り替え方法があると思いますが、今利用している自作configureでのやり方を紹介。
configureを導入される場合はこちら等を参考にしてください。
まずは**--enable
オプション**を追加します。
- AC_ARG_ENABLE(オプション名、[ヘルプ文言],[オプション指定時のスクリプト], デフォルト値)でオプション追加
- オプションが有効なら
AC_CHECK_LIB
でgcov
ライブラリオプションと、AC_SUBST([GCOV_OPT])
でgcov用のビルドオプションGCOV_OPT
を追加。
###
# Unit test option
AC_ARG_ENABLE(coverage,
[ --enable-coverage enable coverage test, only for developer of this package. Please "Don't" use this package if you install it, gcov is GPL license [[default=no]]],
[\
case "${enableval}" in
yes) enable_coverage=yes ;;
*) AC_MSG_ERROR(bad value for --enable-) ;;
esac],
enable_coverage=no)
# check flag, and add gcov option
if test x"${enable_coverage}" = x"yes"; then
AC_CHECK_LIB([gcov], [main])
GCOV_OPT="-fprofile-arcs -ftest-coverage"
AC_SUBST([GCOV_OPT])
fi
後は、Makefile.am等にgcov用に設定したGCOV_OPT
オプションを渡せばOK。デフォルトは空なので追記でOKです。
この例ではMakefile.amに読み込ませる共通設定に仕込みました。
AM_CPPFLAGS=-I$(top_srcdir)/design_pattern_util/include/ -I$(top_srcdir)/design_pattern_util/include/ $(GCOV_OPT)
ヘルプで見るとこんな感じ。ヘルプが出ると楽しいですね。(AC_HELP_STRINGで文言を書くと、もっときれいに出力できます)
$ ./configure --help
--enable-coverage enable coverage test, only for developer of this package. Please "Don't" use this package if you install it, gcov is GPL license [default=no]
うまくgcovが利用できていれば、ビルド後のコード横にこんな*.gcno
ファイルが出来ます。
$ ls chain_of_responsibility/lib/
chain_element.c chain_element.h chain_element.o chain_of_responsibility.gcno chain_of_responsibility.map libchainofresp.la Makefile.am
chain_element.gcno chain_element.lo chain_of_responsibility.c chain_of_responsibility.lo chain_of_responsibility.o Makefile Makefile.in
後はテストを実行すれば、カバレッジがわかります。これで自動カバレッジ取得も出来そうですね。
カバレッジの確認: lcov
さあテストしました。結果を見よう!となっても、結果はバイナリデータで出力されるので、人が見ることのできるようにしないときついです。
一番結果がわかりやすい方法がlcov
を使ったもの。
こちらの手順を参考に、
-
本家サイトのtar.gzをダウンロード、展開。
中はbuild済みでした。make install
でインストール - コード直下で以下を実行。コード内にバーっとhtmlファイルが作成されます。
$lcov -c -d . -o XXX.info
$genhtml -o . XXX.info
index.html
を開いてみるとこんな感じにカバレッジ率が見えます。Line CoverageがいわゆるC0カバレッジってやつです。

この例だとテストコードはもちろんエラーなしなので率が低いですが、libは90%以上。
中を開くと通っていないコードが確認出来るのですが、それもmalloc失敗のような異常系なので、カバレッジからみたテスト網羅は問題ないといえます。
みたいな感じですね。
感想
次触る時は、もう少し掘り下げてテストスクリプトと連動させてC0カバレッジ率も自動チェックできるようにしたい!