コードカバレッジの計測#

テスト実行およびプログラム実行のコードカバレッジを計測するためのツールを用意しています。現在の計測は分岐カバレッジに基づいています。つまり、各プログラム分岐が実行されたかどうか、実行された場合は何回実行されたかを計測します。

テストでコードカバレッジを実行する#

テストでカバレッジ計測を有効にするには、moon test--enable-coverage 引数を渡す必要があります。

$ moon test --enable-coverage
...
Total tests: 3077, passed: 3077, failed: 0.

以前にカバレッジ有効でコンパイルされていない場合、この操作でプロジェクトは再コンパイルされます。実行手順は同じように見えますが、target ディレクトリの下に新しいカバレッジ結果ファイルが生成されます。

$ ls _build/wasm-gc/debug/test/ -w1
array
...
moonbit_coverage_1735628238436873.txt
moonbit_coverage_1735628238436883.txt
...
moonbit_coverage_1735628238514678.txt
option/
...

これらのファイルには、プログラムのどの部分が実行され、どの部分が実行されなかったかをツールチェーンが判定するための情報が含まれます。

カバレッジ結果の可視化#

カバレッジ計測結果を可視化するには、moon coverage report サブコマンドを使う必要があります。

このサブコマンドは -f フラグで指定して、カバレッジを複数の形式でエクスポートできます:

  • テキスト要約:summary

  • OCaml Bisect 形式:bisect(デフォルト)

  • Coveralls JSON 形式:coveralls

  • Cobertura XML 形式:cobertura

  • HTML ページ:html

テキスト要約#

moon coverage report -f summary はカバレッジデータを stdout に出力し、各ファイルのカバー済みポイント数と総カバレッジポイント数を表示します。

$ moon coverage report -f summary
array/array.mbt: 21/22
array/array_nonjs.mbt: 3/3
array/blit.mbt: 3/3
array/deprecated.mbt: 0/0
array/fixedarray.mbt: 115/115
array/fixedarray_sort.mbt: 110/116
array/fixedarray_sort_by.mbt: 58/61
array/slice.mbt: 6/6
array/sort.mbt: 70/70
array/sort_by.mbt: 56/61
...

OCaml Bisect 形式#

-f を指定しない場合、これがデフォルトの出力形式です。

moon coverage report -f bisect はカバレッジデータを bisect.coverage ファイルに出力します。このファイルは [OCaml Bisect][bisect] ツールで読み取れます。

Coveralls JSON 形式#

moon coverage report -f coveralls は、カバレッジデータを Coveralls の JSON 形式で出力します。この形式は行単位で、Coveralls と CodeCov の両方で読み取れます。仕様は こちら を参照してください。

$ moon coverage report -f coveralls
$ cat coveralls.json
{
    "source_files": [
        {
            "name": "builtin/console.mbt",
            "source_digest": "1c24532e12ac5bdf34b7618c9f38bd82",
            "coverage": [null,null,...,null,null]
        },
        {
            "name": "immut/array/array.mbt",
            "source_digest": "bcf1fb1d2f143ebf4423565d5a57e84f",
            "coverage": [null,null,null,...

--send-to 引数を使うと、このカバレッジレポートを Coveralls または CodeCov に直接送信できます。以下は GitHub Actions での利用例です:

moon coverage report \
    -f coveralls \
    -o codecov_report.json \
    --service-name github \
    --service-job-id "$GITHUB_RUN_NUMBER" \
    --service-pull-request "${{ github.event.number }}" \
    --send-to coveralls

env:
    COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}

詳細は moon coverage report --help を参照してください。

Cobertura XML 形式#

moon coverage report -f cobertura は、Cobertura で読み取れる形式でカバレッジデータを出力します。

HTML#

moon coverage report -f html は、カバレッジデータを人間が読みやすい一連の HTML ファイルとして出力します。デフォルトの出力先は _coverage という名前のフォルダです。

フォルダ内の index.html には、すべてのソースファイル一覧と、それぞれのカバレッジ率が表示されます:

HTML のインデックス

各ファイルをクリックすると、そのファイル内のカバレッジ詳細が表示されます。各カバレッジポイント(分岐の開始点)は、ソースコード内でハイライトされた文字として表現されます。赤はすべての実行で未カバー、緑は少なくとも 1 回以上カバーされたことを意味します。

各行も同じ色分けでカバレッジ情報によりハイライトされます。さらに黄色の行は部分的にカバーされた行で、その行の一部のポイントはカバーされ、他は未カバーです。

一部の行はハイライトされません。これはその行がまったく実行されていないことを意味するのではなく、単にその行が分岐の開始点ではないということです。そのような行は、直前の最も近いカバー済み行のカバレッジを共有します。

詳細なカバレッジデータ

カバレッジ計測のスキップ#

アトリビュート #coverage.skip を追加すると、その関数内のすべてのカバレッジ計測処理がスキップされます。さらに、非推奨の関数はすべてカバレッジ対象外になります。