rust-covfix
Rustc is known to report an incorrect coverage for some lines (https://stackoverflow.com/questions/32521800/why-does-kcov-calculate-incorrect-code-coverage-statistics-for-rust-programs).
rust-covfix
will read coverage from the file generated by grcov), fix it, then outputs the correct coverage.
Though only lcov
format is supprted at current, Another formats is going to be supported in future releases.
Features
- Compatible with latest stable/beta/nightly Rust compiler
- Windows/OSX/Linux are all supprted
- Lightweight (small dependencies)
- Fast and safe (implemented in Rust language)
rust-covfix
is also available with Rust API (Documentation)- Show summary of coverage difference.
Optional features
Optional features are available with cargo's --features
option. You can specify the features like:
$ cargo install --no-default-features --features "cli lcov"
Feature name | Description | Default? |
---|---|---|
cli | Command Line Interface. This feature is required to build rust-covfix executable. |
yes |
lcov | Make LcovParser available | yes |
noinline | Avoid adding #cfg[inline] attribute on function. |
no |
backtrace | Dump backtrace information on every time the error has occured. | no |
Install
Download the latest release from GitHub Release Page.
You can also install via cargo
command.
$ cargo install rust-covfix
Usage
$ rust-covfix --help
Usage:
rust-covfix [OPTIONS] FILE
Rust coverage fixer
Positional arguments:
file coverage file
Optional arguments:
-h,--help Show this help message and exit
-V,--version display version
-v,--verbose verbose output
-n,--no-fix do not fix coverage
-o,--output FILE output file name (default: stdout)
--root DIR project root directory
--rules STR[,STR..] use specified rules to fix coverages. Valid names are
[close, test, loop, derive]
How is the incorrect line coverage detected
rust_covfix
fixes the coverage information using some rules. You can pass --rules
option to specify which rules are used to fix coverages.
Rules
close
closing brackets, line of else
block will be ignored.
if a > 0 else ; // <-- marked as "not executable"
test
module block named test
or tests
which has attribute cfg(test)
will be ignored
loop
Fix rust internal bugs that loop branches are not correctly passed.
for i in 0..10
derive
structs with derive(...)
attribute will be ignored
// <-- removed from coverage
// <-- removed from coverage
comment
ignore coverage based on comment marker
Roadmap
- Support
cobertura.xml
file. (WIP) - Add option for uploading the correct coverages to coveralls.
- Use syntax tree generated using syn crate.
- Performance improvement
Author
👤 Kogia-sima
- Twitter: @Kogia_sima
- Github: @Kogia-sima
🤝 Contributing
Contributions, issues and feature requests are welcome!
Feel free to check issues page.
Show your support
Give a ⭐️ if this project helped you!
📝 License
Copyright © 2019 Kogia-sima.
This project is MIT licensed.
This README was generated with ❤️ by readme-md-generator