Posted at

kcovでラインカバレッジを収集する

More than 3 years have passed since last update.


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の出力はワンストップで実施される。


欠点


インストール


インストール前準備 (CentOS 6.6)

# yum install cmake

# yum install elfutils-libelf-devel elfutils-libs elfutils-devel
# yum install libcurl-devel
# yum install binutils-devel


kcov のインストール


  1. http://simonkagstrom.github.io/kcov/ のページ末尾のダウンロードリンクからソースコード一式をダウンロードする。


  2. ダウンロードしたアーカイブファイルを展開して、 cmake でビルドする。


$ cd kcov-28

$ mkdir build
$ cd cmake ..
$ make
$ sudo make install


カバレッジ収集対象プログラムのコンパイル

コンパイル時には -g を付与するだけでよい。

以下、サンプルを挙げるが、すでに手元にカバレッジ収集対象としたいソースファイルがあるなら、読み飛ばしてかまわない。


プログラムの作成

サンプルプログラムには単純なフィボナッチ数列の第n項を出力するプログラムを用います。


fib.c

#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

なお、出力ディレクトリに同じディレクトリを指定すれば、複数回のプログラム実行で収集したカバレッジデータを統合して出力できる。