Покрытие ржавчины с использованием kcov не выглядит правильным
Когда я записываю покрытие кода моего проекта Rust с использованием codecov.io, покрытие отображается некорректно.
Это очень странно
Я не могу предоставить полный проект для воспроизведения.
Я использую стандартную конфигурацию TravisCI для Rust. Вот мой.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 ответов
Предполагая, что поведение Карго и Трэвиса существенно не изменилось с момента опубликования этого вопроса, здесь есть пара моментов.
- Всякий раз, когда изменяется конфигурация сборки, меняется отпечаток вашей сборки, что приводит к полной или частичной перестройке и новому имени файла для полученного двоичного файла в
target
, По общему признанию, я не знаю тонкостей того, когда и почему это происходит, я просто знаю, что это происходит. Фактически, для проекта, над которым я работаю, Cargo кажется настолько запутанным в отношении одной из зависимостей, что он вызывает перестройку почти каждый раз. - Travis'
cache: cargo
по умолчанию довольно тупой; он кэширует все$CARGO_HOME
а такжеtarget
без исключений. Обратите внимание, что это в сочетании с первым также означает, что эти кэши растут без ограничений, поэтому вам нужно время от времени выбрасывать их или использовать более разумную схему кэширования. for file in target/debug/myproject-*[^\.d]
запускает kcov для всех сборокmyproject
независимо от того, был ли он только что собран или из кеша сборки Travis. Старые сборки могут, конечно, иметь разные номера строк, так как они были построены из разных (более старых) источников, и охват может быть разным.- range.io объединяет результаты покрытия, выделяя красную строку, если она включена в какой-либо отчет, если только он не охватывается каким-либо (другим) отчетом. Он не показывает никаких признаков того, что номера строк в разных отчетах не совпадают или даже если один из отчетов содержит номера строк, превышающие EOF. На самом деле, насколько я мог найти, он даже не показывает, какие двоичные файлы покрывали / не покрывали номер строки, даже если он имеет эту информацию. Вы должны скачать отчеты XML и интерпретировать их вручную, чтобы увидеть это.
Следовательно, эти непокрытые строки могут (не все?) Происходить из-за того, как Rust компилирует свои двоичные файлы, как подсказывают комментарии к вопросу, но на самом деле могут полностью ссылаться на другой (более старый) исходный файл. Это стало довольно очевидным в нашем проекте через некоторое время...
Если это не так очевидно, самый простой способ убедиться в том, что это происходит, - просто выбросить кэш сборок Travis и вызвать перестроение.
Поскольку инкрементные сборки на самом деле не работают для нашего проекта, решение, которое мы использовали, заключалось в том, чтобы Travis не кэшировал целевой каталог, как предлагается здесь. В зависимости от того, насколько ваше время сборки CI зависит от инкрементных сборок, вы можете быть вынуждены сделать что-то более умное.