当我使用codecov.io记录Rust项目的代码覆盖率时,覆盖率显示不正确。
这很奇怪。
我无法提供用于复制的完整项目。
我正在为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"
答案 0 :(得分:0)
假设自发布此问题以来,Cargo和Travis的行为没有明显改变,那么这里有两件事在起作用。
target
中生成的二进制文件的新文件名。诚然,我不知道确切何时或为什么发生这种情况的复杂性,我只知道它发生了。实际上,对于我正在从事的项目,Cargo似乎对其中一个依赖项感到困惑,以至于几乎每次都强制进行重建。cache: cargo
的默认值很愚蠢;它会毫无例外地缓存所有$CARGO_HOME
和target
。请注意,将其与前者结合使用还意味着这些缓存将无限制地增长,因此您需要不时丢弃它们或使用更智能的缓存方案。for file in target/debug/myproject-*[^\.d]
对myproject
的所有构建都运行kcov,无论它是新建的还是来自Travis的构建缓存。当然,较早的版本可能具有不同的行号,因为它们是从不同的(较早的)来源构建的,并且覆盖范围也可能不同。因此,那些未发现的行可能不是(全部?)是由于Rust对该问题的注释所暗示的,其编译二进制文件的方式,但实际上可能完全是指一个不同的(旧)源文件。一段时间后,这在我们的项目中变得很明显...
如果不是很明显,验证这是最简单的方法就是丢弃Travis的构建缓存并强制进行重建。
由于无论如何增量构建对于我们的项目都无法正常工作,因此我们使用的解决方案是不让Travis缓存目标目录,如建议here所示。根据您的CI构建时间取决于增量构建的时间,您可能被迫做一些更聪明的事情。