闽公网安备 35020302035485号
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 -总结