You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Rust集成测试(Bats)中获取代码覆盖率数据?

获取Rust项目Bats集成测试的代码覆盖率

要解决kcov只统计Bats脚本而非Rust二进制覆盖率的问题,核心是让kcov直接追踪被测试的Rust程序,而非包裹整个Bats测试进程。以下是具体步骤:

  • 编译带调试信息的Rust二进制
    覆盖率工具需要调试符号关联执行代码到源代码,即使是release构建也要保留调试信息:

    • 临时编译:RUSTFLAGS="-g" cargo build --release
    • 永久配置(修改Cargo.toml):
      [profile.release]
      debug = true
      

    用file target/release/your_bin验证输出包含"debug_info"。

  • 修改Bats测试,让kcov包裹Rust二进制
    不要直接用kcov跑Bats脚本,而是在Bats用例里,用kcov包裹每个Rust二进制调用。比如把原来的:

    ./target/release/your_bin --test-arg
    

    改成:

    kcov --include-path=src/ --merge target/kcov ./target/release/your_bin --test-arg
    
    • --include-path=src/:只统计项目源代码的覆盖率,排除依赖和外部文件
    • --merge:让多个测试用例的覆盖率数据合并到同一个报告
    • target/kcov:指定覆盖率报告的输出目录
  • 批量改造Bats测试(可选)
    如果测试用例很多,可在Bats文件开头定义全局包装函数,避免逐个修改:

    setup() {
      run_kcov() {
        kcov --include-path=src/ --merge target/kcov "$@"
      }
    }
    

    之后测试里用run_kcov ./target/release/your_bin --test-arg替代直接调用二进制。

  • 合并单元测试与集成测试覆盖率
    Rust单元测试的覆盖率可通过cargo kcov生成(先装插件:cargo install cargo-kcov),执行时指定同一个输出目录即可自动合并:

    cargo kcov --output target/kcov --include-path=src/
    
  • 常见问题排查

    • 若仍只统计Bats脚本:检查Rust二进制是否带调试信息,或者kcov是否正确包裹了二进制而非Bats进程
    • 覆盖率报告包含无关代码:调整--include-path参数,精准指向项目源码目录
    • 报告缺失部分代码:确保所有测试用例都用kcov包裹了对应的二进制调用

内容的提问来源于stack exchange,提问作者jcorrenti13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:13:21