rust - 为什么 kcov 计算 Rust 程序的代码覆盖统计数据不正确?

标签 rust code-coverage kcov

我试过使用 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() {
    }
}

有两个相同的函数,一个在 crate 的根目录中,另一个在子模块中。唯一的区别是第一个测试刺激了一个功能,而另一个则什么都不做。在这种情况下,我预计覆盖率不会超过 50%。

但是 kcov 报告了这一点:

coverage summary

lib.rs 的覆盖率是正确的:

coverage1

但是 subm.rs 的覆盖范围是错误的!请注意,该函数是公共(public)的,因此无法从库中优化出来:

coverage2

在这里我们可以验证 kcov 是否正常工作,因为它能够计算一个文件的代码覆盖率,但无法看到第二个文件根本没有被覆盖。

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

最佳答案

有一个解决方法:RUSTFLAGS='-C link-dead-code' 环境变量。在构建时使用它,Rust 编译器也会链接死代码:

RUSTFLAGS='-C link-dead-code' cargo test

关于rust - 为什么 kcov 计算 Rust 程序的代码覆盖统计数据不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32521800/

相关文章:

.net - 64位系统上的NCover

java - lambda 函数的代码覆盖率

.net - 人员(手动)测试的代码覆盖率?

bash - 使用 kcov/shunit2 测量已执行 shell 脚本的代码覆盖率

cmake - Rust on Windows CMake 问题

rust - 变量所有权在迭代之间如何工作?

rust - rustdoc 是否生成可运行的二进制文件?

rust - 特征的静态工厂方法

rust - vector.into_iter().filter(some_non_trivial_function).collect() 是否可接受