我尝试使用kcov来获取Rust库的代码覆盖率。我跟着this tutorial建立并使用了kcov。报道似乎有效,但我面临着一个奇怪的高覆盖率。项目中的一些文件获得100%的覆盖率,即使它们实际上根本没有被覆盖!
这是一个重现问题的最小项目:
Cargo.toml
[package]
name = "mypackage"
version = "0.1.0"
authors = ["mbrt"]
的src / lib.rs
pub mod subm;
pub fn coverage1(i : bool) -> bool {
if i {
true
}
else {
false
}
}
#[cfg(test)]
mod test {
use super::coverage1;
#[test]
fn test_coverage1() {
assert!(coverage1(true));
}
}
的src / subm.rs
pub fn coverage2(i : bool) -> bool {
if i {
true
}
else {
false
}
}
#[cfg(test)]
mod test {
#[test]
fn test_coverage2() {
}
}
有两个相同的功能,一个在箱子的根部,另一个在子模块中。唯一的区别是第一次测试刺激了一个功能,而另一个没有做任何事情。在这种情况下,我预计覆盖率不会超过50%。
但是kcov
报告了这一点:
lib.rs
的覆盖范围是正确的:
但subm.rs
的覆盖范围错误!请注意,该函数是公共的,因此无法从库中进行优化:
我们可以在此验证kcov
是否有效,因为它能够计算一个文件的代码覆盖率,但却无法看到第二个文件根本没有被覆盖。
这是什么问题?也许测试二进制文件删除未使用的函数,而kcov看不到它们?
答案 0 :(得分:12)
有一种解决方法:RUSTFLAGS='-C link-dead-code'
环境变量。在构建时使用它,Rust编译器也会链接死代码:
RUSTFLAGS='-C link-dead-code' cargo test
答案 1 :(得分:5)
您是正确的:此时完全未使用的功能被剥离,因此像kcov这样的覆盖工具仅适用于已使用功能中的分支覆盖(至少是此类工具的摘要功能)。对于测试/调试版本,默认情况下不会发生some discussion。