【问题标题】:Tarpaulin flagging line as not covered篷布标志线未覆盖
【发布时间】:2022-07-15 15:10:31
【问题描述】:

我实际上只是从 Rust 开始,所以我确信这是一个幼稚的问题,但它让我很困惑。

在下面的(简化)示例中,测试通过就好了,但Tarpaulin 标记了.values 行(在let data = self.iter() 之间),并且只有这一行未被发现。我不明白为什么会这样,任何解释都会被感激地接受。由于太新,我倾向于假设我没有正确测试。

谢谢

use std::ops::Add;

struct Series<T> {
    // Other Stuff
    values: Vec<T>,
}

impl<T> Series<T> {
    pub fn new(values: Vec<T>) -> Series<T> {
        Series { values }
    }
}

impl<T> Add<&Series<T>> for &Series<T>
where
    T: Add + Add<Output = T> + Copy,
{
    type Output = Series<T>;

    fn add(self, rhs: &Series<T>) -> Series<T> {
        let data = self
            .values
            .iter()
            .zip(rhs.values.iter())
            .map(|(&a, &b)| a + b)
            .collect();
        Series::new(data)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn add() {
        let s1 = Series::new(vec![1, 2, 3]);
        let s2 = Series::new(vec![4, 5, 6]);
        let s3 = &s1 + &s2;
        assert_eq!(s3.values, vec![5, 7, 9]);
    }
}

【问题讨论】:

  • "目前,防水油布提供了工作线覆盖范围,虽然相当可靠,但结果可能仍包含轻微的不准确之处。"
  • 谢谢。我想我会把它作为一个问题记录在他们的 GitHub 项目上。我只是想确保我没有先做一些愚蠢的事情!

标签: rust code-coverage


【解决方案1】:

这里不提供问题的解决方案,而是试图对现象给出解释

对于要覆盖的任何行的代码,编译器必须为其生成一条 CPU 指令。在这种情况下,编译器没有生成任何额外的指令来从对象变量中获取向量。

要观察这种现象,可以调高优化级别,看看同一代码覆盖的行数是多少。使用opt-level=2,第 9、20-22 和 24 行不会为 CPU 生成任何汇编指令,因此在运行测试时这些行永远不会被覆盖。将opt-level 转回 0 将显示与问题中相同的结果。

开启优化会减少覆盖率

$ cargo tarpaulin --rustflags="-C opt-level=2"
Jul 15 14:59:54.985  INFO cargo_tarpaulin::config: Creating config
Jul 15 14:59:54.990  INFO cargo_tarpaulin: Running Tarpaulin
Jul 15 14:59:54.990  INFO cargo_tarpaulin: Building project
Jul 15 14:59:54.990  INFO cargo_tarpaulin::cargo: Cleaning project
   Compiling tarptest v0.1.0 (tarptest)
    Finished test [unoptimized + debuginfo] target(s) in 0.31s
Jul 15 14:59:55.338  INFO cargo_tarpaulin::process_handling::linux: Launching test
Jul 15 14:59:55.338  INFO cargo_tarpaulin::process_handling: running tarptest/target/debug/deps/tarptest-93760ef629d9d9ee

running 1 test
test tests::add ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

Jul 15 14:59:55.482  INFO cargo_tarpaulin::report: Coverage Results:
|| Uncovered Lines:
|| src/main.rs: 9, 20-22, 24
|| Tested/Total Lines:
|| src/main.rs: 6/11 -20.45%
|| 
54.55% coverage, 6/11 lines covered, -20.45454545454546% change in coverage

而 opt-level 0 只有一行没有被覆盖

$ cargo tarpaulin --rustflags="-C opt-level=0"
Jul 15 15:00:06.137  INFO cargo_tarpaulin::config: Creating config
Jul 15 15:00:06.142  INFO cargo_tarpaulin: Running Tarpaulin
Jul 15 15:00:06.143  INFO cargo_tarpaulin: Building project
Jul 15 15:00:06.143  INFO cargo_tarpaulin::cargo: Cleaning project
   Compiling tarptest v0.1.0 (tarptest)
    Finished test [unoptimized + debuginfo] target(s) in 0.25s
Jul 15 15:00:06.442  INFO cargo_tarpaulin::process_handling::linux: Launching test
Jul 15 15:00:06.442  INFO cargo_tarpaulin::process_handling: running tarptest/target/debug/deps/tarptest-93760ef629d9d9ee

running 1 test
test tests::add ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s

Jul 15 15:00:06.566  INFO cargo_tarpaulin::report: Coverage Results:
|| Uncovered Lines:
|| src/main.rs: 22
|| Tested/Total Lines:
|| src/main.rs: 11/12 +37.12%
|| 
91.67% coverage, 11/12 lines covered, +37.12121212121212% change in coverage

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2012-07-29
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多