Kai's personal website build with astro.

Rust 项目单测覆盖率


共有 2 种比较方便的方式

tarpaulin

介绍一下tarpaulin

安装:cargo install cargo-tarpaulin

支持的功能比较多,文档很全不再赘述。等后面使用一段时间再补充一些常用的场景和踩坑记录

运行测试并得到覆盖率:cargo tarpaulin --out Html

这是我尝试之后相对满意的一个解决方案。执行之后会在项目跟目录生成一个单独的 tarpaulin-report.html文件,在浏览器中打开即可看到覆盖详情,唯一的缺点是没有行号,怀疑是我 自己没有配置好,毕竟显示行号这个功能比较简单

image

cargo-llvm-cov

cargo-llvm-cov是一个使用source-based code coverage的工具: llvm-cov

安装:cargo +stable install cargo-llvm-cov --locked

使用:cargo llvm-cov --open,生成html格式覆盖率报告,位于target/llvm-cov/html

首次运行会安装依赖:rustup component add llvm-tools-preview --toolchain stable-x86_64-apple-darwin

结论:极大地提升了使用LLVM source-based code coverage的效率,与tarpaulin相比, 覆盖率报告是按文件分布的,报告中有行号显示,但是页面展示效果不够明显

image

Rust 的覆盖率统计方案

如果直接 google rust code coverage,最先获取的信息应该是 The rustc book, 其中提到的rustc包括两种代码覆盖率实现:

但因为是编译器层面的支持,直接使用起来有点麻烦

然后基于 google 的搜索结果,我们进入Redditr/rust论坛,还可以找到上面用到的,基于已有的覆盖文件统计覆盖率的工具:grcov

CARGO_INCREMENTAL=0 RUSTFLAGS='-Cinstrument-coverage' LLVM_PROFILE_FILE='cargo-test-%p-%m.profraw' cargo test
grcov . --binary-path ./target/debug/deps/ -s . -t html --branch --ignore-not-existing --ignore '../*' --ignore "/*" -o target/coverage/html
grcov . --binary-path ./target/debug/deps/ -s . -t lcov --branch --ignore-not-existing --ignore '../*' --ignore "/*" -o target/coverage/tests.lcov

其他

一篇博客介绍如何使用rust统计代码覆盖率