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

  • 1
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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

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