4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?