我试着用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人报告说:

coverage summary

lib.rs人的保险范围是正确的:

coverage1

但是subm.rs的保险范围是错误的!请注意,该函数是公共函数,因此无法从库中进行优化:

coverage2

在这里,我们可以验证kcov是否有效,因为它能够计算一个文件的代码覆盖率,但无法看到第二个文件完全没有覆盖.

这里有什么问题?也许测试二进制文件删除了未使用的函数,而kcov看不到它们?

推荐答案

你是对的:目前完全未使用的函数被剥离,所以像kcov这样的覆盖工具只适用于已使用函数中的分支覆盖(至少是此类工具的摘要功能).对于测试/调试构建,有some discussion条关于默认情况下不发生这种情况的建议.

Rust相关问答推荐

有没有办法模仿对象安全克隆?

如何在 struct 的自定义序列化程序中使用serde序列化_WITH

一种随机局部搜索算法的基准(分数)

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

`Pin`有没有不涉及不安全代码的目的?

如何从ruust中的fig.toml中读取?

将一个泛型类型转换为另一个泛型类型

为什么Rust不支持带关联常量的特征对象?

为什么Option类型try块需要类型注释?

为什么RefCell没有与常规引用相同的作用域?

对reqwest提供的这种嵌套JSON struct 进行反序列化

处理带有panic 的 Err 时,匹配臂具有不兼容的类型

Rust,如何从 Rc> 复制内部值并返回它?

如何强制匹配的返回类型为()?

使用占位符获取用户输入

Rust: 目标成员属于哪个"目标家族"的列表是否存在?

如何从 rust 中的同一父目录导入文件

按下 Ctrl + C 时优雅地停止命令并退出进程

`map` 调用在这里有什么用吗?

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?