Erlang でコードカバレッジを取得する方法

Erlang でコードカバレッジでを取得する方法は大きく分けて 2 つある。どちらの場合も cover モジュールを利用している。

方法1 Common Test を使う

Erlang Common Test を利用してテストを書き、カバレッジをオプションを有効にしてテストを実行すれば良い。
以下のような coverspec ファイルを用意する。incl_mods のところにカバレッジをとりたいモジュールを指定。

{level, details}.
{incl_mods, [xxx_sup, xxx_app]}.


run_test スクリプトの引数に -cover [coverspecファイル] オプションをつけて実行すると、カバレッジ結果が html で出力される。

方法2 cover モジュールを直接使う

Common Test を使う方法は Common Test 経由でのテストでしか使えないので柔軟性に欠ける。例えばアプリケーションを立ち上げて外部ツールなどで負荷をかけ、その際のカバレッジを見たい場合などに困る。
このような場合 cover モジュールを直接使えば良い。やるべき事は以下の通り。

  • モジュールをカバレッジ用にコンパイルする cover:compile など
  • cover:start を呼ぶ
  • コードを動かす
  • cover:analyze 系の関数で結果を取得する
    • 結果をリストで取得したり、HTML に書いたりすることができる
  • cover:stop を呼ぶ

cover モジュールを使う方法のメリット

面白い事に cover:compile、cover:start などを動的に呼び出しても良い。つまり起動中の(分散)ノードのカバッレジを動的に ON/OFF できるのだ。
サーバー系のノードでこれができるのはとてもうれしい。

注意

cover:analyze の前に cover:stop を呼ぶと code:analyze の戻り値が {error,{not_cover_compiled,Module}}. となりはまるので注意。