Rustでkcovを使って行カバレッジを計測する

まとまった時間が取れたので Rust 言語の勉強を始めることにした。何はともあれ、もはや自動単体テストを書きながら開発しないと落ち着かないので、Rust でのテストカバーレジの計測方法を調べてみた。今のところ、 kcov を使った行カバレッジ、つまり行単位で何割にあたるソースコードが単体テストで実行されたのかを取得するのが簡単そうだった。

以下、カバレッジ取得をするために必要なセットアップ手順を備忘録しておく。

前提環境

以下の環境で動作確認をした。

  • Ubuntu 18.04
  • rustup 1.20.2 (13979c968 2019-10-16)
  • rustc 1.38.0 (625451e37 2019-09-23)
  • cargo-kcov 0.5.2
  • kcov 37

なお kcov は Windows では使えない。が、WSL 上の Ubuntu でも同様に環境を整えられるので、Windows 開発者は WSL 環境でセットアップして、カバレッジ計測時に適宜 WSL を起動すれば良いだろう。

セットアップ手順

  1. 必要なOSのパッケージをインストール

    sudo apt-get install binutils-dev libiberty-dev libcurl4-openssl-dev libelf-dev libdw-dev cmake gcc g++
    
    • 参考にした以下フォーラム投稿で挙げられたパッケージに加え、自分の環境では g++libiberty-devbinutils-dev も必要だった。

      users.rust-lang.org

  2. kcov をビルド・インストール

    curl -sSL https://github.com/SimonKagstrom/kcov/archive/master.tar.gz | tar xz
    cd kcov-master
    mkdir build
    cd build
    cmake ..  # [*1]
    make
    sudo make install
    
    • [*1] 上記の通り実行すると kcov は /usr/local 下にインストールされる。インストール先を、たとえば /opt 下に変更したければ cmake -DCMAKE_INSTALL_PREFIX=/opt .. などと追加オプションを指定してやること。
  3. cargo-kcov をインストール

    cargo install cargo-kcov
    
  4. カバレッジを計測したいプロジェクトのディレクトリで cargo-kcov を実行

    cd /path/to/the/rust/project
    cargo kcov
    

ターミナル出力は cargo test と完全に同じ内容になるものの、ひっそりと target/cov/index.html にカバレッジレポートが出力されているはず。カバレッジレポートはプロジェクト全体のカバー率、ファイルごとのカバー率、およびファイルごとの詳細が含まれている。ファイルごとの詳細画面の例を、以下に貼り付けておく。カバーした行は緑色、カバーできなかった行は赤色で表示されており、分かりやすい。

f:id:sgryjp:20191022235856p:plain
cargo-kcov出力例

レポートは静的に出力されるため、一度ブラウザーで開いておけば、リロードするだけで最新情報に表示を更新できる。これだけできれば十分だね。ありがたく使わせてもらうとしよう。