pub fn is_even(n: u32) -> bool { if n % 2 == 0 { true } else { false } }测试代码如下:
#[test] pub fn test_even() { assert_eq!(is_even(2), true); }为了启用代码覆盖,我们在用Rust编译器编译程序时使用-C instrument-coverage标志。如果我们使用Cargo来构建程序,我们可以通过设置RUSTFLAGS环境变量启用这个标志,如下所示。
RUSTFLAGS="-Cinstrument-coverage" cargo test这将产生所谓的“仪表化”二进制/可执行文件,其中注入了额外的代码来计算行、区域和分支。实际上发生的事情是编译器注入如下所示的计数器增量来跟踪计数:
pub fn is_even(n: u32) -> bool { is_even_counter += 1; if n % 2 == 0 { is_even_true_branch_counter += 1; true } else { is_even_false_branch_counter += 1; false } }因此,每当输入特定的功能/区域或分支时,相关的计数器就会增加。所有这些计数器都存储在程序内存中的特定位置。除此之外,一个额外的运行时也被注入到二进制文件中,它在程序的整个生命周期中初始化和管理这些计数器(称为LLVM分析器运行时)。
pub fn main() { __initialize_counters(); test_even(); //Other tests…. __write_counter_data_to_file(); }当程序退出时,来自这些计数器的原始数据被写入“profraw”文件,该文件可用于创建覆盖率报告。
# 安装 cargo-tarpaulin cargo install cargo-tarpaulin # 运行 cargo-tarpaulin 收集覆盖率数据 cargo tarpaulin结果如下:
INFO cargo_tarpaulin::statemachine::instrumented: For binary: target/debug/deps/code_covrage-4e2873bf50ec5596 INFO cargo_tarpaulin::statemachine::instrumented: Generated: target/tarpaulin/profraws/code_covrage-4e2873bf50ec5596_16540310165768346208_0-50218.profraw INFO cargo_tarpaulin::statemachine::instrumented: Merging coverage reports INFO cargo_tarpaulin::statemachine::instrumented: Mapping coverage data to source INFO cargo_tarpaulin::report: Coverage Results: || Uncovered Lines: || src/main.rs: 5, 9 || Tested/Total Lines: || src/main.rs: 3/5 || 60.00% coverage, 3/5 lines covered在这个例子中,cargo-tarpaulin将在控制台中自动生成报告,对于更详细的报告,cargo-tarpaulin支持多种输出格式,如Json、Xml和Html。
# 安装 grcov cargo install grcov # 运行测试 RUSTFLAGS="-Cinstrument-coverage" cargo test # 生成覆盖率报告 grcov . -s . --binary-path ./target/debug/ -t html --ignore tests/ -o ./target/debug/coverage/ # 在浏览器中打开HTML文件查看报告 open target/debug/coverage/index.html下图显示了一个示例覆盖率报告。我们可以找到项目中每个Rust模块的覆盖信息,如行覆盖、函数覆盖和分支覆盖。
# 安装 cargo-llvm-cov cargo install cargo-llvm-cov # 运行有覆盖率的测试 cargo llvm-cov这将在控制台中生成详细的覆盖率报告,结果如下:
Filename Regions Missed Regions Cover Functions Missed Functions Executed Lines Missed Lines Cover Branches Missed Branches Cover ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ../code-covrage/src/main.rs 8 2 75.00% 4 1 75.00% 10 2 80.00% 0 0 - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ TOTAL 8 2 75.00% 4 1 75.00% 10 2 80.00% 0 0 -总结