Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away