#覆盖率 #gcov # #解析器 #记录 #数据 #tracefile

lcov

使用纯 Rust 编写的 LCOV tracefile 解析器/合并器/过滤器

14 个版本 (7 个破坏性更新)

0.8.1 2022年7月18日
0.7.2 2022年6月26日
0.7.0 2021年9月26日
0.6.0 2020年7月28日
0.4.0 2018年2月18日

#394解析器实现

Download history 144/week @ 2024-03-14 154/week @ 2024-03-21 225/week @ 2024-03-28 251/week @ 2024-04-04 357/week @ 2024-04-11 206/week @ 2024-04-18 560/week @ 2024-04-25 447/week @ 2024-05-02 615/week @ 2024-05-09 346/week @ 2024-05-16 303/week @ 2024-05-23 465/week @ 2024-05-30 1056/week @ 2024-06-06 1036/week @ 2024-06-13 1758/week @ 2024-06-20 1308/week @ 2024-06-27

每月5,263 次下载
用于 5 crates

MIT/Apache 协议

78KB
1.5K SLoC

lcov

maintenance status: passively-maintained license crates.io docs.rs rust 1.56.1+ badge Rust CI codecov

LCOV tracefile 解析器/合并器/过滤器,纯 Rust 实现。

LCOV 是一个覆盖测试工具 gcov 的图形前端。它收集多个源文件的 gcov 数据,并将它们存储到名为 "tracefile" 的文件中。

该 crate 的目的是比 原始的 LCOV Perl 实现 更快地操作 LCOV tracefile。

用法

将此内容添加到您的 Cargo.toml

[dependencies]
lcov = "0.8.1"

性能

查看 lcov-util 的 README

数据结构

在这个 crate 中,对应于 LCOV tracefile 每一行的数据结构称为 "LCOV record",表示为 Record。LCOV tracefile 的每一行由表示记录类型的字符串、一个冒号和一个逗号分隔的字段列表组成。

<KIND>:<field#0>,<field#1>,...<field#N>

LCOV record 类型表示为 RecordRecordKind 的变体。LCOV record 的每个字段都表示为 Record 的类似结构的变体的字段。

有关 LCOV tracefile 语法的详细信息,请参阅 geninfo 的手册页

示例

解析 LCOV tracefile

use lcov::{Record, RecordKind, Reader};

// `Reader` is an iterator that iterates over `Result<lcov::Record, E>` read from the input buffer.
let mut reader = Reader::open_file("tests/fixtures/report.info")?;

// Collect the read records into a vector.
let records = reader.collect::<Result<Vec<_>, _>>()?;
assert_eq!(records[0], Record::TestName { name: "".into() });
assert_eq!(records[1].kind(), RecordKind::SourceFile);

// Outputs the read records in LCOV tracefile format.
for record in records {
    println!("{}", record);
}

String 创建 LCOV 报告

use lcov::{Reader, Record};

let input = "\
TN:test_name
SF:/path/to/source/file.rs
DA:1,2
DA:3,0
DA:5,6
LF:3
LH:2
end_of_record
";

// `&[u8]` implements `BufRead`, so you can pass it as an argument to `Reader::new`.
let mut reader = Reader::new(input.as_bytes());

let records = reader.collect::<Result<Vec<_>, _>>()?;
assert_eq!(records[0], Record::TestName { name: "test_name".into() });
assert_eq!(records[1], Record::SourceFile { path: "/path/to/source/file.rs".into() });

// Creates an `String` in tracefile format. In this example, it is the same as `input`.
let output = records.into_iter().map(|rec| format!("{}\n", rec)).collect::<String>();
assert_eq!(input, output);

合并 tracefiles

use lcov::{Record, RecordKind, Report};

// Creates an empty `Report`.
let mut report = Report::new();

// Merges a first file.
report.merge(Report::from_file("tests/fixtures/report.init.info")?)?;

// Merges a second file.
report.merge(Report::from_file("tests/fixtures/report.run.info")?)?;

// Outputs the merge result in LCOV tracefile format.
for record in report.into_records() {
    println!("{}", record);
}

最低支持的 Rust 版本 (MSRV)

最低支持的 Rust 版本是 Rust 1.56.1。在任何时候都至少支持最后 3 个稳定 Rust 版本。

当 crate 处于预发布状态(0.x.x)时,它可能在补丁版本中提升 MSRV。一旦 crate 达到 1.x,任何 MSRV 升级都将伴随着新的次版本号。

许可证

该项目受以下任一协议的许可:

由您选择。

贡献

除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交给lcov的任何贡献,将按照上述方式双许可,不附加任何额外条款或条件。

依赖关系

~300–770KB
~18K SLoC