使用kcov的锈覆盖率显示不正确

时间:2018-08-29 06:15:57

标签: rust codecov kcov

当我使用codecov.io记录Rust项目的代码覆盖率时,覆盖率显示不正确。

  1. unwrap()功能和尾括号未覆盖

    unwrap and end bracket not covered

  2. 函数声明未涵盖

    function declaration not covered

这很奇怪。


我无法提供用于复制的完整项目。

我正在为Rust使用标准TravisCI配置。这是我的.travis.yml:

language: rust
cache: cargo
dist: trusty
sudo: required

rust:
  - stable
  - beta
  - nightly

matrix:
  allow_failures:
    - rust: nightly

script:
  - cargo build --verbose --all
  - cargo test --verbose --all

after_success: |
  wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz &&
  tar xzf master.tar.gz &&
  cd kcov-master &&
  mkdir build &&
  cd build &&
  cmake .. &&
  make &&
  make install DESTDIR=../../kcov-build &&
  cd ../.. &&
  rm -rf kcov-master &&
  for file in target/debug/myproject-*[^\.d]; do mkdir -p "target/cov/$(basename $file)"; ./kcov-build/usr/local/bin/kcov --exclude-pattern=/.cargo,/usr/lib --verify "target/cov/$(basename $file)" "$file"; done &&
  bash <(curl -s https://codecov.io/bash)
  echo "Uploaded code coverage"

1 个答案:

答案 0 :(得分:0)

假设自发布此问题以来,Cargo和Travis的行为没有明显改变,那么这里有两件事在起作用。

  • 只要构建配置发生更改,构建的指纹就会更改,从而导致全部或部分重建以及target中生成的二进制文件的新文件名。诚然,我不知道确切何时或为什么发生这种情况的复杂性,我只知道它发生了。实际上,对于我正在从事的项目,Cargo似乎对其中一个依赖项感到困惑,以至于几乎每次都强制进行重建。
  • 特拉维斯(Travis)的cache: cargo的默认值很愚蠢;它会毫无例外地缓存所有$CARGO_HOMEtarget。请注意,将其与前者结合使用还意味着这些缓存将无限制地增长,因此您需要不时丢弃它们或使用更智能的缓存方案。
  • for file in target/debug/myproject-*[^\.d]myproject的所有构建都运行kcov,无论它是新建的还是来自Travis的构建缓存。当然,较早的版本可能具有不同的行号,因为它们是从不同的(较早的)来源构建的,并且覆盖范围也可能不同。
  • 如果 any 报告中包含
  • coverage.io,它将覆盖范围的结果显示为红色,除非 any (其他)报告包含该行。如果来自不同报告的行号不匹配,或者其中一个报告包含EOF以外的行号,则不会显示任何指示。实际上,据我所知,即使具有此信息,它甚至都不会显示覆盖/未覆盖的二进制文件中的行号。您必须下载XML报告并手动对其进行解释才能看到。

因此,那些未发现的行可能不是(全部?)是由于Rust对该问题的注释所暗示的,其编译二进制文件的方式,但实际上可能完全是指一个不同的(旧)源文件。一段时间后,这在我们的项目中变得很明显...

borked coverage results

如果不是很明显,验证这是最简单的方法就是丢弃Travis的构建缓存并强制进行重建。

由于无论如何增量构建对于我们的项目都无法正常工作,因此我们使用的解决方案是不让Travis缓存目标目录,如建议here所示。根据您的CI构建时间取决于增量构建的时间,您可能被迫做一些更聪明的事情。