我在src目录下有一个生产代码的机箱,在tests目录下有一个集成测试。我想在运行集成测试时初始化一个全局记录器(例如env_logger::init().unwrap();)。有几个测试,但测试顺序未定义,因此我不知道应该在哪个测试中放置初始化命令。有没有什么方法可以很好地完成这个任务?也许可以通过覆盖testsmain函数?
src
tests
env_logger::init().unwrap();
main
g6ll5ycj1#
您可以使用类似于以下的代码:
use std::sync::Once; static INIT: Once = Once::new(); /// Setup function that is only run once, even if called multiple times. fn setup() { INIT.call_once(|| { env_logger::init().unwrap(); }); }
然后在每次测试开始时简单地调用setup()。最初基于this blogpost。
setup()
hrirmatl2#
最新的文档中有一个关于在测试中捕获日志的建议:环境记录器:默认情况下,测试工具不会捕获在货物测试期间记录的记录。可以在单元测试中使用Builder::is_test方法,以确保捕获日志:
# [cfg(test)] mod tests { fn init() { let _ = env_logger::builder().is_test(true).try_init(); } #[test] fn it_works() { init(); info!("This record will be captured by `cargo test`"); assert_eq!(3, 1 + 2); } }
siotufzp3#
现在,你可以在每次测试开始时重新初始化记录器,忽略错误。这不是一个很好的解决方案,但它是有效的,而且非常安全。
let _ = env_logger::init(); // your test code...
8iwquhpp4#
除了Danilo Bargen的评论之外,你还可以用更短的形式来写:
use std::sync::Once; static INIT: Once = Once::new(); fn setup() { INIT.call_once(env_logger::init); }
4条答案
按热度按时间g6ll5ycj1#
您可以使用类似于以下的代码:
然后在每次测试开始时简单地调用
setup()
。最初基于this blogpost。
hrirmatl2#
最新的文档中有一个关于在测试中捕获日志的建议:环境记录器:
默认情况下,测试工具不会捕获在货物测试期间记录的记录。可以在单元测试中使用Builder::is_test方法,以确保捕获日志:
siotufzp3#
现在,你可以在每次测试开始时重新初始化记录器,忽略错误。这不是一个很好的解决方案,但它是有效的,而且非常安全。
8iwquhpp4#
除了Danilo Bargen的评论之外,你还可以用更短的形式来写: