测量代码覆盖率#
我们为您提供了工具,用于测量测试和程序运行的代码覆盖率。目前的测量基于分支覆盖率。换句话说,它测量了每个程序分支是否被执行,以及如果执行了多少次。
在测试中运行代码覆盖率#
要在测试中启用覆盖率仪器,您需要将 --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
显示了所有源文件的列表,以及其中的覆盖率百分比:
单击每个文件会显示每个文件中的覆盖率详细信息。每个覆盖点(分支的开始)在源代码中由一个突出显示的字符表示:红色表示该点在所有运行中都没有被执行,绿色表示该点至少被执行一次。
每行也通过覆盖率信息进行突出显示,具有相同的颜色编码。此外,黄色行是那些具有部分覆盖率的行:该行中的某些点被执行,而其他点没有被执行。
有些行不会有任何突出显示。这并不意味着该行根本没有被执行,只是该行不是分支的开始。这样的行共享其前面最近被执行的行的覆盖率。
跳过覆盖检查#
添加 /// @coverage.skip
指示符会跳过函数内的所有覆盖操作。此外,所有已弃用的函数都不会被检查。