测量代码覆盖率#

我们为您提供了工具,用于测量测试和程序运行的代码覆盖率。目前的测量基于分支覆盖率。换句话说,它测量了每个程序分支是否被执行,以及如果执行了多少次。

在测试中运行代码覆盖率#

要在测试中启用覆盖率仪器,您需要将 --enable-coverage 参数传递给 moon test

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

如果之前没有使用覆盖率启用编译项目,这将重新编译项目。执行过程看起来是一样的,但是新的覆盖率结果文件将在 target 目录下生成。

$ ls target/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

  • Coberura 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 的索引

单击每个文件会显示每个文件中的覆盖率详细信息。每个覆盖点(分支的开始)在源代码中由一个突出显示的字符表示:红色表示该点在所有运行中都没有被执行,绿色表示该点至少被执行一次。

每行也通过覆盖率信息进行突出显示,具有相同的颜色编码。此外,黄色行是那些具有部分覆盖率的行:该行中的某些点被执行,而其他点没有被执行。

有些行不会有任何突出显示。这并不意味着该行根本没有被执行,只是该行不是分支的开始。这样的行共享其前面最近被执行的行的覆盖率。

详细覆盖率数据

跳过覆盖检查#

添加 /// @coverage.skip 指示符会跳过函数内的所有覆盖操作。此外,所有已弃用的函数都不会被检查。