我试着用kcov来覆盖一个Rust 的库.我遵循this tutorial来构建和使用kcov.报道似乎很有效,但我面临着一个奇怪的高报道.项目中的一些文件得到了kcov%的覆盖率,即使它们实际上根本没有被覆盖!
这是一个再现问题的最小项目:
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() {
}
}
有两个相同的函数,一个在 crate 的根中,另一个在子模块中.唯一的区别是,第一个测试刺激一个功能,而另一个完全不起作用.在这种情况下,我希望保险范围不超过50%.
然而,kcov
人报告说:
lib.rs
人的保险范围是正确的:
但是subm.rs
的保险范围是错误的!请注意,该函数是公共函数,因此无法从库中进行优化:
在这里,我们可以验证kcov
是否有效,因为它能够计算一个文件的代码覆盖率,但无法看到第二个文件完全没有覆盖.
这里有什么问题?也许测试二进制文件删除了未使用的函数,而kcov看不到它们?