Edited at

configureのビルドオプションで、簡単にCプログラムのカバレッジを取ろう!

More than 1 year has passed since last update.

単体テストコード、書いてはいるけど本当にテストケースは足りてるかな?

そんな時の目に見える指標であるカバレッジ、Linuxには標準でgcovというライブラリが含まれています。

せっかくなのでビルドオプションで切り替えていつでも利用出来るようにしましょう!


カバレッジ取得: gcov


使い方

手順は簡単です。


  • ビルドオプションに -fprofile-arcs -ftest-coverageを付ける。

  • ライブラリリンク -lgcovを設定する。

これでビルドしなおせばOKです。


ビルドオプションに追加しよう!

色々なビルドオプションによる切り替え方法があると思いますが、今利用している自作configureでのやり方を紹介。

configureを導入される場合はこちら等を参考にしてください。

まずは--enableオプションを追加します。


  1. AC_ARG_ENABLE(オプション名、[ヘルプ文言],[オプション指定時のスクリプト], デフォルト値)でオプション追加

  2. オプションが有効ならAC_CHECK_LIBgcovライブラリオプションと、AC_SUBST([GCOV_OPT])でgcov用のビルドオプションGCOV_OPTを追加。


configure.ac

###

# 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.conf

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を使ったもの。

こちらの手順を参考に、



  1. 本家サイトのtar.gzをダウンロード、展開。
    中はbuild済みでした。make installでインストール

  2. コード直下で以下を実行。コード内にバーっとhtmlファイルが作成されます。

$lcov -c -d . -o XXX.info

$genhtml -o . XXX.info

index.htmlを開いてみるとこんな感じにカバレッジ率が見えます。Line CoverageがいわゆるC0カバレッジってやつです。

この例だとテストコードはもちろんエラーなしなので率が低いですが、libは90%以上。

中を開くと通っていないコードが確認出来るのですが、それもmalloc失敗のような異常系なので、カバレッジからみたテスト網羅は問題ないといえます。

みたいな感じですね。


感想

次触る時は、もう少し掘り下げてテストスクリプトと連動させてC0カバレッジ率も自動チェックできるようにしたい!


参考

gcov

http://iyukki.blog56.fc2.com/blog-entry-154.html

lcov

http://d.hatena.ne.jp/t-kado/20100622