Как я могу получить страховое покрытие для проверки груза?
Когда я хочу протестировать покрытие C++, я могу построить свою программу с помощью
-fprofile-arcs -ftest-coverage
, запустите все тесты и запустите
gcov
получить покрытия.
Однако когда дело доходит до Rust, я совершенно заблудился. Что я хочу сделать, так это запустить следующие тесты (на моем Mac) и получить покрытие всех кодов Rust в пути
components/raftstore
cargo test --package tests --test failpoints cases::test_normal
cargo test --package tests --test failpoints cases::test_bootstrap
cargo test --package tests --test failpoints cases::test_compact_log
В этом сообщении говорится, что сначала запустите
cargo test --no-run
, затем беги. Однако, когда я на самом деле это делаю, kcov блокируется навсегда.
Затем я нахожу что-то под названием
cargo kcov
, который предоставляет
--test
. Однако когда я бегу
cargo kcov --test failpoints cases::test_normal
нравится то, что я делаю в
cargo test
, Я получаю ошибку
error: cargo subcommand failure
note: cargo test exited with code exit status: 101
error: no test target named `failpoints`
Я пробовал много способов выяснить это, однако ни один из них не работает, поэтому мне интересно, могу ли я получить здесь некоторую помощь.
Я знаю, что есть и другие инструменты покрытия, например
tarpaulin
а также
grcov
, Я сейчас пробую их. Также приемлемо, если есть изящные решения с этими инструментами покрытия. Однако я все еще хочу знать, что не так с
kcov
а также
cargo-kcov
.
4 ответа
Мне нравится использовать брезент с выводом HTML.
cargo tarpaulin --out Html
Это должно создать выходной файл с именемtarpaulin-report.html
. Откройте этот файл в браузере, чтобы просмотреть отчет о покрытии кода.
Согласно , теперь можно получить покрытие кода на основе инструментов.
Следующая команда генерирует результаты покрытия. Обратите внимание, что для этого требуется среда выполнения профилировщика Rust, которая по умолчанию включена вnightly
.
RUSTFLAGS="-C instrument-coverage" \
cargo test --tests
Эти результаты могут включать искаженные имена символов, которые можно обойти с помощью rustfilt :
cargo install rustfilt
После запуска тестов с этой настройкой должно быть одно или несколько.profraw
файлы. Если их несколько, их можно объединить с:
$ llvm-profdata merge -sparse default_*.profraw -o your_crate.profdata
Затем информацию о покрытии можно отобразить с помощью llvm-cov , например, как описано в rustc docsэтом разделе (замените имена ваших ящиков и тестовых двоичных файлов).
Могут возникнуть проблемы, если версии LLVM rustc и llvm-profdata соответственно. llvm-cov не совпадают, как указано здесь .
Этот ответ основан на этом разделе книги rustc , который предлагает гораздо больше информации о покрытии кода.
Вы можете создать освещение для своего проекта на основе источников:
Включить профиль покрытия в
Cargo.toml
:... [build] profiler = true ...
Установить деманглер
cargo install rustfilt
Добавить покрытие инструмента
export RUSTFLAGS="-C instrument-coverage=all"
Установить зависимости
openssl-devel
,libssl-devel
,llvm
, иgenhtml
, в зависимости от вашей ОСУстановите grcov Mozilla и свяжите профилировщик с компилятором Rust.
cargo install grcov rustup component add llvm-tools-preview
Запуск тестов
cargo test --verbose
Генерация информации о покрытии кода
grcov . -s . --binary-path ./target/debug/ -t lcov --branch --ignore-not-existing -o ./target/debug/
Создать отчет HTML на основе данных о покрытии
genhtml -o ./target/debug/coverage/ --show-details --highlight --ignore-errors source --legend ./target/debug/lcov
И, наконец, просмотрите HTML-отчет по адресу./target/debug/coverage/index.html
В ответах Мори и Саураба довольно подробно описано, как настроить Rusc для обеспечения покрытия кода на основе инструментирования .
Теперь можно гораздо проще воспользоваться преимуществами инструментального охвата. Cargo-llvm-cov может сделать это с помощью одной команды:
cargo llvm-cov
Обратите внимание, что по состоянию на
0.5.37
, у него нет покрытия филиалов (см. https://github.com/taiki-e/cargo-llvm-cov/issues/8) или стабильной поддержки тестов документации (см. https://github.com/taiki-e/cargo-llvm-cov/issues/2).
Аналогичным образом, брезент, упомянутый в ответе Джима, был обновлен для использования инструментов llvm от Rusc. По умолчанию это используется только в macOS и Windows. В Linux его можно включить с помощью
cargo tarpaulin --engine llvm