kcov 概要
kcov(http://simonkagstrom.github.io/kcov/) はELF形式の実行可能バイナリファイル、Pythonプログラム、シェルスクリプト(sh/bash)のラインカバレッジを収集、表示するプログラムである。
以下では、kcovのインストールと、kcovを用いてELF形式のバイナリファイルを実行してカバレッジデータを収集するステップを説明する。
kcovが出力する html ファイルのサンプルが http://simonkagstrom.github.io/kcov/kcov-example-output/index.html で閲覧できる。
利点
- コンパイル時に
-fprofile-arcs -ftest-coverage
のオプションを付与しなくてもカバレッジデータを収集できる。(ただし-g
は必要) - 収集したカバレッジデータを表示するHTMLファイルを生成する
- covertura.xml を出力するため、JenkinsなどのCIサービスと連携できる
- HTMLやXMLの出力に、追加のコマンド入力を必要としない。プログラムの実行、カバレッジデータの収集、HTMLやXMLの出力はワンストップで実施される。
欠点
- ラインカバレッジのみをサポートする(つまり、ブランチカバレッジをサポートしない https://github.com/SimonKagstrom/kcov/issues/27)
- 関数の末尾などが実行行として扱われる
インストール
インストール前準備 (CentOS 6.6)
# yum install cmake
# yum install elfutils-libelf-devel elfutils-libs elfutils-devel
# yum install libcurl-devel
# yum install binutils-devel
kcov のインストール
-
http://simonkagstrom.github.io/kcov/ のページ末尾のダウンロードリンクからソースコード一式をダウンロードする。
-
ダウンロードしたアーカイブファイルを展開して、
cmake
でビルドする。
$ cd kcov-28
$ mkdir build
$ cd cmake ..
$ make
$ sudo make install
カバレッジ収集対象プログラムのコンパイル
コンパイル時には -g
を付与するだけでよい。
以下、サンプルを挙げるが、すでに手元にカバレッジ収集対象としたいソースファイルがあるなら、読み飛ばしてかまわない。
プログラムの作成
サンプルプログラムには単純なフィボナッチ数列の第n項を出力するプログラムを用います。
#include <stdio.h>
int fib(int n)
{
if (n <= 1) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
int main(int argc, char **argv)
{
int n;
if (argc == 1) {
fprintf(stderr, "Usage\nfib n\n");
exit(EXIT_FAILURE);
}
n = atoi(argv[1]);
printf("%d\n", fib(n));
exit(EXIT_SUCCESS);
}
カバレッジデータを収集するプログラムをコンパイルする際には -g
オプションを付与してデバッグデータを埋め込む必要があります。
$ gcc -g fib.c
kcov を用いたカバレッジ収集
コマンド書式
kcov out-dir in-file [args...]
out-dir: カバレッジデータを出力するディレクトリ
in-file: カバレッジデータを収集する実行可能ファイル
args: in-fileのプログラム引数
カバレッジ収集
以下のコマンドを実行すると、fib
プログラムに引数 10
を与えて実行し、カバレッジデータを収集する。
収集したカバレッジデータはfib.out ディレクトリに出力される。
$ kcov fib.out fib 10
89
カバレッジデータを可視化したhtmlファイルが指定した出力ディレクトリに出力される。
$ ls kcov.out/index.html
kcov.out/index.html
htmlだけではなく、cobertura.xmlも出力される。
$ find . -name "*.xml"
./kcov.out/fib/cobertura.xml
なお、出力ディレクトリに同じディレクトリを指定すれば、複数回のプログラム実行で収集したカバレッジデータを統合して出力できる。