Rust代码覆盖率工具coverage-prepare的使用:快速生成和分析Rust项目的测试覆盖率报告
Rust代码覆盖率工具coverage-prepare的使用:快速生成和分析Rust项目的测试覆盖率报告
工具介绍
Coverage Prepare是一个将覆盖率数据转换为HTML报告、LCOV文件或终端表格的工具。
工具功能:
- 将"profraw"覆盖率数据转换为:
- HTML报告
- 终端表格报告
- LCOV文件(用于上传到codecov等平台)
安装方法
cargo install coverage-prepare
运行上述命令将全局安装coverage-prepare
二进制文件。
使用示例
以下是coverage-prepare --help
的输出:
Convert "profraw" coverage data to:
* HTML reports
* terminal table reports
* LCOV files (for upload to codecov etc.)
USAGE:
coverage-prepare [OPTIONS] <OUTPUT_FORMAT> [BINARIES]...
ARGS:
<OUTPUT_FORMAT>
output format
[possible values: html, report, lcov]
<BINARIES>...
binary files to build coverage from
OPTIONS:
-h, --help
Print help information
--ignore-filename-regex <IGNORE_FILENAME_REGEX>
maps to the `--ignore-filename-regex` argument to `llvm-cov`, `\.cargo/registry` &
`library/std` are always ignored, repeat to ignore multiple filenames
--no-delete
whether to not delete the processed `.profraw` files and the generated `.profdata` file
after generating the coverage reports, by default these files are deleted
-o, --output-path <OUTPUT_PATH>
Output path, defaults to `rust_coverage.lcov` for lcov output, and `htmlcov/rust` for
html output
-V, --version
Print version information
完整示例demo
- 首先配置Cargo.toml启用覆盖率收集:
[profile.test]
coverage = true # 启用测试覆盖率收集
- 创建示例Rust项目(假设项目名为
coverage-demo
):
cargo new coverage-demo
cd coverage-demo
- 添加测试代码到
src/lib.rs
:
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
pub fn sub(a: i32, b: i32) -> i32 {
a - b
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add() {
assert_eq!(add(2, 3), 5);
}
// 故意不测试sub函数,以展示覆盖率差异
}
- 运行测试并收集覆盖率数据:
# 设置环境变量
export RUSTFLAGS="-C instrument-coverage" # 启用覆盖率检测
export LLVM_PROFILE_FILE="coverage-demo-%p-%m.profraw" # 定义profraw文件名格式
# 运行测试
cargo test
- 生成HTML覆盖率报告:
# 生成HTML报告
coverage-prepare html target/debug/deps/coverage_demo-*.so
- 生成LCOV文件:
# 生成LCOV文件用于CI/CD
coverage-prepare lcov target/debug/deps/coverage_demo-*.so -o coverage.lcov
- 查看终端报告:
# 在终端查看覆盖率报告
coverage-prepare report target/debug/deps/coverage_demo-*.so
- 使用高级选项:
# 忽略测试文件并保留中间文件
coverage-prepare html \
--ignore-filename-regex ".*test.*" \
--no-delete \
target/debug/deps/coverage_demo-*.so
# 自定义输出路径
coverage-prepare html -o ./custom_coverage_report target/debug/deps/coverage_demo-*.so
注意事项
- 工具会默认忽略
.cargo/registry
和library/std
目录的文件 - 默认情况下会删除处理后的
.profraw
文件和生成的.profdata
文件 - 对于HTML输出,默认路径是
htmlcov/rust
- 对于LCOV输出,默认路径是
rust_coverage.lcov
通过以上完整示例,你可以快速生成和分析Rust项目的测试覆盖率报告,帮助提高代码质量。
1 回复
Rust代码覆盖率工具coverage-prepare的使用指南
工具介绍
coverage-prepare是一个用于Rust项目的代码覆盖率工具,能够帮助开发者快速生成和分析测试覆盖率报告。该工具基于Rust的内置测试框架和LLVM的覆盖率工具构建,提供了一种简单的方式来衡量代码测试的完整性。
安装方法
系统依赖
- Rust工具链(nightly版本)
- LLVM(通常随Rust安装)
- grcov(覆盖率报告生成工具)
安装步骤
# 安装grcov
cargo install grcov
# 安装coverage-prepare
cargo install coverage-prepare
使用方法
基本使用
- 初始化项目
coverage-prepare init
- 运行测试收集覆盖率数据
coverage-prepare run
- 生成HTML报告
coverage-prepare report --html
高级选项
# 指定模块收集覆盖率
coverage-prepare run --modules module1,module2
# 生成LCOV格式报告
coverage-prepare report --lcov
# 设置覆盖率阈值
coverage-prepare check --threshold 80
示例项目
项目结构
my_project/
├── src/
│ ├── lib.rs
│ └── utils.rs
├── tests/
│ └── integration_test.rs
└── Cargo.toml
示例代码
src/utils.rs
:
// 加法函数
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
// 减法函数(未测试)
pub fn subtract(a: i32, b: i32) -> i32 {
a - b
}
tests/integration_test.rs
:
use my_project::utils;
#[test]
fn test_add() {
assert_eq!(utils::add(2, 2), 4);
}
生成报告步骤
- 初始化
cd my_project
coverage-prepare init
- 收集数据
coverage-prepare run
- 生成HTML报告
coverage-prepare report --html
报告示例
文件 行覆盖率 函数覆盖率 分支覆盖率
utils.rs 50% 50% -
lib.rs 100% 100% -
配置选项
.coverage/config.toml
配置示例:
[report]
html = true # 生成HTML报告
lcov = false # 不生成LCOV报告
[threshold]
line = 80 # 行覆盖率阈值80%
function = 70 # 函数覆盖率阈值70%
[exclude]
files = ["src/generated/*"] # 排除文件
CI集成示例
.github/workflows/coverage.yml
:
name: Coverage
on: [push, pull_request]
jobs:
coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
toolchain: nightly
profile: minimal
components: llvm-tools-preview
- run: cargo install grcov coverage-prepare
- run: coverage-prepare run
- run: coverage-prepare check --threshold 80
完整示例demo
1. 创建新项目
cargo new coverage-demo
cd coverage-demo
2. 添加示例代码
src/lib.rs
:
pub fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
pub fn farewell(name: &str) -> String {
format!("Goodbye, {}!", name)
}
tests/lib_test.rs
:
use coverage_demo::greet;
#[test]
fn test_greet() {
assert_eq!(greet("world"), "Hello, world!");
}
3. 安装工具
cargo install grcov coverage-prepare
4. 初始化覆盖率
coverage-prepare init
5. 运行测试收集数据
coverage-prepare run
6. 生成报告
coverage-prepare report --html
7. 查看报告
打开coverage/index.html
可以看到:
文件 行覆盖率 函数覆盖率
lib.rs 50% 50%
表示farewell函数未被测试覆盖。
注意事项
- 必须使用Rust nightly版本
- 首次运行可能需要较长时间编译依赖
- 大型项目可能需要增加内存设置
- 某些平台需要配置LLVM路径