1个不稳定版本
| 0.2.0 | 2021年7月7日 |
|---|---|
| 0.1.0 |
|
#9 在 #warn
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_handle 和 CaplogHandle::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