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

  1. 首先配置Cargo.toml启用覆盖率收集:
[profile.test]
coverage = true  # 启用测试覆盖率收集
  1. 创建示例Rust项目(假设项目名为coverage-demo):
cargo new coverage-demo
cd coverage-demo
  1. 添加测试代码到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函数,以展示覆盖率差异
}
  1. 运行测试并收集覆盖率数据:
# 设置环境变量
export RUSTFLAGS="-C instrument-coverage"  # 启用覆盖率检测
export LLVM_PROFILE_FILE="coverage-demo-%p-%m.profraw"  # 定义profraw文件名格式

# 运行测试
cargo test
  1. 生成HTML覆盖率报告:
# 生成HTML报告
coverage-prepare html target/debug/deps/coverage_demo-*.so
  1. 生成LCOV文件:
# 生成LCOV文件用于CI/CD
coverage-prepare lcov target/debug/deps/coverage_demo-*.so -o coverage.lcov
  1. 查看终端报告:
# 在终端查看覆盖率报告
coverage-prepare report target/debug/deps/coverage_demo-*.so
  1. 使用高级选项:
# 忽略测试文件并保留中间文件
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

注意事项

  1. 工具会默认忽略.cargo/registrylibrary/std目录的文件
  2. 默认情况下会删除处理后的.profraw文件和生成的.profdata文件
  3. 对于HTML输出,默认路径是htmlcov/rust
  4. 对于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

使用方法

基本使用

  1. 初始化项目
coverage-prepare init
  1. 运行测试收集覆盖率数据
coverage-prepare run
  1. 生成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);
}

生成报告步骤

  1. 初始化
cd my_project
coverage-prepare init
  1. 收集数据
coverage-prepare run
  1. 生成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函数未被测试覆盖。

注意事项

  1. 必须使用Rust nightly版本
  2. 首次运行可能需要较长时间编译依赖
  3. 大型项目可能需要增加内存设置
  4. 某些平台需要配置LLVM路径
回到顶部