When I want to test C++ coverage, I can build my program with -fprofile-arcs -ftest-coverage
, run all tests, and run gcov
to get coverages.
However, when it comes to Rust, I get totally lost. What I want to do is run the following tests(on my Mac), and get coverage of all Rust codes in path 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
From this post, it says firstly run cargo test --no-run
, then run kcov
. However, when I actually do that, kcov blocks forever.
Then I find something called cargo kcov
, who provides --test
. However when I run cargo kcov --test failpoints cases::test_normal
like what I do in cargo test
, I get error
error: cargo subcommand failure
note: cargo test exited with code exit status: 101
error: no test target named `failpoints`
I have tried many ways to figure this out, however, none of them works, so I wonder if I can get some help here.
I know there are other coverage tools like tarpaulin
and grcov
, I am currently trying those. It is also acceptable if there are neat solutions with those coverage tools. However, I still want to know what is wrong with kcov
and cargo-kcov
.
The answers from Mori and from Saurabh describe in some detail how to configure rustc to provide instrumentation-based code coverage.
It is now possible to benefit from instrumentation-based coverage much more simply. cargo-llvm-cov can do this in a single command:
Note that as of
0.5.37
, it does not have branch coverage (see https://github.com/taiki-e/cargo-llvm-cov/issues/8) or stable support for doc tests (see https://github.com/taiki-e/cargo-llvm-cov/issues/2).Likewise, tarpaulin mentioned in the answer from Jim has been updated to use rustc's llvm instrumentation. By default, this is only used on macOS and Windows. On Linux it can be enabled with