#log-messages #capture #warn

caplog

捕获日志消息进行测试

1个不稳定版本

0.2.0 2021年7月7日
0.1.0 2021年6月1日

#9#warn

MIT/Apache

22KB
380

caplog

一个提供测试日志捕获功能的Rust库。

此crate主要适用于与log crate一起使用,然而也欢迎其他日志功能。

用法

use log::warn;

#[test]
fn test_scramble_message() {
   let handle = caplog::get_handle();
   warn!("scrambled eggs");
   assert!(handle.any_msg_contains("scrambled eggs"));
}

lib.rs:

用于捕获和验证日志消息的工具。旨在用于应用程序和库的测试。

pytest中同名.fixture的启发。

使用Caplog

最感兴趣的函数是 get_handleCaplogHandle::iter。在测试顶部使用 get_handle 以获取正在记录的消息的视图。之后,在测试的任何位置对句柄调用 .iter 以获取一个 Iterator<Record>。然后可以使用此迭代器查看日志消息。

use caplog::get_handle;

let handle = caplog::get_handle();
warn!("terrible thing happened!");
assert!(handle.iter().any(|rec| rec.msg.contains("terrible")));

句柄对日志的视图

每个句柄都可以访问在其存活期间发送的所有消息。这意味着在它创建之前发送的消息将无法通过 iter 或其上的任何其他函数获取。因此,建议在测试顶部调用 get_handle 以确保消息在作用域内。

线程问题

由于 log 接口是全局的,因此其他线程的消息可能通过句柄可见。因此,建议在可能的情况下检查测试的独特消息。例如


fn handle_request(id: u32) -> Result<(), ()> {
   info!("Got request from client {}", id);
   Ok(())
}

let handle = caplog::get_handle();
let client_id = 12345; // id unique to this test
handle_request(client_id).unwrap();
handle.any_msg_contains(&format!("Got request from client {}", client_id));

由于 info! 和其他 log 宏是阻塞的,因此可以保证消息将在返回之前对调用它的同一线程可见。

与其他日志处理器的交互

log 的接口一次只允许一个日志处理器。为了避免与常规处理器冲突,建议将其初始化代码放在 main 函数内部,或者在其上添加一个 [cfg(not(test))] 属性。

依赖项

~97KB