JenkinsのCobertura Pluginとlcov-to-cobertura-xmlでC/C++のコードカバレッジを測方法をまとめます。
Debian 8で実行しています。
Table of Contents
1 Cobertura Pluginとは
CoberturaによるコードカバレッジをJenkins上で閲覧するプラグインです。
CebratureはJavaのコードカバレッジレポートツールです。HTML出力をサポートしております。Cobrtura Pluginを用いることでビルド毎のコードカバレッジを記録することができ、ビルド毎のコードカバレッジの偏移を把握することができます。
2 lcov-to-cobertura-xmlとは
lcovの出力結果をCoberturaの形式に変換するpythonスクリプトです。
lcovはgcovのグラフィカルなフロントエンドツールです。
C/C++コードカバレッジレポートツールのgcovの結果をグラフィカルに閲覧することができます。
lcov単体でもHTML出力をサポートしておりますが、Jenkinsと連携できるCoberturaの形式に変換する為にlcov-to-cobertura-xmlを用います。
2.1 lcov-to-cobertura-xmlの使い方
以下の手順でCobertura用データを作成します。
1. CFLAGSやCXXFLAGSに-coverageオプションを付けてプログラムをビルド 2. プログラムを実行してgcov用データ出力 3. lcov用データ出力 4. lcov-to-cobertura-xmlでCobertura用データに変換
3 他のC/C++のコードカバレッジ閲覧方法について
Cobertura Pluginとlcov-to-cobertura-xmlを用いる方法以外にもCobertura Pluginとgcovrを用いる方法と、HTML Publisher Pluginとlcovを用いる方法があるらしいのですが、上手く動作しませんでした。
3.1 Cobertura Pluginとgcovrの問題点
gcovrのxml出力結果をJenkinsのCobertura Pluginに読み込ませることで、Jenkins上でコードカバレッジを閲覧できます。
gcovrはソースツリーのパスの追跡が上手くできておらず、ソースコードの参照ができません(ひとつのディレクトリ直下に全てのソースコードがあるような場合は問題ないようなのですが)。
コードカバレッジが減少した場合にソースコードの実行パスが見れないので困ります。
3.2 HTML Publisher Pluginとlcovの問題点
lcov(genhtml)のhtml出力結果をJenkinsのHTML Publisher Pluginに読み込ませることで、ソースコードのカバレッジを閲覧できます。
あくまでhtml出力結果のリンクが生成されるだけで、コードカバレッジの履歴を残すことができません(ビルド毎のコードカバレッジのグラフが表示できない)。
ビルド毎のコードカバレージの差分が分かりにくい為、繰り返しテストを実行できるJenkinsのメリットに合いません。
4 Cobertura Pluginのインストール
Jenkinsのプラグイン制御画面からインストールします。
Jenkinsの管理 -> プラグインの管理 -> 利用可能
5 lcov-to-cobertura-xmlのインストール
lcov_coberturaというpythonスクリプトをダウンロードします。
$ wget https://raw.githubusercontent.com/eriwen/lcov-to-cobertura-xml/master/lcov_cobertura/lcov_cobertura.py $ chmod a+x lcov_cobertura.py $ sudo cp lcov_cobertura.py /usr/local/bin/ $ rm -f lcov_cobertura.py
setup.pyを用いてシステムにインストールした場合、lcov-to-cobertura-xmlが提供するpythonインターフェースを自身で作成したpythonスクリプトにて利用できるようになります。
6 ジョブの設定
6.1 ビルド手順の追加
ビルド手順の追加にて、「シェルの実行」を選択します。
ソースコードを-coverageオプションを付けてビルドします。
# Clean files make clean # Run gcc with -coverage option make gcov
プログラムを動作させます。
# Run program for code coverage ./myprog
lcovでgcov用データを収集して、lcov用データを作成します。
lcov –removeで一度作成したlcov用データから自分が追跡しないデータを排除します。私の環境では、/usr/include以下のファイルを排除してます(C/C++標準ライブラリのコードカバレッジ測定は目的ではないので)。
# Run lcov and output to 'lcov' directory mkdir lcov lcov -c -d . -o lcov/coverage.info lcov --remove lcov/coverage.info "*/usr/include/*" -o lcov/coverage.info
lcov_cobertura.pyでlcov用データをCobertura用データに変換します。
# Run lcov_cobertura.py and output to 'lcov' directory lcov_cobertura.py lcov/coverage.info -b `pwd` -o lcov/coverage.xml
6.2 ビルド後の処理
ビルド後の処理の追加にて、「Cobertura カバレッジ・レポートの集計」を選択します。
Cobertura XMLレポートパターンにCobertura用データのパスを指定します。
7 ジョブ実行後の画面
ジョブを実行するとコードカバレッジのサマリーが表示されました。
ソースコードレベルで実行されたパスを確認できます。