Как я могу получить страховое покрытие для проверки груза?

Когда я хочу протестировать покрытие 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
Другие вопросы по тегам