#tracing #assertions #predicate

tracing-capture

捕获跟踪范围和事件,例如用于测试

2 个不稳定版本

0.2.0-beta.12024年3月3日
0.1.0 2022年12月9日

#82 in 测试

Download history 1167/week @ 2024-03-14 2117/week @ 2024-03-21 2347/week @ 2024-03-28 2834/week @ 2024-04-04 2058/week @ 2024-04-11 1633/week @ 2024-04-18 1337/week @ 2024-04-25 1634/week @ 2024-05-02 1714/week @ 2024-05-09 1771/week @ 2024-05-16 1667/week @ 2024-05-23 1923/week @ 2024-05-30 2095/week @ 2024-06-06 2190/week @ 2024-06-13 2284/week @ 2024-06-20 1728/week @ 2024-06-27

8,648 每月下载次数
用于 2 crates

MIT/Apache

165KB
3K SLoC

捕获跟踪范围和事件

Build Status License: MIT OR Apache-2.0 rust 1.70+ required

文档: Docs.rs crate 文档 (main)

此 crate 提供了一个 tracing Layer,用于捕获跟踪范围和事件。捕获的范围和事件可以用于测试断言(例如,“是否发生了具有特定名称/目标/…的范围?它的字段是什么?范围是否已关闭?范围进入的次数?”等等)。

该 crate 支持对捕获数据的简单断言,以及基于 predicates 的更流畅的断言。

使用方法

将此添加到您的 Crate.toml

[dependencies]
tracing-capture = "0.2.0-beta.1"

捕获范围进行测试断言

use tracing::Level;
use tracing_subscriber::layer::SubscriberExt;
use tracing_capture::{CaptureLayer, SharedStorage};

let subscriber = tracing_subscriber::fmt()
    .pretty()
    .with_max_level(Level::INFO)
    .finish();
// Add the capturing layer.
let storage = SharedStorage::default();
let subscriber = subscriber.with(CaptureLayer::new(&storage));

// Capture tracing information.
tracing::subscriber::with_default(subscriber, || {
    tracing::info_span!("test", num = 42_i64).in_scope(|| {
        tracing::warn!("I feel disturbance in the Force...");
    });
});

// Inspect the only captured span.
let storage = storage.lock();
assert_eq!(storage.all_spans().len(), 1);
let span = storage.all_spans().next().unwrap();
assert_eq!(span["num"], 42_i64);
assert_eq!(span.stats().entered, 1);
assert!(span.stats().is_closed);

基于谓词的断言

use predicates::str::contains;
use tracing::Level;
use tracing_subscriber::{layer::SubscriberExt, Registry};
use tracing_capture::{predicates::*, CaptureLayer, SharedStorage};

let storage = SharedStorage::default();
let subscriber = Registry::default().with(CaptureLayer::new(&storage));
tracing::subscriber::with_default(subscriber, || {
    tracing::info_span!("test_spans").in_scope(|| {
        tracing::warn!(result = 42_i64, "computed");
    });
});

let storage = storage.lock();
let predicate = level(Level::WARN)
    & message(contains("compute"))
    & field("result", 42_i64);
// Checks that there is a single event satisfying `predicate`.
storage.scan_events().single(&predicate);
// ...and that none of spans satisfy similar predicate.
storage.scan_spans().none(&level(Level::WARN));

替代方案/类似工具

  • tracing-test 是一个更低级的替代方案。
  • tracing-fluent-assertions 在预期目标上更相似,但在 API 设计上存在显著差异;断言需要在捕获之前声明。

许可证

根据您的选择,在 Apache 许可证,版本 2.0MIT 许可证 下获得许可。

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交给tracing-toolbox的任何贡献,应如上所述进行双重授权,不附加任何其他条款或条件。

依赖项

~1.8–2.5MB
~48K SLoC