首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么kcov要为Rust程序计算不正确的代码覆盖率统计数据?

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

Stack Overflow用户
提问于 2015-09-11 10:57:39
回答 2查看 1.8K关注 0票数 13

我尝试使用科夫来获得锈蚀库的代码覆盖率。我跟踪本教程来构建和使用kcov。报道似乎有效,但我正面临着一个奇怪的高覆盖率。项目中的一些文件获得了100%的覆盖率,即使它们实际上根本没有覆盖!

这是一个复制问题的最小项目:

Cargo.toml

代码语言:javascript
复制
[package]
name = "mypackage"
version = "0.1.0"
authors = ["mbrt"]

src/lib.rs

代码语言:javascript
复制
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

代码语言:javascript
复制
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却看不到它们?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-11 12:00:11

您是正确的:目前完全没有使用的函数被剥离了,所以像kcov这样的覆盖工具只对使用过的函数中的分支覆盖很好(至少,这类工具的摘要功能)。对于测试/调试构建来说,在默认情况下不发生这种情况是有一些讨论的。

票数 6
EN

Stack Overflow用户

发布于 2016-07-14 10:23:21

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

代码语言:javascript
复制
RUSTFLAGS='-C link-dead-code' cargo test
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32521800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档