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